diff --git a/README.md b/README.md index f0da253..61fe5f4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ # WanAndroid ## 介绍 -- 鸿洋玩Android的APP,准备编写不同的架构版本,每一个分支代表一个版本,目前已开发完单一MVVM版、MVVM+组件化和compose...已在路上 -MVVM版:使用kotlin+协程+liveData+viewModel+dataBinding构造的MVVM架构的单体项目 +- 鸿洋玩Android的APP,准备编写不同的架构版本,每一个分支代表一个版本,目前已开发完单一MVVM版、MVVM+组件化版 + +- MVVM版:使用kotlin+协程+liveData+viewModel+dataBinding构造的MVVM架构的单体项目 +- MVVM+组件化版:将MVVM版进行组件划分 +- compose版:基于Compose实现,(Compose+ViewModel+Flow+Navigation+Material3),完全适配暗黑模式 + +- Flutter、uniApp后续都会进行改造 ## 功能展示 - 首页Tab @@ -14,7 +19,8 @@ MVVM版:使用kotlin+协程+liveData+viewModel+dataBinding构造的MVVM架构 - 搜索,包含热搜和搜索历史 ## APK下载 -- https://raw.githubusercontent.com/BTPJ/WanAndroid/MVVM/app/release/WanAndroid_V1.5.apk +- https://raw.githubusercontent.com/Toping123/WanAndroid/MVVM/app/release/WanAndroid_V1.5.apk +- Compose:https://raw.githubusercontent.com/Toping123/WanAndroid/Compose/app/release/WanAndroid_V1.0.apk ## 开源库 - 图片处理:Glide @@ -28,9 +34,10 @@ MVVM版:使用kotlin+协程+liveData+viewModel+dataBinding构造的MVVM架构 - bugly应用升级与错误上传 ## 项目地址 -- [Github](https://github.com/BTPJ/WanAndroid/tree/MVVM) -- [Gitee](https://gitee.com/BTPJ_git/WanAndroid/tree/MVVM) +- [Github MVVM分支](https://github.com/Toping123/WanAndroid/tree/MVVM) +- [Github Component分支](https://github.com/Toping123/WanAndroid/tree/Component) +- [Github Compose分支](https://github.com/Toping123/WanAndroid/tree/Compose) ## 致谢 -- WanAndroid网站提供的开放Api, 和里面的一些优秀开源项目和文章 -- 参考鸡哥的些许样式和代码:https://github.com/hegaojian/JetpackMvvm +- WanAndroid网站提供的开放API, 和里面的一些优秀开源项目和文章 +- 参考[鸡哥](https://github.com/hegaojian/JetpackMvvm.git)的些许样式和代码 diff --git a/app/build.gradle b/app/build.gradle index d7755a6..87094e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,10 +1,13 @@ plugins { id 'com.android.application' - id 'org.jetbrains.kotlin.android' + id 'kotlin-android' + id 'kotlin-kapt' id 'kotlin-parcelize' } android { + namespace 'com.btpj.wanandroid' + compileSdk rootProject.ext.android.compileSdk defaultConfig { @@ -18,11 +21,18 @@ android { // 设置支持的SO库架构,以微信为基准只支持arm64-v8a即可,可以达到缩包的目的 abiFilters 'arm64-v8a'//, 'armeabi'//, 'armeabi-v7a', 'x86', 'x86_64' } + resConfigs 'zh-rCN' // 只保留汉语资源 - resConfigs('zh-rCN') testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + // ARouter配置 + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } } // 调试版设置统一的Key,多人开发时更方便, @@ -62,12 +72,13 @@ android { } } } + compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = JavaVersion.VERSION_17 } buildFeatures { dataBinding true @@ -75,15 +86,14 @@ android { } dependencies { - implementation project(path: ':lib_base') - - // 轮播图 https://github.com/youth5201314/banner - implementation rootProject.ext.dependencies.banner - implementation rootProject.ext.dependencies.agentWeb - implementation rootProject.ext.dependencies.flexbox - implementation rootProject.ext.dependencies.AndroidAutoSize - implementation rootProject.ext.dependencies.bugly_update - implementation rootProject.ext.dependencies.bugly_nativecrashreport - // 使用debugImplementation只在调试时引入 - debugImplementation rootProject.ext.dependencies.leakcanary + implementation project(path: ':lib_common') + if (!rootProject.ext.isBuildModule) { + implementation project(path: ':module_main') + implementation project(path: ':module_home') + implementation project(path: ':module_project') + implementation project(path: ':module_square') + implementation project(path: ':module_wechat') + implementation project(path: ':module_mine') + implementation project(path: ':module_web') + } } \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 70ddb6f..47a2682 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -145,4 +145,35 @@ public (android.view.View); # bugly混淆 -dontwarn com.tencent.bugly.** --keep public class com.tencent.bugly.**{*;} \ No newline at end of file +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现 +# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response + diff --git a/app/release/WanAndroid_V1.0.apk b/app/release/WanAndroid_V1.0.apk new file mode 100644 index 0000000..4d821bd Binary files /dev/null and b/app/release/WanAndroid_V1.0.apk differ diff --git a/app/release/WanAndroid_V1.5.apk b/app/release/WanAndroid_V1.5.apk deleted file mode 100644 index 449aa3e..0000000 Binary files a/app/release/WanAndroid_V1.5.apk and /dev/null differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 6c2b8bd..1ea501f 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,9 +11,9 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 5, - "versionName": "1.5", - "outputFile": "WanAndroid_V1.5.apk" + "versionCode": 1, + "versionName": "1.0", + "outputFile": "WanAndroid_V1.0.apk" } ], "elementType": "File" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8f0eed2..126a69e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,10 +1,9 @@ + xmlns:tools="http://schemas.android.com/tools"> - - - - - - - - - - - - - - - - - - - - - (contentViewResId: Int) : - BaseVMBActivity(contentViewResId) { - - override fun createObserve() { - super.createObserve() - mViewModel.errorResponse.observe(this) { - if (it?.errorCode == -1001) { - // 需要登录,这里主要是针对收藏操作,不想每个地方都判断一下 - // 当然你也可以封装一个收藏的组件,在里面统一判断跳转 - LoginActivity.launch(this) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/base/BaseFragment.kt b/app/src/main/java/com/btpj/wanandroid/base/BaseFragment.kt deleted file mode 100644 index f55076a..0000000 --- a/app/src/main/java/com/btpj/wanandroid/base/BaseFragment.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.btpj.wanandroid.base - -import androidx.databinding.ViewDataBinding -import com.btpj.lib_base.base.BaseVMBFragment -import com.btpj.lib_base.base.BaseViewModel -import com.btpj.wanandroid.ui.login.LoginActivity - -/** - * 继承自BaseVMBFragment - * 在这里只做了统一处理跳转登录页面的逻辑 - * - * @author LTP 2021/11/23 - */ -abstract class BaseFragment(contentViewResId: Int) : - BaseVMBFragment(contentViewResId) { - - override fun createObserve() { - super.createObserve() - mViewModel.errorResponse.observe(viewLifecycleOwner) { - if (it?.errorCode == -1001) { // 需要登录 - LoginActivity.launch(requireContext()) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/data/DataRepository.kt b/app/src/main/java/com/btpj/wanandroid/data/DataRepository.kt deleted file mode 100644 index ac24e0e..0000000 --- a/app/src/main/java/com/btpj/wanandroid/data/DataRepository.kt +++ /dev/null @@ -1,165 +0,0 @@ -package com.btpj.wanandroid.data - -import com.btpj.lib_base.data.bean.ApiResponse -import com.btpj.lib_base.data.bean.PageResponse -import com.btpj.lib_base.http.BaseRepository -import com.btpj.lib_base.http.RetrofitManager -import com.btpj.wanandroid.data.bean.* -import com.btpj.wanandroid.data.http.Api -import retrofit2.http.Path -import retrofit2.http.Query - -/** - * 数据仓库 - * - * @author LTP 2022/3/23 - */ -object DataRepository : BaseRepository(), Api { - - private val service by lazy { RetrofitManager.getService(Api::class.java) } - - override suspend fun login(username: String, pwd: String): ApiResponse { - return apiCall { service.login(username, pwd) } - } - - override suspend fun register( - username: String, - pwd: String, - pwdSure: String - ): ApiResponse { - return apiCall { service.register(username, pwd, pwdSure) } - } - - override suspend fun getBanner(): ApiResponse> { - return apiCall { service.getBanner() } - } - - override suspend fun getArticleTopList(): ApiResponse> { - return apiCall { service.getArticleTopList() } - } - - override suspend fun getArticlePageList( - pageNo: Int, - pageSize: Int - ): ApiResponse> { - return apiCall { service.getArticlePageList(pageNo, pageSize) } - } - - override suspend fun collectArticle(id: Int): ApiResponse { - return apiCall { service.collectArticle(id) } - } - - override suspend fun unCollectArticle(id: Int): ApiResponse { - return apiCall { service.unCollectArticle(id) } - } - - override suspend fun getProjectTitleList(): ApiResponse> { - return apiCall { service.getProjectTitleList() } - } - - override suspend fun getNewProjectPageList( - pageNo: Int, - pageSize: Int - ): ApiResponse> { - return apiCall { service.getNewProjectPageList(pageNo, pageSize) } - } - - override suspend fun getProjectPageList( - @Path(value = "pageNo") pageNo: Int, - @Query(value = "page_size") pageSize: Int, - @Query(value = "cid") categoryId: Int - ): ApiResponse> { - return apiCall { service.getProjectPageList(pageNo, pageSize, categoryId) } - } - - override suspend fun getSquarePageList( - pageNo: Int, - pageSize: Int - ): ApiResponse> { - return apiCall { service.getSquarePageList(pageNo, pageSize) } - } - - override suspend fun getAskPageList( - pageNo: Int - ): ApiResponse> { - return apiCall { service.getAskPageList(pageNo) } - } - - override suspend fun getTreeList(): ApiResponse> { - return apiCall { service.getTreeList() } - } - - override suspend fun getNavigationList(): ApiResponse> { - return apiCall { service.getNavigationList() } - } - - override suspend fun getAuthorTitleList(): ApiResponse> { - return apiCall { service.getAuthorTitleList() } - } - - override suspend fun getAuthorArticlePageList( - authorId: Int, - pageNo: Int, - pageSize: Int - ): ApiResponse> { - return apiCall { service.getAuthorArticlePageList(authorId, pageNo, pageSize) } - } - - override suspend fun getUserIntegral(): ApiResponse { - return apiCall { service.getUserIntegral() } - } - - override suspend fun getIntegralRankPageList(pageNo: Int): ApiResponse> { - return apiCall { service.getIntegralRankPageList(pageNo) } - } - - override suspend fun getIntegralRecordPageList(pageNo: Int): ApiResponse> { - return apiCall { service.getIntegralRecordPageList(pageNo) } - } - - override suspend fun getCollectArticlePageList(pageNo: Int): ApiResponse> { - return apiCall { service.getCollectArticlePageList(pageNo) } - } - - override suspend fun getCollectUrlList(): ApiResponse> { - return apiCall { service.getCollectUrlList() } - } - - override suspend fun getMyShareArticlePageList(pageNo: Int): ApiResponse { - return apiCall { service.getMyShareArticlePageList(pageNo) } - } - - override suspend fun addArticle(title: String, link: String): ApiResponse { - return apiCall { service.addArticle(title, link) } - } - - override suspend fun deleteShareArticle(id: Int): ApiResponse { - return apiCall { service.deleteShareArticle(id) } - } - - override suspend fun collectUrl(name: String, link: String): ApiResponse { - return apiCall { service.collectUrl(name, link) } - } - - override suspend fun unCollectUrl(id: Int): ApiResponse { - return apiCall { service.unCollectUrl(id) } - } - - override suspend fun getOtherAuthorArticlePageList( - id: Int, - page: Int - ): ApiResponse { - return apiCall { service.getOtherAuthorArticlePageList(id, page) } - } - - override suspend fun getHotSearchList(): ApiResponse> { - return apiCall { service.getHotSearchList() } - } - - override suspend fun getSearchDataByKey( - pageNo: Int, - searchKey: String - ): ApiResponse> { - return apiCall { service.getSearchDataByKey(pageNo, searchKey) } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/data/http/Api.kt b/app/src/main/java/com/btpj/wanandroid/data/http/Api.kt deleted file mode 100644 index e2646c2..0000000 --- a/app/src/main/java/com/btpj/wanandroid/data/http/Api.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.btpj.wanandroid.data.http - -import com.btpj.lib_base.data.bean.ApiResponse -import com.btpj.lib_base.data.bean.PageResponse -import com.btpj.wanandroid.data.bean.* -import retrofit2.http.* - -/** - * Http接口,Retrofit的请求Service - * - * @author LTP 2022/3/21 - */ -interface Api { - - /** 登录 */ - @FormUrlEncoded - @POST("user/login") - suspend fun login( - @Field("username") username: String, - @Field("password") pwd: String - ): ApiResponse - - /** 注册 */ - @FormUrlEncoded - @POST("user/register") - suspend fun register( - @Field("username") username: String, - @Field("password") pwd: String, - @Field("repassword") pwdSure: String - ): ApiResponse - - /** 获取首页banner数据 */ - @GET("banner/json") - suspend fun getBanner(): ApiResponse> - - /** 获取置顶文章集合数据 */ - @GET("article/top/json") - suspend fun getArticleTopList(): ApiResponse> - - /** 获取首页文章数据 */ - @GET("article/list/{pageNo}/json") - suspend fun getArticlePageList( - @Path("pageNo") pageNo: Int, - @Query("page_size") pageSize: Int - ): ApiResponse> - - /** 收藏站内文章 */ - @POST("lg/collect/{id}/json") - suspend fun collectArticle(@Path("id") id: Int): ApiResponse - - /** 取消收藏站内文章 */ - @POST("lg/uncollect_originId/{id}/json") - suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse - - /** 获取项目分类数据 */ - @GET("project/tree/json") - suspend fun getProjectTitleList(): ApiResponse> - - /** 获取最新项目列表分页数据 */ - @GET("article/listproject/{pageNo}/json") - suspend fun getNewProjectPageList( - @Path("pageNo") pageNo: Int, - @Query("page_size") pageSize: Int - ): ApiResponse> - - /** 获取项目列表分页数据 */ - @GET("project/list/{pageNo}/json") - suspend fun getProjectPageList( - @Path("pageNo") pageNo: Int, - @Query("page_size") pageSize: Int, - @Query("cid") categoryId: Int - ): ApiResponse> - - /** 获取广场列表分页数据 */ - @GET("user_article/list/{pageNo}/json") - suspend fun getSquarePageList( - @Path("pageNo") pageNo: Int, - @Query("page_size") pageSize: Int - ): ApiResponse> - - /** 获取每日一问列表分页数据 */ - @GET("wenda/list/{pageNo}/json") - suspend fun getAskPageList(@Path("pageNo") pageNo: Int): ApiResponse> - - /** 获取体系数据 */ - @GET("tree/json") - suspend fun getTreeList(): ApiResponse> - - /** 获取导航数据 */ - @GET("navi/json") - suspend fun getNavigationList(): ApiResponse> - - /** 获取公众号作者列表 */ - @GET("wxarticle/chapters/json") - suspend fun getAuthorTitleList(): ApiResponse> - - /** 获取公众号作者文章分页列表 */ - @GET("wxarticle/list/{authorId}/{pageNo}/json") - suspend fun getAuthorArticlePageList( - @Path("authorId") authorId: Int, - @Path("pageNo") pageNo: Int, - @Query("page_size") pageSize: Int - ): ApiResponse> - - /** 获取个人积分 */ - @GET("lg/coin/userinfo/json") - suspend fun getUserIntegral(): ApiResponse - - /** 获取积分排行列表分页 */ - @GET("coin/rank/{pageNo}/json") - suspend fun getIntegralRankPageList(@Path("pageNo") pageNo: Int): ApiResponse> - - /** 获取积分历史 */ - @GET("lg/coin/list/{pageNo}/json") - suspend fun getIntegralRecordPageList(@Path("pageNo") pageNo: Int): ApiResponse> - - /** 获取收藏文章分页列表 */ - @GET("lg/collect/list/{pageNo}/json") - suspend fun getCollectArticlePageList(@Path("pageNo") pageNo: Int): ApiResponse> - - /** 获取收藏网址列表 */ - @GET("lg/collect/usertools/json") - suspend fun getCollectUrlList(): ApiResponse> - - /** 获取我分享的文章分页列表 */ - @GET("user/lg/private_articles/{pageNo}/json") - suspend fun getMyShareArticlePageList(@Path("pageNo") pageNo: Int): ApiResponse - - /** 添加要分享的文章 */ - @POST("lg/user_article/add/json") - @FormUrlEncoded - suspend fun addArticle( - @Field("title") title: String, - @Field("link") link: String - ): ApiResponse - - /** 删除自己分享的文章 */ - @POST("lg/user_article/delete/{id}/json") - suspend fun deleteShareArticle(@Path("id") id: Int): ApiResponse - - /** 收藏网址 */ - @POST("lg/collect/addtool/json") - suspend fun collectUrl( - @Query("name") name: String, - @Query("link") link: String - ): ApiResponse - - /** 取消收藏站内文章 */ - @POST("lg/collect/deletetool/json") - suspend fun unCollectUrl(@Query("id") id: Int): ApiResponse - - /** 获取其他作者分享的文章分页列表 */ - @GET("user/{id}/share_articles/{page}/json") - suspend fun getOtherAuthorArticlePageList( - @Path("id") id: Int, - @Path("page") page: Int - ): ApiResponse - - /** 获取热门搜索数据 */ - @GET("hotkey/json") - suspend fun getHotSearchList(): ApiResponse> - - /** 根据关键词搜索数据 */ - @POST("article/query/{pageNo}/json") - suspend fun getSearchDataByKey( - @Path("pageNo") pageNo: Int, - @Query("k") searchKey: String - ): ApiResponse> -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ext/ViewExt.kt b/app/src/main/java/com/btpj/wanandroid/ext/ViewExt.kt deleted file mode 100644 index 4d01f32..0000000 --- a/app/src/main/java/com/btpj/wanandroid/ext/ViewExt.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.btpj.wanandroid.ext - -import android.content.Context -import android.view.View -import android.view.ViewGroup -import com.btpj.wanandroid.data.local.UserManager -import com.btpj.wanandroid.ui.login.LoginActivity -import com.google.android.material.bottomnavigation.BottomNavigationView - -/** - * 一些扩展函数 - * @author LTP 2022/4/12 - */ - -/** - * 需要验证登录状态的操作 - * - * @param action 函数参数,已登录状态时的处理 - */ -fun Context.launchCheckLogin(action: (context: Context) -> Unit) { - if (UserManager.isLogin()) { - action.invoke(this) - } else { - LoginActivity.launch(this) - } -} - -/** - * 处理BottomNavigationView中的tab长按出现toast的问题 - * - * @param ids tab项的id集 - */ -fun BottomNavigationView.clearLongClickToast(ids: MutableList) { - val bottomNavigationView: ViewGroup = getChildAt(0) as ViewGroup - for (position in 0 until ids.size) { - bottomNavigationView.getChildAt(position).findViewById(ids[position]) - .setOnLongClickListener { true } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleAdapter.kt b/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleAdapter.kt deleted file mode 100644 index 38af848..0000000 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleAdapter.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.btpj.wanandroid.ui.collect.article - -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.CollectArticle -import com.btpj.wanandroid.databinding.ListItemCollectArticleBinding -import com.btpj.wanandroid.ui.web.WebActivity -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.module.LoadMoreModule -import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder - -/** - * 收藏文章列表的Adapter - * - * @author LTP 2022/3/23 - */ -class CollectArticleAdapter : - BaseQuickAdapter>( - layoutResId = R.layout.list_item_collect_article - ), - LoadMoreModule { - - init { - setAnimationWithDefault(AnimationType.ScaleIn) - } - - override fun convert( - holder: BaseDataBindingHolder, - item: CollectArticle - ) { - holder.dataBinding?.apply { - collectArticle = item - executePendingBindings() - - clItem.setOnClickListener { WebActivity.launch(context, item) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlAdapter.kt b/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlAdapter.kt deleted file mode 100644 index b62c408..0000000 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlAdapter.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.btpj.wanandroid.ui.collect.url - -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.CollectUrl -import com.btpj.wanandroid.databinding.ListItemCollectUrlBinding -import com.btpj.wanandroid.ui.web.WebActivity -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder - -/** - * 收藏网址列表的Adapter - * - * @author LTP 2022/3/23 - */ -class CollectUrlAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_collect_url) { - - init { - setAnimationWithDefault(AnimationType.ScaleIn) - } - - override fun convert(holder: BaseDataBindingHolder, item: CollectUrl) { - holder.dataBinding?.apply { - collectUrl = item - executePendingBindings() - - clItem.setOnClickListener { WebActivity.launch(context, item) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/home/ArticleAdapter.kt b/app/src/main/java/com/btpj/wanandroid/ui/main/home/ArticleAdapter.kt deleted file mode 100644 index 396e6d8..0000000 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/home/ArticleAdapter.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.btpj.wanandroid.ui.main.home - -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.databinding.ListItemArticleBinding -import com.btpj.wanandroid.ui.web.WebActivity -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.module.LoadMoreModule -import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder - -/** - * 文章列表的Adapter - * - * @author LTP 2022/3/23 - */ -class ArticleAdapter : - BaseQuickAdapter>(R.layout.list_item_article), - LoadMoreModule { - - init { - setAnimationWithDefault(AnimationType.ScaleIn) - } - - override fun convert(holder: BaseDataBindingHolder, item: Article) { - holder.dataBinding?.apply { - article = item - executePendingBindings() - - clItem.setOnClickListener { WebActivity.launch(context, item) } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ImageArticleAdapter.kt b/app/src/main/java/com/btpj/wanandroid/ui/main/project/ImageArticleAdapter.kt deleted file mode 100644 index e576948..0000000 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ImageArticleAdapter.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.btpj.wanandroid.ui.main.project - -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.databinding.ListItemArticleImageBinding -import com.btpj.wanandroid.ui.web.WebActivity -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.module.LoadMoreModule -import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder - -/** - * 带图片的文章列表的Adapter - * - * @author LTP 2022/3/23 - */ -class ImageArticleAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_article_image), - LoadMoreModule { - - init { - setAnimationWithDefault(AnimationType.ScaleIn) - } - - override fun convert( - holder: BaseDataBindingHolder, - item: Article - ) { - holder.dataBinding?.apply { - article = item - executePendingBindings() - - clItem.setOnClickListener { WebActivity.launch(context, item) } - } - } -} \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed76147..f2017f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,54 +1,4 @@ + 玩Android - 首页 - 项目 - 广场 - 公众号 - 我的 - - 再按一次退出程序 - 置顶 - - 收藏 - 刷新 - 用浏览器打开 - 我的积分: - 我的收藏 - 我分享的文章 - 开源网站 - 系统设置 - 登录 - 账号 - 密码 - 确认密码 - 用户名 - 去注册 - 基本设置 - 清除缓存 - 退出登录 - 版本 - 作者 - 项目源码 - id:— 排名:— - 积分排行 - 积分规则 - 积分记录 - 分享文章 - 标题 - 文章标题 - 链接 - 分享人 - 分享 - 文章链接 - 热门搜索 - 搜索历史 - 清空 - 搜索 - 输入关键字搜索 - 立即进入 - 注册 - 切换IP - 请输入IP和端口 - 确认 - 历史IP与端口(可选择) \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 107554e..b3c6923 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -34,13 +34,4 @@ 16sp - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index fc2d1ac..2dafbd1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '7.1.3' apply false - id 'com.android.library' version '7.1.3' apply false - id 'org.jetbrains.kotlin.android' version '1.6.20' apply false + id 'com.android.application' version '8.0.2' apply false + id 'com.android.library' version '8.0.2' apply false + id 'org.jetbrains.kotlin.android' version '1.8.0' apply false } apply from: 'config.gradle' diff --git a/config.gradle b/config.gradle index bd0eca9..05c4195 100644 --- a/config.gradle +++ b/config.gradle @@ -1,10 +1,13 @@ ext { + // module是否独立运行 + isBuildModule = false + android = [ - compileSdk : 31, - minSdk : 21, - targetSdk : 31, - versionCode: 5, - versionName: "1.5" + compileSdk : 34, + minSdk : 24, + targetSdk : 34, + versionCode: 1, + versionName: "1.0" ] dependencies = [ @@ -18,8 +21,8 @@ ext { espresso : "androidx.test.espresso:espresso-core:3.4.0", //----------- Jetpack---------------- - viewModelKtx : "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1", - liveDataKtx : "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1", + viewModelKtx : "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0", + liveDataKtx : "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0", activityKtx : "androidx.activity:activity-ktx:1.2.3", //---------------UI相关------------- @@ -28,7 +31,7 @@ ext { // google官方的flex布局 flexbox : 'com.google.android.flexbox:flexbox:3.0.0', // BaseRecyclerViewAdapterHelper - BaseRecyclerViewAdapterHelper: 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7', + BaseRecyclerViewAdapterHelper: 'io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.14', // material风格功能强大的Dialog materialDialogsCore : 'com.afollestad.material-dialogs:core:3.3.0', materialDialogsLifecycle : 'com.afollestad.material-dialogs:lifecycle:3.3.0', @@ -58,6 +61,10 @@ ext { // 应用优化升级 bugly_update : 'com.tencent.bugly:crashreport_upgrade:1.5.23', bugly_nativecrashreport : 'com.tencent.bugly:nativecrashreport:3.7.1', - leakcanary : 'com.squareup.leakcanary:leakcanary-android:2.9.1' + leakcanary : 'com.squareup.leakcanary:leakcanary-android:2.9.1', + + // ARouter路由框架 + arouter_api : 'com.alibaba:arouter-api:1.5.2', + arouter_compiler : 'com.alibaba:arouter-compiler:1.5.2', ] } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index cd0519b..831abc7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8da143d..0fd2211 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Mar 09 10:43:07 CST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/lib_base/src/main/res/values/strings.xml b/lib_base/src/main/res/values/strings.xml deleted file mode 100644 index 8beea1a..0000000 --- a/lib_base/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - 列表为空 - 网络请求错误,请稍后重试 - 网络连接失败,请稍后重试 - 网络请求超时,请稍后重试 - 请求网络中… - \ No newline at end of file diff --git a/lib_base/.gitignore b/lib_common/.gitignore similarity index 100% rename from lib_base/.gitignore rename to lib_common/.gitignore diff --git a/lib_base/build.gradle b/lib_common/build.gradle similarity index 67% rename from lib_base/build.gradle rename to lib_common/build.gradle index e14aa28..ecb0def 100644 --- a/lib_base/build.gradle +++ b/lib_common/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.library' id 'kotlin-android' id 'kotlin-kapt' + id 'kotlin-parcelize' } android { @@ -13,6 +14,13 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" + + // ARouter配置 + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } } buildTypes { @@ -22,15 +30,17 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = JavaVersion.VERSION_17 } buildFeatures { dataBinding true + buildConfig true } + namespace 'com.btpj.lib_base' } dependencies { @@ -53,6 +63,11 @@ dependencies { api rootProject.ext.dependencies.materialDialogsCore api rootProject.ext.dependencies.materialDialogsLifecycle api rootProject.ext.dependencies.materialDialogsbottomsheets + api rootProject.ext.dependencies.AndroidAutoSize + api rootProject.ext.dependencies.agentWeb + // 轮播图 https://github.com/youth5201314/banner + api rootProject.ext.dependencies.banner + api rootProject.ext.dependencies.flexbox // 存储相关 api rootProject.ext.dependencies.mmkv @@ -65,4 +80,14 @@ dependencies { api rootProject.ext.dependencies.converterGson api rootProject.ext.dependencies.loggingInterceptor api rootProject.ext.dependencies.PersistentCookieJar + + // ARouter路由 + api rootProject.ext.dependencies.arouter_api + + // bugly + api rootProject.ext.dependencies.bugly_update + api rootProject.ext.dependencies.bugly_nativecrashreport + + // 使用debugApi只在调试时引入 + debugApi rootProject.ext.dependencies.leakcanary } \ No newline at end of file diff --git a/lib_base/consumer-rules.pro b/lib_common/consumer-rules.pro similarity index 100% rename from lib_base/consumer-rules.pro rename to lib_common/consumer-rules.pro diff --git a/lib_base/proguard-rules.pro b/lib_common/proguard-rules.pro similarity index 81% rename from lib_base/proguard-rules.pro rename to lib_common/proguard-rules.pro index aba0d3f..6c08343 100644 --- a/lib_base/proguard-rules.pro +++ b/lib_common/proguard-rules.pro @@ -115,7 +115,6 @@ # 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 -keep class com.btpj.lib_base.data.bean.** {*;} --keep class com.btpj.wanandroid.data.** {*;} ############### Android开发中一些需要保留的公共部分end ################## @@ -124,10 +123,10 @@ -keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder -keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder -keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { -public void *(android.view.View); +public (android.view.View); } -keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { -public void *(android.view.View); +public (android.view.View); } # Glide混淆 @@ -145,4 +144,31 @@ public void *(android.view.View); # bugly混淆 -dontwarn com.tencent.bugly.** --keep public class com.tencent.bugly.**{*;} \ No newline at end of file +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/lib_base/src/androidTest/java/com/btpj/lib_base/ExampleInstrumentedTest.kt b/lib_common/src/androidTest/java/com/btpj/lib_base/ExampleInstrumentedTest.kt similarity index 100% rename from lib_base/src/androidTest/java/com/btpj/lib_base/ExampleInstrumentedTest.kt rename to lib_common/src/androidTest/java/com/btpj/lib_base/ExampleInstrumentedTest.kt diff --git a/lib_base/src/main/AndroidManifest.xml b/lib_common/src/main/AndroidManifest.xml similarity index 89% rename from lib_base/src/main/AndroidManifest.xml rename to lib_common/src/main/AndroidManifest.xml index 71deb47..49701f9 100644 --- a/lib_base/src/main/AndroidManifest.xml +++ b/lib_common/src/main/AndroidManifest.xml @@ -1,8 +1,9 @@ - + + + \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/adapter/ArticleAdapter.kt b/lib_common/src/main/java/com/btpj/lib_base/adapter/ArticleAdapter.kt new file mode 100644 index 0000000..e95b5dc --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/adapter/ArticleAdapter.kt @@ -0,0 +1,34 @@ +package com.btpj.lib_base.adapter + +import com.btpj.lib_base.R +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.databinding.CommonListItemArticleBinding +import com.btpj.lib_base.export.ModuleWebApi +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder + +/** + * 文章列表的Adapter + * + * @author LTP 2022/3/23 + */ +class ArticleAdapter : + BaseQuickAdapter>(R.layout.common_list_item_article), + LoadMoreModule { + + init { + setAnimationWithDefault(AnimationType.ScaleIn) + } + + override fun convert(holder: BaseDataBindingHolder, item: Article) { + holder.dataBinding?.apply { + article = item + executePendingBindings() + + clItem.setOnClickListener { + ModuleWebApi.navToWebActivity(item) + } + } + } +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/btpj/lib_base/BaseApp.kt b/lib_common/src/main/java/com/btpj/lib_base/base/App.kt similarity index 55% rename from lib_base/src/main/java/com/btpj/lib_base/BaseApp.kt rename to lib_common/src/main/java/com/btpj/lib_base/base/App.kt index af77a45..be8c830 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/BaseApp.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/base/App.kt @@ -1,10 +1,13 @@ -package com.btpj.lib_base +package com.btpj.lib_base.base import android.app.Application import android.content.Context import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewModelStoreOwner +import com.alibaba.android.arouter.launcher.ARouter +import com.btpj.lib_base.BuildConfig +import com.tencent.bugly.Bugly import com.tencent.mmkv.MMKV import kotlin.properties.Delegates @@ -13,26 +16,39 @@ import kotlin.properties.Delegates * * @author LTP 2022/3/21 */ -open class BaseApp : Application(), ViewModelStoreOwner { +class App : Application(), ViewModelStoreOwner { private lateinit var mAppViewModelStore: ViewModelStore private var mFactory: ViewModelProvider.Factory? = null companion object { var appContext: Context by Delegates.notNull() + + lateinit var appViewModel: AppViewModel } override fun onCreate() { super.onCreate() appContext = applicationContext mAppViewModelStore = ViewModelStore() + appViewModel = getAppViewModelProvider()[AppViewModel::class.java] // MMKV初始化 MMKV.initialize(this) + + // bugly初始化 + Bugly.init(applicationContext, "99ff7c64d9", false) + + // ARouter初始化 + if (BuildConfig.DEBUG) { // 这两行必须写在init之前,否则这些配置在init过程中将无效 + ARouter.openLog() // 打印日志 + ARouter.openDebug() // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险) + } + ARouter.init(this) // 尽可能早,推荐在Application中初始化 } /** 获取一个全局的ViewModel */ - fun getAppViewModelProvider(): ViewModelProvider { + private fun getAppViewModelProvider(): ViewModelProvider { return ViewModelProvider(this, getAppFactory()) } diff --git a/app/src/main/java/com/btpj/wanandroid/base/AppViewModel.kt b/lib_common/src/main/java/com/btpj/lib_base/base/AppViewModel.kt similarity index 71% rename from app/src/main/java/com/btpj/wanandroid/base/AppViewModel.kt rename to lib_common/src/main/java/com/btpj/lib_base/base/AppViewModel.kt index a752f17..29396b2 100644 --- a/app/src/main/java/com/btpj/wanandroid/base/AppViewModel.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/base/AppViewModel.kt @@ -1,9 +1,8 @@ -package com.btpj.wanandroid.base +package com.btpj.lib_base.base import androidx.lifecycle.MutableLiveData -import com.btpj.lib_base.base.BaseViewModel -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.data.bean.User +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.data.bean.User /** * App全局ViewModel可直接替代EventBus diff --git a/lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt b/lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt similarity index 91% rename from lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt rename to lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt index 1cff493..f8028f9 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt @@ -7,6 +7,7 @@ import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider import com.btpj.lib_base.BR import com.btpj.lib_base.R +import com.btpj.lib_base.export.ModuleMineApi import com.btpj.lib_base.ext.hideLoading import com.btpj.lib_base.utils.LogUtil import com.btpj.lib_base.utils.StatusBarUtil @@ -100,6 +101,12 @@ abstract class BaseVMBActivity(private it?.errorMsg?.run { ToastUtil.showShort(this@BaseVMBActivity, this) } + + if (it?.errorCode == -1001) { + // 需要登录,这里主要是针对收藏操作,不想每个地方都判断一下 + // 当然你也可以封装一个收藏的组件,在里面统一判断跳转 + ModuleMineApi.navToLoginActivity() + } } } } diff --git a/lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt b/lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt similarity index 91% rename from lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt rename to lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt index a592ca3..08964a1 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider import com.btpj.lib_base.BR import com.btpj.lib_base.R +import com.btpj.lib_base.export.ModuleMineApi import com.btpj.lib_base.ext.hideLoading import com.btpj.lib_base.utils.LogUtil import com.btpj.lib_base.utils.ToastUtil @@ -111,6 +112,12 @@ abstract class BaseVMBFragment(private it?.errorMsg?.run { ToastUtil.showShort(requireContext(), this) } + + if (it?.errorCode == -1001) { + // 需要登录,这里主要是针对收藏操作,不想每个地方都判断一下 + // 当然你也可以封装一个收藏的组件,在里面统一判断跳转 + ModuleMineApi.navToLoginActivity() + } } } } diff --git a/lib_base/src/main/java/com/btpj/lib_base/base/BaseViewModel.kt b/lib_common/src/main/java/com/btpj/lib_base/base/BaseViewModel.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/base/BaseViewModel.kt rename to lib_common/src/main/java/com/btpj/lib_base/base/BaseViewModel.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/data/bean/ApiResponse.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/ApiResponse.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/data/bean/ApiResponse.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/ApiResponse.kt diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Article.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Article.kt similarity index 92% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Article.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Article.kt index 36f2a20..8f5e4b9 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Article.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Article.kt @@ -1,6 +1,7 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable +import com.btpj.lib_base.data.bean.Tag import kotlinx.parcelize.Parcelize /** diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Banner.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Banner.kt similarity index 90% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Banner.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Banner.kt index dad12dd..0af759c 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Banner.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Banner.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Classify.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Classify.kt similarity index 71% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Classify.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Classify.kt index 6bececc..d965f1f 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Classify.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Classify.kt @@ -1,8 +1,11 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class Classify( val author: String, - val children: List, val courseId: Int, val cover: String, val desc: String, @@ -14,4 +17,4 @@ data class Classify( val parentChapterId: Int, val userControlSetTop: Boolean, val visible: Int -) \ No newline at end of file +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/CoinInfo.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CoinInfo.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/data/bean/CoinInfo.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/CoinInfo.kt index f91589c..d192a06 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/CoinInfo.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CoinInfo.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectArticle.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectArticle.kt similarity index 93% rename from app/src/main/java/com/btpj/wanandroid/data/bean/CollectArticle.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectArticle.kt index 2dda3f9..d4d7e91 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectArticle.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectArticle.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectData.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectData.kt similarity index 83% rename from app/src/main/java/com/btpj/wanandroid/data/bean/CollectData.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectData.kt index 48cf6e8..583bad5 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectData.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectData.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean /** * 收藏实体,主要用于全局收藏事件Event diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectUrl.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectUrl.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/data/bean/CollectUrl.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectUrl.kt index d84ed88..3bc41f9 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/CollectUrl.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/CollectUrl.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/HotSearch.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/HotSearch.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/data/bean/HotSearch.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/HotSearch.kt index b1e8a22..38798cf 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/HotSearch.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/HotSearch.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean /** * 热门搜索 diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/IntegralRecord.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/IntegralRecord.kt similarity index 86% rename from app/src/main/java/com/btpj/wanandroid/data/bean/IntegralRecord.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/IntegralRecord.kt index 52648a1..b76844c 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/IntegralRecord.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/IntegralRecord.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean /** * 积分记录 diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/System.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/MySystem.kt similarity index 71% rename from app/src/main/java/com/btpj/wanandroid/data/bean/System.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/MySystem.kt index ccd3c5e..3ed2d4f 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/System.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/MySystem.kt @@ -1,9 +1,13 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize /** * @author LTP 2022/4/7 */ -data class System( +@Parcelize +data class MySystem( val author: String, val children: List, val courseId: Int, @@ -17,5 +21,5 @@ data class System( val parentChapterId: Int, val userControlSetTop: Boolean, val visible: Int -) +):Parcelable diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Navigation.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Navigation.kt similarity index 64% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Navigation.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Navigation.kt index c91548a..a0577ce 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Navigation.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Navigation.kt @@ -1,4 +1,6 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean + +import com.btpj.lib_base.data.bean.Article /** * 导航实体 diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/OtherAuthor.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/OtherAuthor.kt similarity index 63% rename from app/src/main/java/com/btpj/wanandroid/data/bean/OtherAuthor.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/OtherAuthor.kt index 25890ff..776d738 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/OtherAuthor.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/OtherAuthor.kt @@ -1,5 +1,7 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CoinInfo import com.btpj.lib_base.data.bean.PageResponse /** diff --git a/lib_base/src/main/java/com/btpj/lib_base/data/bean/PageResponse.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/PageResponse.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/data/bean/PageResponse.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/PageResponse.kt diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/ProjectTitle.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/ProjectTitle.kt similarity index 91% rename from app/src/main/java/com/btpj/wanandroid/data/bean/ProjectTitle.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/ProjectTitle.kt index 147a4ee..b4ab437 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/ProjectTitle.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/ProjectTitle.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean /** * 项目标题实体 diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Share.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Share.kt similarity index 62% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Share.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Share.kt index 42d4f1d..7ac7771 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Share.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Share.kt @@ -1,6 +1,4 @@ -package com.btpj.wanandroid.data.bean - -import com.btpj.lib_base.data.bean.PageResponse +package com.btpj.lib_base.data.bean /** * 我的分享 diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/Tag.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Tag.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/data/bean/Tag.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/Tag.kt index 6839b78..34cceb9 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/Tag.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/Tag.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/btpj/wanandroid/data/bean/User.kt b/lib_common/src/main/java/com/btpj/lib_base/data/bean/User.kt similarity index 93% rename from app/src/main/java/com/btpj/wanandroid/data/bean/User.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/bean/User.kt index 1ef378d..9d73fc6 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/bean/User.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/bean/User.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.bean +package com.btpj.lib_base.data.bean import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/lib_base/src/main/java/com/btpj/lib_base/data/local/IpManager.kt b/lib_common/src/main/java/com/btpj/lib_base/data/local/IpManager.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/data/local/IpManager.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/local/IpManager.kt diff --git a/app/src/main/java/com/btpj/wanandroid/data/local/UserManager.kt b/lib_common/src/main/java/com/btpj/lib_base/data/local/UserManager.kt similarity index 97% rename from app/src/main/java/com/btpj/wanandroid/data/local/UserManager.kt rename to lib_common/src/main/java/com/btpj/lib_base/data/local/UserManager.kt index edad116..97c1d1e 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/local/UserManager.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/data/local/UserManager.kt @@ -1,6 +1,6 @@ -package com.btpj.wanandroid.data.local +package com.btpj.lib_base.data.local -import com.btpj.wanandroid.data.bean.User +import com.btpj.lib_base.data.bean.User import com.tencent.mmkv.MMKV /** diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleHomeApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleHomeApi.kt new file mode 100644 index 0000000..fc1ab9f --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleHomeApi.kt @@ -0,0 +1,34 @@ +package com.btpj.lib_base.export + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter + +/** + * module_home模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleHomeApi { + + const val ROUTER_HOME_HOME_FRAGMENT = "/home/HomeFragment" + const val ROUTER_HOME_AUTHOR_ACTIVITY = "/home/AuthorActivity" + const val ROUTER_HOME_EXTRA_AUTHOR_ID = "extra_author_id" + + /** + * 获取HomeFragment实例 + * @return HomeFragment实例 + */ + fun getHomeFragment(): Fragment { + return ARouter.getInstance().build(ROUTER_HOME_HOME_FRAGMENT).navigation() as Fragment + } + + /** + * 跳转到作者文章列表页面 + * @param authorId 作者Id + */ + fun navToAuthorActivity(authorId: Int) { + ARouter.getInstance().build(ROUTER_HOME_AUTHOR_ACTIVITY) + .withInt(ROUTER_HOME_EXTRA_AUTHOR_ID, authorId).navigation() + } +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleMineApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleMineApi.kt new file mode 100644 index 0000000..169fe6f --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleMineApi.kt @@ -0,0 +1,35 @@ +package com.btpj.lib_base.export + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter + +/** + * module_mine模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleMineApi { + + const val ROUTER_MINE_MINE_FRAGMENT = "/mine/MineFragment" + const val ROUTER_MINE_LOGIN_ACTIVITY = "/mine/LoginActivity" + const val ROUTER_MINE_ADD_ARTICLE_ACTIVITY = "/mine/AddArticleActivity" + + /** + * 获取HomeFragment实例 + * @return HomeFragment实例 + */ + fun getMineFragment(): Fragment { + return ARouter.getInstance().build(ROUTER_MINE_MINE_FRAGMENT).navigation() as Fragment + } + + /** 跳转到登录页面 */ + fun navToLoginActivity() { + ARouter.getInstance().build(ROUTER_MINE_LOGIN_ACTIVITY).navigation() + } + + /** 跳转到添加文章页面 */ + fun navToAddArticleActivity() { + ARouter.getInstance().build(ROUTER_MINE_ADD_ARTICLE_ACTIVITY).navigation() + } +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleProjectApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleProjectApi.kt new file mode 100644 index 0000000..b536fd5 --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleProjectApi.kt @@ -0,0 +1,23 @@ +package com.btpj.lib_base.export + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter + +/** + * module_project模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleProjectApi { + + const val ROUTER_PROJECT_PROJECT_FRAGMENT = "/project/ProjectFragment" + + /** + * 获取HomeFragment实例 + * @return HomeFragment实例 + */ + fun getProjectFragment(): Fragment { + return ARouter.getInstance().build(ROUTER_PROJECT_PROJECT_FRAGMENT).navigation() as Fragment + } +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleSquareApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleSquareApi.kt new file mode 100644 index 0000000..5d61bd7 --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleSquareApi.kt @@ -0,0 +1,23 @@ +package com.btpj.lib_base.export + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter + +/** + * module_square模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleSquareApi { + + const val ROUTER_SQUARE_SQUARE_FRAGMENT = "/square/SquareFragment" + + /** + * 获取HomeFragment实例 + * @return HomeFragment实例 + */ + fun getSquareFragment(): Fragment { + return ARouter.getInstance().build(ROUTER_SQUARE_SQUARE_FRAGMENT).navigation() as Fragment + } +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWebApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWebApi.kt new file mode 100644 index 0000000..318ada2 --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWebApi.kt @@ -0,0 +1,58 @@ +package com.btpj.lib_base.export + +import com.alibaba.android.arouter.launcher.ARouter +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.data.bean.CollectArticle +import com.btpj.lib_base.data.bean.CollectUrl + +/** + * module_web模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleWebApi { + + const val ROUTER_WEB_WEB_ACTIVITY = "/web/WebActivity" + const val ROUTER_WEB_EXTRA_BANNER = "extra_banner" + const val ROUTER_WEB_EXTRA_ARTICLE = "extra_article" + const val ROUTER_WEB_EXTRA_COLLECT_ARTICLE = "extra_collect_article" + const val ROUTER_WEB_EXTRA_COLLECT_URL = "extra_collect_url" + + /** + * 跳转到web页面 + * @param banner Banner实体 + */ + fun navToWebActivity(banner: Banner) { + ARouter.getInstance().build(ROUTER_WEB_WEB_ACTIVITY) + .withParcelable(ROUTER_WEB_EXTRA_BANNER, banner).navigation() + } + + /** + * 跳转到web页面 + * @param article Article实体 + */ + fun navToWebActivity(article: Article) { + ARouter.getInstance().build(ROUTER_WEB_WEB_ACTIVITY) + .withParcelable(ROUTER_WEB_EXTRA_ARTICLE, article).navigation() + } + + /** + * 跳转到web页面 + * @param collectArticle CollectArticle实体 + */ + fun navToWebActivity(collectArticle: CollectArticle) { + ARouter.getInstance().build(ROUTER_WEB_WEB_ACTIVITY) + .withParcelable(ROUTER_WEB_EXTRA_COLLECT_ARTICLE, collectArticle).navigation() + } + + /** + * 跳转到web页面 + * @param collectUrl CollectUrl实体 + */ + fun navToWebActivity(collectUrl: CollectUrl) { + ARouter.getInstance().build(ROUTER_WEB_WEB_ACTIVITY) + .withParcelable(ROUTER_WEB_EXTRA_COLLECT_URL, collectUrl).navigation() + } +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWechatApi.kt b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWechatApi.kt new file mode 100644 index 0000000..9bbe276 --- /dev/null +++ b/lib_common/src/main/java/com/btpj/lib_base/export/ModuleWechatApi.kt @@ -0,0 +1,23 @@ +package com.btpj.lib_base.export + +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter + +/** + * module_wechat模块对外提供的接口管理类 + * 包括:页面跳转、获取实例等 + * + * @author LTP 2022/5/11 + */ +object ModuleWechatApi { + + const val ROUTER_WECHAT_WECHAT_FRAGMENT = "/wechat/WechatFragment" + + /** + * 获取HomeFragment实例 + * @return HomeFragment实例 + */ + fun getWechatFragment(): Fragment { + return ARouter.getInstance().build(ROUTER_WECHAT_WECHAT_FRAGMENT).navigation() as Fragment + } +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/btpj/lib_base/ext/BaseViewModelExt.kt b/lib_common/src/main/java/com/btpj/lib_base/ext/BaseViewModelExt.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/ext/BaseViewModelExt.kt rename to lib_common/src/main/java/com/btpj/lib_base/ext/BaseViewModelExt.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/ext/BindingViewExt.kt b/lib_common/src/main/java/com/btpj/lib_base/ext/BindingViewExt.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/ext/BindingViewExt.kt rename to lib_common/src/main/java/com/btpj/lib_base/ext/BindingViewExt.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/ext/StringExt.kt b/lib_common/src/main/java/com/btpj/lib_base/ext/StringExt.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/ext/StringExt.kt rename to lib_common/src/main/java/com/btpj/lib_base/ext/StringExt.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/ext/ViewExt.kt b/lib_common/src/main/java/com/btpj/lib_base/ext/ViewExt.kt similarity index 88% rename from lib_base/src/main/java/com/btpj/lib_base/ext/ViewExt.kt rename to lib_common/src/main/java/com/btpj/lib_base/ext/ViewExt.kt index 847980d..fbd551c 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/ext/ViewExt.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/ext/ViewExt.kt @@ -1,6 +1,7 @@ package com.btpj.lib_base.ext import android.annotation.SuppressLint +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,11 +18,45 @@ import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.customview.getCustomView import com.afollestad.materialdialogs.lifecycle.lifecycleOwner import com.btpj.lib_base.R +import com.btpj.lib_base.data.local.UserManager +import com.btpj.lib_base.export.ModuleMineApi import com.btpj.lib_base.utils.ScreenUtil import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CircleCrop import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions +import com.google.android.material.bottomnavigation.BottomNavigationView + +/** + * 一些扩展函数 + * @author LTP 2022/4/12 + */ + +/** + * 需要验证登录状态的操作 + * + * @param action 函数参数,已登录状态时的处理 + */ +fun Context.launchCheckLogin(action: (context: Context) -> Unit) { + if (UserManager.isLogin()) { + action.invoke(this) + } else { + ModuleMineApi.navToLoginActivity() + } +} + +/** + * 处理BottomNavigationView中的tab长按出现toast的问题 + * + * @param ids tab项的id集 + */ +fun BottomNavigationView.clearLongClickToast(ids: MutableList) { + val bottomNavigationView: ViewGroup = getChildAt(0) as ViewGroup + for (position in 0 until ids.size) { + bottomNavigationView.getChildAt(position).findViewById(ids[position]) + .setOnLongClickListener { true } + } +} /** * ImageView利用Glide加载图片 diff --git a/lib_base/src/main/java/com/btpj/lib_base/http/BaseRepository.kt b/lib_common/src/main/java/com/btpj/lib_base/http/BaseRepository.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/http/BaseRepository.kt rename to lib_common/src/main/java/com/btpj/lib_base/http/BaseRepository.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt b/lib_common/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt similarity index 97% rename from lib_base/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt rename to lib_common/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt index 1058c5d..e1f11ed 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt @@ -1,6 +1,6 @@ package com.btpj.lib_base.http -import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.App.Companion.appContext import com.btpj.lib_base.data.local.IpManager import com.btpj.lib_base.http.interceptor.CacheInterceptor import com.btpj.lib_base.http.interceptor.logInterceptor diff --git a/lib_base/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt b/lib_common/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt similarity index 95% rename from lib_base/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt rename to lib_common/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt index 69a6d75..d4133ce 100644 --- a/lib_base/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt +++ b/lib_common/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt @@ -1,6 +1,6 @@ package com.btpj.lib_base.http.interceptor -import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.App.Companion.appContext import com.btpj.lib_base.utils.NetworkUtil import okhttp3.CacheControl import okhttp3.Interceptor diff --git a/lib_base/src/main/java/com/btpj/lib_base/http/interceptor/LogInterceptor.kt b/lib_common/src/main/java/com/btpj/lib_base/http/interceptor/LogInterceptor.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/http/interceptor/LogInterceptor.kt rename to lib_common/src/main/java/com/btpj/lib_base/http/interceptor/LogInterceptor.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/AppUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/AppUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/AppUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/AppUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/CacheUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/CacheUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/CacheUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/CacheUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/CommonUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/CommonUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/CommonUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/CommonUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/DateUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/DateUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/DateUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/DateUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/KeyboardUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/KeyboardUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/KeyboardUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/KeyboardUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/LogUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/LogUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/LogUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/LogUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/NetworkUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/NetworkUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/NetworkUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/NetworkUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/ScreenUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/ScreenUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/ScreenUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/ScreenUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/StatusBarUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/StatusBarUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/StatusBarUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/StatusBarUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/utils/ToastUtil.kt b/lib_common/src/main/java/com/btpj/lib_base/utils/ToastUtil.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/utils/ToastUtil.kt rename to lib_common/src/main/java/com/btpj/lib_base/utils/ToastUtil.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/widgets/FlowLayout.kt b/lib_common/src/main/java/com/btpj/lib_base/widgets/FlowLayout.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/widgets/FlowLayout.kt rename to lib_common/src/main/java/com/btpj/lib_base/widgets/FlowLayout.kt diff --git a/lib_base/src/main/java/com/btpj/lib_base/widgets/TitleLayout.kt b/lib_common/src/main/java/com/btpj/lib_base/widgets/TitleLayout.kt similarity index 100% rename from lib_base/src/main/java/com/btpj/lib_base/widgets/TitleLayout.kt rename to lib_common/src/main/java/com/btpj/lib_base/widgets/TitleLayout.kt diff --git a/app/src/main/res/drawable-xxhdpi/default_project_img.webp b/lib_common/src/main/res/drawable-xxhdpi/default_project_img.webp similarity index 100% rename from app/src/main/res/drawable-xxhdpi/default_project_img.webp rename to lib_common/src/main/res/drawable-xxhdpi/default_project_img.webp diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash.webp b/lib_common/src/main/res/drawable-xxhdpi/ic_splash.webp similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_splash.webp rename to lib_common/src/main/res/drawable-xxhdpi/ic_splash.webp diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash2.webp b/lib_common/src/main/res/drawable-xxhdpi/ic_splash2.webp similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_splash2.webp rename to lib_common/src/main/res/drawable-xxhdpi/ic_splash2.webp diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash3.webp b/lib_common/src/main/res/drawable-xxhdpi/ic_splash3.webp similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_splash3.webp rename to lib_common/src/main/res/drawable-xxhdpi/ic_splash3.webp diff --git a/lib_base/src/main/res/drawable/bg_circle_red.xml b/lib_common/src/main/res/drawable/bg_circle_red.xml similarity index 100% rename from lib_base/src/main/res/drawable/bg_circle_red.xml rename to lib_common/src/main/res/drawable/bg_circle_red.xml diff --git a/app/src/main/res/drawable/frame_green.xml b/lib_common/src/main/res/drawable/frame_green.xml similarity index 100% rename from app/src/main/res/drawable/frame_green.xml rename to lib_common/src/main/res/drawable/frame_green.xml diff --git a/app/src/main/res/drawable/frame_red.xml b/lib_common/src/main/res/drawable/frame_red.xml similarity index 100% rename from app/src/main/res/drawable/frame_red.xml rename to lib_common/src/main/res/drawable/frame_red.xml diff --git a/app/src/main/res/drawable/ic_add.xml b/lib_common/src/main/res/drawable/ic_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_add.xml rename to lib_common/src/main/res/drawable/ic_add.xml diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/lib_common/src/main/res/drawable/ic_arrow_right.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_right.xml rename to lib_common/src/main/res/drawable/ic_arrow_right.xml diff --git a/app/src/main/res/drawable/ic_article.xml b/lib_common/src/main/res/drawable/ic_article.xml similarity index 100% rename from app/src/main/res/drawable/ic_article.xml rename to lib_common/src/main/res/drawable/ic_article.xml diff --git a/lib_base/src/main/res/drawable/ic_back.xml b/lib_common/src/main/res/drawable/ic_back.xml similarity index 100% rename from lib_base/src/main/res/drawable/ic_back.xml rename to lib_common/src/main/res/drawable/ic_back.xml diff --git a/app/src/main/res/drawable/ic_clear.xml b/lib_common/src/main/res/drawable/ic_clear.xml similarity index 100% rename from app/src/main/res/drawable/ic_clear.xml rename to lib_common/src/main/res/drawable/ic_clear.xml diff --git a/app/src/main/res/drawable/ic_collect.xml b/lib_common/src/main/res/drawable/ic_collect.xml similarity index 100% rename from app/src/main/res/drawable/ic_collect.xml rename to lib_common/src/main/res/drawable/ic_collect.xml diff --git a/lib_base/src/main/res/drawable/ic_default_img.xml b/lib_common/src/main/res/drawable/ic_default_img.xml similarity index 100% rename from lib_base/src/main/res/drawable/ic_default_img.xml rename to lib_common/src/main/res/drawable/ic_default_img.xml diff --git a/app/src/main/res/drawable/ic_integral_record.xml b/lib_common/src/main/res/drawable/ic_integral_record.xml similarity index 100% rename from app/src/main/res/drawable/ic_integral_record.xml rename to lib_common/src/main/res/drawable/ic_integral_record.xml diff --git a/app/src/main/res/drawable/ic_integral_rule.xml b/lib_common/src/main/res/drawable/ic_integral_rule.xml similarity index 100% rename from app/src/main/res/drawable/ic_integral_rule.xml rename to lib_common/src/main/res/drawable/ic_integral_rule.xml diff --git a/lib_base/src/main/res/drawable/ic_list_empty.xml b/lib_common/src/main/res/drawable/ic_list_empty.xml similarity index 100% rename from lib_base/src/main/res/drawable/ic_list_empty.xml rename to lib_common/src/main/res/drawable/ic_list_empty.xml diff --git a/app/src/main/res/drawable/ic_points.xml b/lib_common/src/main/res/drawable/ic_points.xml similarity index 100% rename from app/src/main/res/drawable/ic_points.xml rename to lib_common/src/main/res/drawable/ic_points.xml diff --git a/app/src/main/res/drawable/ic_search.xml b/lib_common/src/main/res/drawable/ic_search.xml similarity index 100% rename from app/src/main/res/drawable/ic_search.xml rename to lib_common/src/main/res/drawable/ic_search.xml diff --git a/app/src/main/res/drawable/ic_settings.xml b/lib_common/src/main/res/drawable/ic_settings.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings.xml rename to lib_common/src/main/res/drawable/ic_settings.xml diff --git a/app/src/main/res/drawable/ic_tab_home.xml b/lib_common/src/main/res/drawable/ic_tab_home.xml similarity index 100% rename from app/src/main/res/drawable/ic_tab_home.xml rename to lib_common/src/main/res/drawable/ic_tab_home.xml diff --git a/app/src/main/res/drawable/ic_tab_mine.xml b/lib_common/src/main/res/drawable/ic_tab_mine.xml similarity index 100% rename from app/src/main/res/drawable/ic_tab_mine.xml rename to lib_common/src/main/res/drawable/ic_tab_mine.xml diff --git a/app/src/main/res/drawable/ic_tab_project.xml b/lib_common/src/main/res/drawable/ic_tab_project.xml similarity index 100% rename from app/src/main/res/drawable/ic_tab_project.xml rename to lib_common/src/main/res/drawable/ic_tab_project.xml diff --git a/app/src/main/res/drawable/ic_tab_square.xml b/lib_common/src/main/res/drawable/ic_tab_square.xml similarity index 100% rename from app/src/main/res/drawable/ic_tab_square.xml rename to lib_common/src/main/res/drawable/ic_tab_square.xml diff --git a/app/src/main/res/drawable/ic_tab_wechat.xml b/lib_common/src/main/res/drawable/ic_tab_wechat.xml similarity index 100% rename from app/src/main/res/drawable/ic_tab_wechat.xml rename to lib_common/src/main/res/drawable/ic_tab_wechat.xml diff --git a/app/src/main/res/drawable/ic_un_collect.xml b/lib_common/src/main/res/drawable/ic_un_collect.xml similarity index 100% rename from app/src/main/res/drawable/ic_un_collect.xml rename to lib_common/src/main/res/drawable/ic_un_collect.xml diff --git a/app/src/main/res/drawable/ic_user.xml b/lib_common/src/main/res/drawable/ic_user.xml similarity index 100% rename from app/src/main/res/drawable/ic_user.xml rename to lib_common/src/main/res/drawable/ic_user.xml diff --git a/app/src/main/res/drawable/ic_web.xml b/lib_common/src/main/res/drawable/ic_web.xml similarity index 100% rename from app/src/main/res/drawable/ic_web.xml rename to lib_common/src/main/res/drawable/ic_web.xml diff --git a/app/src/main/res/drawable/selector_bg_tv.xml b/lib_common/src/main/res/drawable/selector_bg_tv.xml similarity index 100% rename from app/src/main/res/drawable/selector_bg_tv.xml rename to lib_common/src/main/res/drawable/selector_bg_tv.xml diff --git a/lib_common/src/main/res/layout/common_container.xml b/lib_common/src/main/res/layout/common_container.xml new file mode 100644 index 0000000..bba425b --- /dev/null +++ b/lib_common/src/main/res/layout/common_container.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_viewpager.xml b/lib_common/src/main/res/layout/common_fragment_viewpager.xml similarity index 96% rename from app/src/main/res/layout/fragment_viewpager.xml rename to lib_common/src/main/res/layout/common_fragment_viewpager.xml index 0dd9a00..f4e8d11 100644 --- a/app/src/main/res/layout/fragment_viewpager.xml +++ b/lib_common/src/main/res/layout/common_fragment_viewpager.xml @@ -16,7 +16,7 @@ android:id="@+id/constraintLayout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.main.project.ProjectFragment"> + tools:context="com.btpj.module_project.ui.project.ProjectFragment"> + type="com.btpj.lib_base.data.bean.Article" /> diff --git a/app/src/main/res/layout/list_item_tv.xml b/lib_common/src/main/res/layout/common_list_item_tv.xml similarity index 100% rename from app/src/main/res/layout/list_item_tv.xml rename to lib_common/src/main/res/layout/common_list_item_tv.xml diff --git a/lib_base/src/main/res/layout/dialog_loading.xml b/lib_common/src/main/res/layout/dialog_loading.xml similarity index 100% rename from lib_base/src/main/res/layout/dialog_loading.xml rename to lib_common/src/main/res/layout/dialog_loading.xml diff --git a/app/src/main/res/layout/include_line.xml b/lib_common/src/main/res/layout/include_line.xml similarity index 100% rename from app/src/main/res/layout/include_line.xml rename to lib_common/src/main/res/layout/include_line.xml diff --git a/app/src/main/res/layout/include_swiperefresh_recyclerview.xml b/lib_common/src/main/res/layout/include_swiperefresh_recyclerview.xml similarity index 100% rename from app/src/main/res/layout/include_swiperefresh_recyclerview.xml rename to lib_common/src/main/res/layout/include_swiperefresh_recyclerview.xml diff --git a/app/src/main/res/layout/include_toolbar.xml b/lib_common/src/main/res/layout/include_toolbar.xml similarity index 100% rename from app/src/main/res/layout/include_toolbar.xml rename to lib_common/src/main/res/layout/include_toolbar.xml diff --git a/lib_base/src/main/res/layout/layout_empty.xml b/lib_common/src/main/res/layout/layout_empty.xml similarity index 100% rename from lib_base/src/main/res/layout/layout_empty.xml rename to lib_common/src/main/res/layout/layout_empty.xml diff --git a/lib_base/src/main/res/layout/layout_title.xml b/lib_common/src/main/res/layout/layout_title.xml similarity index 100% rename from lib_base/src/main/res/layout/layout_title.xml rename to lib_common/src/main/res/layout/layout_title.xml diff --git a/lib_common/src/main/res/values-night/themes.xml b/lib_common/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..82bd055 --- /dev/null +++ b/lib_common/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/lib_base/src/main/res/values/attrs.xml b/lib_common/src/main/res/values/attrs.xml similarity index 100% rename from lib_base/src/main/res/values/attrs.xml rename to lib_common/src/main/res/values/attrs.xml diff --git a/lib_base/src/main/res/values/colors.xml b/lib_common/src/main/res/values/colors.xml similarity index 96% rename from lib_base/src/main/res/values/colors.xml rename to lib_common/src/main/res/values/colors.xml index 0f46bfb..b006380 100644 --- a/lib_base/src/main/res/values/colors.xml +++ b/lib_common/src/main/res/values/colors.xml @@ -6,6 +6,7 @@ #FF03DAC5 #FF018786 #FF000000 + #FFFFFFFF #333333 #3700B3 diff --git a/lib_base/src/main/res/values/dimens.xml b/lib_common/src/main/res/values/dimens.xml similarity index 100% rename from lib_base/src/main/res/values/dimens.xml rename to lib_common/src/main/res/values/dimens.xml diff --git a/lib_common/src/main/res/values/strings.xml b/lib_common/src/main/res/values/strings.xml new file mode 100644 index 0000000..5c1d79a --- /dev/null +++ b/lib_common/src/main/res/values/strings.xml @@ -0,0 +1,62 @@ + + 玩Android + 列表为空 + 网络请求错误,请稍后重试 + 网络连接失败,请稍后重试 + 网络请求超时,请稍后重试 + 请求网络中… + + 首页 + 项目 + 广场 + 公众号 + 我的 + + 再按一次退出程序 + 置顶 + + 收藏 + 刷新 + 用浏览器打开 + 浏览器 + 我的积分: + 我的收藏 + 我分享的文章 + 开源网站 + 系统设置 + + 基本设置 + 清除缓存 + 退出登录 + 版本 + 作者 + 项目源码 + id:— 排名:— + 积分排行 + 积分规则 + 积分记录 + 分享文章 + 标题 + 文章标题 + 链接 + 分享人 + 分享 + 文章链接 + 热门搜索 + 搜索历史 + 清空 + 搜索 + 输入关键字搜索 + 立即进入 + 注册 + 切换IP + 请输入IP和端口 + 确认 + 历史IP与端口(可选择) + 登录 + 账号 + 密码 + 确认密码 + 用户名 + 去注册 + \ No newline at end of file diff --git a/lib_base/src/main/res/values/styles.xml b/lib_common/src/main/res/values/styles.xml similarity index 100% rename from lib_base/src/main/res/values/styles.xml rename to lib_common/src/main/res/values/styles.xml diff --git a/lib_common/src/main/res/values/themes.xml b/lib_common/src/main/res/values/themes.xml new file mode 100644 index 0000000..4d2e2de --- /dev/null +++ b/lib_common/src/main/res/values/themes.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib_base/src/test/java/com/btpj/lib_base/ExampleUnitTest.kt b/lib_common/src/test/java/com/btpj/lib_base/ExampleUnitTest.kt similarity index 100% rename from lib_base/src/test/java/com/btpj/lib_base/ExampleUnitTest.kt rename to lib_common/src/test/java/com/btpj/lib_base/ExampleUnitTest.kt diff --git a/module.build.gradle b/module.build.gradle new file mode 100644 index 0000000..339a50d --- /dev/null +++ b/module.build.gradle @@ -0,0 +1,69 @@ +//-----------------所有module共有的配置-------------- +// 作为组件/APP应用运行 +apply plugin: rootProject.ext.isBuildModule ? 'com.android.application' : 'com.android.library' + +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-parcelize' +apply plugin: 'kotlin-kapt' + +android { + compileSdkVersion rootProject.ext.android.compileSdk + + defaultConfig { + minSdk rootProject.ext.android.minSdk + targetSdk rootProject.ext.android.targetSdk + versionCode rootProject.ext.android.versionCode + versionName rootProject.ext.android.versionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + // ARouter配置 + kapt { + arguments { + arg("AROUTER_MODULE_NAME", project.getName()) + } + } + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + if (rootProject.ext.isBuildModule) { + //独立运行 + manifest.srcFile 'src/main/alone/AndroidManifest.xml' + } else { + //合并到宿主 + manifest.srcFile 'src/main/AndroidManifest.xml' + resources { + //正式版本时,排除alone文件夹下所有调试文件 + exclude 'src/main/alone/*' + } + } + } + } + buildTypes { + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + buildFeatures { + dataBinding true + } +} + +dependencies { + implementation project(path: ':lib_common') + + // kapt无法像api那样穿透(从lib_common带过来),所以不能放在lib_common中,而是放在这里让每个组件都引入一份 + kapt rootProject.ext.dependencies.arouter_compiler +} \ No newline at end of file diff --git a/module_home/.gitignore b/module_home/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_home/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_home/build.gradle b/module_home/build.gradle new file mode 100644 index 0000000..f311000 --- /dev/null +++ b/module_home/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_home' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_home" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "home_" +} \ No newline at end of file diff --git a/module_home/proguard-rules.pro b/module_home/proguard-rules.pro new file mode 100644 index 0000000..099654c --- /dev/null +++ b/module_home/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_home.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_home/src/androidTest/java/com/btpj/module_home/ExampleInstrumentedTest.kt b/module_home/src/androidTest/java/com/btpj/module_home/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..4243d2f --- /dev/null +++ b/module_home/src/androidTest/java/com/btpj/module_home/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_home + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_home", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_home/src/main/AndroidManifest.xml b/module_home/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1615485 --- /dev/null +++ b/module_home/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/module_home/src/main/alone/AndroidManifest.xml b/module_home/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..3c351dc --- /dev/null +++ b/module_home/src/main/alone/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_home/src/main/java/com/btpj/module_home/data/DataRepository.kt b/module_home/src/main/java/com/btpj/module_home/data/DataRepository.kt new file mode 100644 index 0000000..28b4312 --- /dev/null +++ b/module_home/src/main/java/com/btpj/module_home/data/DataRepository.kt @@ -0,0 +1,59 @@ +package com.btpj.module_home.data + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.module_home.data.http.Api +import retrofit2.http.Path +import retrofit2.http.Query + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + override suspend fun getBanner(): ApiResponse> { + return apiCall { service.getBanner() } + } + + override suspend fun getArticleTopList(): ApiResponse> { + return apiCall { service.getArticleTopList() } + } + + override suspend fun getArticlePageList( + pageNo: Int, + pageSize: Int + ): ApiResponse> { + return apiCall { service.getArticlePageList(pageNo, pageSize) } + } + + override suspend fun collectArticle(id: Int): ApiResponse { + return apiCall { service.collectArticle(id) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } + + override suspend fun getOtherAuthorArticlePageList( + id: Int, + page: Int + ): ApiResponse { + return apiCall { service.getOtherAuthorArticlePageList(id, page) } + } + + override suspend fun getHotSearchList(): ApiResponse> { + return apiCall { service.getHotSearchList() } + } + + override suspend fun getSearchDataByKey( + pageNo: Int, + searchKey: String + ): ApiResponse> { + return apiCall { service.getSearchDataByKey(pageNo, searchKey) } + } +} \ No newline at end of file diff --git a/module_home/src/main/java/com/btpj/module_home/data/http/Api.kt b/module_home/src/main/java/com/btpj/module_home/data/http/Api.kt new file mode 100644 index 0000000..a81b91c --- /dev/null +++ b/module_home/src/main/java/com/btpj/module_home/data/http/Api.kt @@ -0,0 +1,53 @@ +package com.btpj.module_home.data.http + +import com.btpj.lib_base.data.bean.* +import retrofit2.http.* + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 获取首页banner数据 */ + @GET("banner/json") + suspend fun getBanner(): ApiResponse> + + /** 获取置顶文章集合数据 */ + @GET("article/top/json") + suspend fun getArticleTopList(): ApiResponse> + + /** 获取首页文章数据 */ + @GET("article/list/{pageNo}/json") + suspend fun getArticlePageList( + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int + ): ApiResponse> + + /** 收藏站内文章 */ + @POST("lg/collect/{id}/json") + suspend fun collectArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse + + /** 获取其他作者分享的文章分页列表 */ + @GET("user/{id}/share_articles/{page}/json") + suspend fun getOtherAuthorArticlePageList( + @Path("id") id: Int, + @Path("page") page: Int + ): ApiResponse + + /** 获取热门搜索数据 */ + @GET("hotkey/json") + suspend fun getHotSearchList(): ApiResponse> + + /** 根据关键词搜索数据 */ + @POST("article/query/{pageNo}/json") + suspend fun getSearchDataByKey( + @Path("pageNo") pageNo: Int, + @Query("k") searchKey: String + ): ApiResponse> +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/data/local/CacheManager.kt b/module_home/src/main/java/com/btpj/module_home/data/local/CacheManager.kt similarity index 71% rename from app/src/main/java/com/btpj/wanandroid/data/local/CacheManager.kt rename to module_home/src/main/java/com/btpj/module_home/data/local/CacheManager.kt index d1f00c3..c93eee7 100644 --- a/app/src/main/java/com/btpj/wanandroid/data/local/CacheManager.kt +++ b/module_home/src/main/java/com/btpj/module_home/data/local/CacheManager.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.data.local +package com.btpj.module_home.data.local import android.text.TextUtils import com.btpj.lib_base.ext.toJson @@ -14,7 +14,6 @@ import com.tencent.mmkv.MMKV object CacheManager { private const val KEY_SEARCH_HISTORY = "search_history" - private const val KEY_FIRST_USE = "first_use" private val mmkv by lazy { MMKV.defaultMMKV() } @@ -31,14 +30,4 @@ object CacheManager { fun saveSearchHistoryData(searchHistoryDeque: ArrayDeque) { mmkv.encode(KEY_SEARCH_HISTORY, searchHistoryDeque.toJson()) } - - /** 存储是否首次使用APP */ - fun saveFirstUse(isFirstUse: Boolean): Boolean { - return mmkv.encode(KEY_FIRST_USE, isFirstUse) - } - - /** 是否首次使用APP */ - fun isFirstUse(): Boolean { - return mmkv.decodeBool(KEY_FIRST_USE, true) - } } \ No newline at end of file diff --git a/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneActivity.kt b/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneActivity.kt new file mode 100644 index 0000000..680cc8b --- /dev/null +++ b/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneActivity.kt @@ -0,0 +1,22 @@ +package com.btpj.module_home.ui.alone + +import android.os.Bundle +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.databinding.CommonContainerBinding +import com.btpj.lib_base.export.ModuleHomeApi + +/** + * 作为Application时的测试页面 + * + * @author LTP 2022/4/8 + */ +class AloneActivity : + BaseVMBActivity(R.layout.common_container) { + + override fun initView(savedInstanceState: Bundle?) { + supportFragmentManager.beginTransaction() + .add(R.id.fl_container, ModuleHomeApi.getHomeFragment()) + .commit() + } +} \ No newline at end of file diff --git a/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneViewModel.kt b/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneViewModel.kt new file mode 100644 index 0000000..b8ba5bc --- /dev/null +++ b/module_home/src/main/java/com/btpj/module_home/ui/alone/AloneViewModel.kt @@ -0,0 +1,10 @@ +package com.btpj.module_home.ui.alone + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author LTP 2022/3/9 + */ +class AloneViewModel : BaseViewModel() { + override fun start() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/author/AuthorActivity.kt b/module_home/src/main/java/com/btpj/module_home/ui/author/AuthorActivity.kt similarity index 81% rename from app/src/main/java/com/btpj/wanandroid/ui/author/AuthorActivity.kt rename to module_home/src/main/java/com/btpj/module_home/ui/author/AuthorActivity.kt index d7ae014..e1c8c49 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/author/AuthorActivity.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/author/AuthorActivity.kt @@ -1,54 +1,44 @@ -package com.btpj.wanandroid.ui.author +package com.btpj.module_home.ui.author import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Autowired +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.adapter.ArticleAdapter +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.initClose import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.ActivityAuthorBinding -import com.btpj.wanandroid.ui.main.home.ArticleAdapter +import com.btpj.module_home.R +import com.btpj.module_home.databinding.HomeActivityAuthorBinding /** * 其他作者的文章列表 * * @author LTP 2022/4/18 */ +@Route(path = ModuleHomeApi.ROUTER_HOME_AUTHOR_ACTIVITY) class AuthorActivity : - BaseActivity(R.layout.activity_author) { + BaseVMBActivity(R.layout.home_activity_author) { /** 作者Id */ - private var mAuthorId = 0 + @Autowired(name = ModuleHomeApi.ROUTER_HOME_EXTRA_AUTHOR_ID) + @JvmField + var mAuthorId = 0 /** 页数 */ private var mPageNo: Int = 0 private val mAdapter by lazy { ArticleAdapter() } - companion object { - private const val EXTRA_AUTHOR_ID: String = "authorId" - - /** - * 页面启动 - * @param context Context - * @param authorId 作者Id - */ - fun launch(context: Context, authorId: Int) { - context.startActivity(Intent(context, AuthorActivity::class.java).apply { - putExtra(EXTRA_AUTHOR_ID, authorId) - }) - } - } - override fun initView(savedInstanceState: Bundle?) { - mAuthorId = intent.getIntExtra(EXTRA_AUTHOR_ID, 0) + ARouter.getInstance().inject(this) mBinding.apply { toolbar.initClose { onBackPressed() } @@ -57,7 +47,7 @@ class AuthorActivity : layoutManager = LinearLayoutManager(context) adapter = mAdapter.apply { loadMoreModule.setOnLoadMoreListener { loadMoreData() } - addChildClickViewIds(R.id.iv_collect) + addChildClickViewIds(com.btpj.lib_base.R.id.iv_collect) setOnItemChildClickListener { _, _, position -> if (mAdapter.getItem(position).collect) { mViewModel.unCollectArticle(mAdapter.getItem(position).id) { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/author/AuthorViewModel.kt b/module_home/src/main/java/com/btpj/module_home/ui/author/AuthorViewModel.kt similarity index 92% rename from app/src/main/java/com/btpj/wanandroid/ui/author/AuthorViewModel.kt rename to module_home/src/main/java/com/btpj/module_home/ui/author/AuthorViewModel.kt index d9cfb07..24be4ca 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/author/AuthorViewModel.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/author/AuthorViewModel.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.author +package com.btpj.module_home.ui.author import androidx.databinding.ObservableField import androidx.lifecycle.MutableLiveData @@ -6,9 +6,9 @@ import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CoinInfo +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CoinInfo +import com.btpj.module_home.data.DataRepository /** * @author LTP 2022/3/9 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeFragment.kt b/module_home/src/main/java/com/btpj/module_home/ui/home/HomeFragment.kt similarity index 83% rename from app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeFragment.kt rename to module_home/src/main/java/com/btpj/module_home/ui/home/HomeFragment.kt index 75640b5..7927ab9 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeFragment.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/home/HomeFragment.kt @@ -1,22 +1,24 @@ -package com.btpj.wanandroid.ui.main.home +package com.btpj.module_home.ui.home import android.annotation.SuppressLint import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.adapter.ArticleAdapter import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.Banner -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.FragmentHomeBinding -import com.btpj.wanandroid.databinding.HeaderBannerBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.HomeViewModel.Companion.PAGE_SIZE -import com.btpj.wanandroid.ui.search.SearchActivity +import com.btpj.module_home.R +import com.btpj.module_home.databinding.HomeFragmentHomeBinding +import com.btpj.module_home.databinding.HomeHeaderBannerBinding +import com.btpj.module_home.ui.home.HomeViewModel.Companion.PAGE_SIZE +import com.btpj.module_home.ui.search.SearchActivity import com.youth.banner.indicator.CircleIndicator /** @@ -24,7 +26,9 @@ import com.youth.banner.indicator.CircleIndicator * * @author LTP 2022/3/10 */ -class HomeFragment : BaseFragment(R.layout.fragment_home) { +@Route(path = ModuleHomeApi.ROUTER_HOME_HOME_FRAGMENT) +class HomeFragment : + BaseVMBFragment(R.layout.home_fragment_home) { /** 列表总数 */ private var mTotalCount: Int = 0 @@ -40,15 +44,11 @@ class HomeFragment : BaseFragment(R.layout.f private val mAdapter by lazy { ArticleAdapter() } - companion object { - fun newInstance() = HomeFragment() - } - @SuppressLint("InflateParams") override fun initView() { - val headerBannerBinding = DataBindingUtil.inflate( + val headerBannerBinding = DataBindingUtil.inflate( layoutInflater, - R.layout.header_banner, + R.layout.home_header_banner, null, false ).apply { @@ -60,7 +60,7 @@ class HomeFragment : BaseFragment(R.layout.f } mBinding.apply { - titleLayout.setRightView(R.drawable.ic_search) { + titleLayout.setRightView(com.btpj.lib_base.R.drawable.ic_search) { SearchActivity.launch(requireContext()) } @@ -70,17 +70,17 @@ class HomeFragment : BaseFragment(R.layout.f adapter = mAdapter.apply { loadMoreModule.setOnLoadMoreListener { loadMoreData() } addHeaderView(headerBannerBinding.root) - addChildClickViewIds(R.id.tv_author, R.id.iv_collect) + addChildClickViewIds( + com.btpj.lib_base.R.id.tv_author, + com.btpj.lib_base.R.id.iv_collect + ) setOnItemChildClickListener { _, view, position -> when (view.id) { // 查看作者文章列表 - R.id.tv_author -> - AuthorActivity.launch( - requireContext(), - mAdapter.getItem(position).userId - ) + com.btpj.lib_base.R.id.tv_author -> + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) // 收藏与取消收藏 - R.id.iv_collect -> + com.btpj.lib_base.R.id.iv_collect -> if (mAdapter.getItem(position).collect) { mViewModel.unCollectArticle(mAdapter.getItem(position).id) { // 取消收藏成功后,手动更改避免刷新整个列表 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeViewModel.kt b/module_home/src/main/java/com/btpj/module_home/ui/home/HomeViewModel.kt similarity index 73% rename from app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeViewModel.kt rename to module_home/src/main/java/com/btpj/module_home/ui/home/HomeViewModel.kt index bf9715e..e56085c 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/home/HomeViewModel.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/home/HomeViewModel.kt @@ -1,14 +1,15 @@ -package com.btpj.wanandroid.ui.main.home +package com.btpj.module_home.ui.home import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.Banner +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.Banner +import com.btpj.module_home.data.DataRepository import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async import kotlinx.coroutines.withContext @@ -49,12 +50,18 @@ class HomeViewModel : BaseViewModel() { fun fetchArticlePageList(pageNo: Int = 0) { launch({ if (pageNo == 0) { - // 使用async需要单独加作用域,不然没网时会崩溃 - withContext(Dispatchers.IO) { - // 第一页会同时请求置顶文章列表接口和分页文章列表的接口,使用async进行并行请求速度更快(默认是串行的) - val response1 = async { DataRepository.getArticlePageList(pageNo, PAGE_SIZE) } - val response2 = async { DataRepository.getArticleTopList() } + // 第一页会同时请求置顶文章列表接口和分页文章列表的接口,使用async进行并行请求速度更快(默认是串行的) + // 需要加SupervisorJob()来自行处理协程(https://juejin.cn/post/7130132604568731655) + val response1 = async(Dispatchers.IO + SupervisorJob()) { + DataRepository.getArticlePageList( + pageNo, + PAGE_SIZE + ) + } + val response2 = + async(Dispatchers.IO + SupervisorJob()) { DataRepository.getArticleTopList() } + try { handleRequest(response1.await(), { val list = response1.await() handleRequest(response2.await(), { @@ -66,6 +73,8 @@ class HomeViewModel : BaseViewModel() { articlePageListLiveData.postValue(list.data) }) }) + } catch (e: Exception) { + e.printStackTrace() } } else { handleRequest( diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/home/MyBannerAdapter.kt b/module_home/src/main/java/com/btpj/module_home/ui/home/MyBannerAdapter.kt similarity index 83% rename from app/src/main/java/com/btpj/wanandroid/ui/main/home/MyBannerAdapter.kt rename to module_home/src/main/java/com/btpj/module_home/ui/home/MyBannerAdapter.kt index 3b963ed..57bd74b 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/home/MyBannerAdapter.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/home/MyBannerAdapter.kt @@ -1,11 +1,11 @@ -package com.btpj.wanandroid.ui.main.home +package com.btpj.module_home.ui.home import android.view.ViewGroup import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.export.ModuleWebApi import com.btpj.lib_base.ext.load -import com.btpj.wanandroid.data.bean.Banner -import com.btpj.wanandroid.ui.web.WebActivity import com.youth.banner.adapter.BannerAdapter /** @@ -30,7 +30,9 @@ class MyBannerAdapter(dataList: ArrayList) : override fun onBindView(holder: BannerViewHolder, data: Banner, position: Int, size: Int) { holder.imageView.apply { load(data.imagePath) - setOnClickListener { WebActivity.launch(context, data) } + setOnClickListener { + ModuleWebApi.navToWebActivity(data) + } } } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/HotSearchAdapter.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/HotSearchAdapter.kt similarity index 55% rename from app/src/main/java/com/btpj/wanandroid/ui/search/HotSearchAdapter.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/HotSearchAdapter.kt index b1b6e08..fa3efe2 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/HotSearchAdapter.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/HotSearchAdapter.kt @@ -1,8 +1,8 @@ -package com.btpj.wanandroid.ui.search +package com.btpj.module_home.ui.search -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.HotSearch -import com.btpj.wanandroid.databinding.ListItemTvBinding +import com.btpj.lib_base.data.bean.HotSearch +import com.btpj.lib_base.databinding.CommonListItemTvBinding +import com.btpj.lib_base.R import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -13,14 +13,14 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class HotSearchAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_tv), + BaseQuickAdapter>(layoutResId = R.layout.common_list_item_tv), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: HotSearch) { + override fun convert(holder: BaseDataBindingHolder, item: HotSearch) { holder.dataBinding?.apply { text = item.name executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchActivity.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchActivity.kt similarity index 88% rename from app/src/main/java/com/btpj/wanandroid/ui/search/SearchActivity.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/SearchActivity.kt index c5dee19..a878aef 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchActivity.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchActivity.kt @@ -1,15 +1,15 @@ -package com.btpj.wanandroid.ui.search +package com.btpj.module_home.ui.search import android.content.Context import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.base.BaseVMBActivity import com.btpj.lib_base.utils.ToastUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.local.CacheManager -import com.btpj.wanandroid.databinding.ActivitySearchBinding -import com.btpj.wanandroid.ui.search.result.SearchResultActivity +import com.btpj.module_home.R +import com.btpj.module_home.data.local.CacheManager +import com.btpj.module_home.databinding.HomeActivitySearchBinding +import com.btpj.module_home.ui.search.result.SearchResultActivity import com.google.android.flexbox.FlexboxLayoutManager /** @@ -18,7 +18,7 @@ import com.google.android.flexbox.FlexboxLayoutManager * @author LTP 2022/4/19 */ class SearchActivity : - BaseActivity(R.layout.activity_search) { + BaseVMBActivity(R.layout.home_activity_search) { /** 搜索历史 */ private val mHistoryAdapter by lazy { SearchHistoryAdapter() } @@ -40,7 +40,7 @@ class SearchActivity : override fun initView(savedInstanceState: Bundle?) { mBinding.apply { // toolbar + SearchView挺麻烦不想用 - titleLayout.setRightView(R.drawable.ic_search) { + titleLayout.setRightView(com.btpj.lib_base.R.drawable.ic_search) { handleSearch() } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchHistoryAdapter.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchHistoryAdapter.kt similarity index 61% rename from app/src/main/java/com/btpj/wanandroid/ui/search/SearchHistoryAdapter.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/SearchHistoryAdapter.kt index 36fdb10..3b91d5f 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchHistoryAdapter.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchHistoryAdapter.kt @@ -1,8 +1,8 @@ -package com.btpj.wanandroid.ui.search +package com.btpj.module_home.ui.search import android.view.View -import com.btpj.wanandroid.R -import com.btpj.wanandroid.databinding.ListItemIpBinding +import com.btpj.module_home.R +import com.btpj.module_home.databinding.HomeListItemSearchBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -13,14 +13,14 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class SearchHistoryAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_ip), + BaseQuickAdapter>(layoutResId = R.layout.home_list_item_search), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: String) { + override fun convert(holder: BaseDataBindingHolder, item: String) { holder.dataBinding?.apply { this.item = item executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchViewModel.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchViewModel.kt similarity index 85% rename from app/src/main/java/com/btpj/wanandroid/ui/search/SearchViewModel.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/SearchViewModel.kt index e57e7da..cb5d8b5 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/SearchViewModel.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/SearchViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.search +package com.btpj.module_home.ui.search import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.HotSearch -import com.btpj.wanandroid.data.local.CacheManager +import com.btpj.lib_base.data.bean.HotSearch +import com.btpj.module_home.data.DataRepository +import com.btpj.module_home.data.local.CacheManager /** * @author LTP 2022/4/19 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultActivity.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultActivity.kt similarity index 86% rename from app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultActivity.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultActivity.kt index 54e2691..1a1d2af 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultActivity.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultActivity.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.search.result +package com.btpj.module_home.ui.search.result import android.annotation.SuppressLint import android.content.Context @@ -6,16 +6,16 @@ import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData import com.btpj.lib_base.ext.getEmptyView +import com.btpj.module_home.R +import com.btpj.lib_base.adapter.ArticleAdapter +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.ActivitySearchResultBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.ArticleAdapter +import com.btpj.module_home.databinding.HomeActivitySearchResultBinding /** * 搜索结果列表 @@ -23,7 +23,7 @@ import com.btpj.wanandroid.ui.main.home.ArticleAdapter * @author LTP 2022/4/19 */ class SearchResultActivity : - BaseActivity(R.layout.activity_search_result) { + BaseVMBActivity(R.layout.home_activity_search_result) { private lateinit var mSearchKeyStr: String @@ -57,17 +57,17 @@ class SearchResultActivity : layoutManager = LinearLayoutManager(context) adapter = mAdapter.apply { loadMoreModule.setOnLoadMoreListener { loadMoreData() } - addChildClickViewIds(R.id.tv_author, R.id.iv_collect) + addChildClickViewIds( + com.btpj.lib_base.R.id.tv_author, + com.btpj.lib_base.R.id.iv_collect + ) setOnItemChildClickListener { _, view, position -> when (view.id) { // 查看作者文章列表 - R.id.tv_author -> - AuthorActivity.launch( - this@SearchResultActivity, - mAdapter.getItem(position).userId - ) + com.btpj.lib_base.R.id.tv_author -> + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) // 收藏与取消收藏 - R.id.iv_collect -> + com.btpj.lib_base.R.id.iv_collect -> if (mAdapter.getItem(position).collect) { mViewModel.unCollectArticle(mAdapter.getItem(position).id) { // 取消收藏成功后,手动更改避免刷新整个列表 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultViewModel.kt b/module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultViewModel.kt similarity index 90% rename from app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultViewModel.kt rename to module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultViewModel.kt index b1bfca4..2ed2309 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/search/result/SearchResultViewModel.kt +++ b/module_home/src/main/java/com/btpj/module_home/ui/search/result/SearchResultViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.search.result +package com.btpj.module_home.ui.search.result import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_home.data.DataRepository /** * @author LTP 2022/4/19 diff --git a/app/src/main/res/layout/activity_author.xml b/module_home/src/main/res/layout/home_activity_author.xml similarity index 96% rename from app/src/main/res/layout/activity_author.xml rename to module_home/src/main/res/layout/home_activity_author.xml index daf9459..66d7329 100644 --- a/app/src/main/res/layout/activity_author.xml +++ b/module_home/src/main/res/layout/home_activity_author.xml @@ -7,13 +7,13 @@ + type="com.btpj.module_home.ui.author.AuthorViewModel" /> + tools:context="com.btpj.module_home.ui.author.AuthorActivity"> + type="com.btpj.module_home.ui.search.SearchViewModel" /> @@ -15,7 +15,7 @@ + tools:context="com.btpj.module_home.ui.search.SearchActivity"> + tools:context="com.btpj.module_home.ui.search.result.SearchResultActivity"> + tools:context="com.btpj.module_home.ui.home.HomeFragment"> + + + \ No newline at end of file diff --git a/module_home/src/main/res/values/themes.xml b/module_home/src/main/res/values/themes.xml new file mode 100644 index 0000000..262edc1 --- /dev/null +++ b/module_home/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_home/src/test/java/com/btpj/module_home/ExampleUnitTest.kt b/module_home/src/test/java/com/btpj/module_home/ExampleUnitTest.kt new file mode 100644 index 0000000..c26700f --- /dev/null +++ b/module_home/src/test/java/com/btpj/module_home/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_home + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_main/.gitignore b/module_main/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_main/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_main/build.gradle b/module_main/build.gradle new file mode 100644 index 0000000..44fad0f --- /dev/null +++ b/module_main/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_main' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_main" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "main_" +} \ No newline at end of file diff --git a/module_main/proguard-rules.pro b/module_main/proguard-rules.pro new file mode 100644 index 0000000..5b5dbe7 --- /dev/null +++ b/module_main/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_main.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_main/src/androidTest/java/com/btpj/module_main/ExampleInstrumentedTest.kt b/module_main/src/androidTest/java/com/btpj/module_main/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0e33cd3 --- /dev/null +++ b/module_main/src/androidTest/java/com/btpj/module_main/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_main + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_main", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_main/src/main/AndroidManifest.xml b/module_main/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b1a0bec --- /dev/null +++ b/module_main/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_main/src/main/alone/AndroidManifest.xml b/module_main/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..5cbe629 --- /dev/null +++ b/module_main/src/main/alone/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_main/src/main/java/com/btpj/module_main/data/local/CacheManager.kt b/module_main/src/main/java/com/btpj/module_main/data/local/CacheManager.kt new file mode 100644 index 0000000..05dcc8a --- /dev/null +++ b/module_main/src/main/java/com/btpj/module_main/data/local/CacheManager.kt @@ -0,0 +1,25 @@ +package com.btpj.module_main.data.local + +import com.tencent.mmkv.MMKV + +/** + * 项目中用到的一些缓存 + * + * @author LTP 2022/4/8 + */ +object CacheManager { + + private const val KEY_FIRST_USE = "first_use" + + private val mmkv by lazy { MMKV.defaultMMKV() } + + /** 存储是否首次使用APP */ + fun saveFirstUse(isFirstUse: Boolean): Boolean { + return mmkv.encode(KEY_FIRST_USE, isFirstUse) + } + + /** 是否首次使用APP */ + fun isFirstUse(): Boolean { + return mmkv.decodeBool(KEY_FIRST_USE, true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/MainActivity.kt b/module_main/src/main/java/com/btpj/module_main/ui/main/MainActivity.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/ui/main/MainActivity.kt rename to module_main/src/main/java/com/btpj/module_main/ui/main/MainActivity.kt index 7dcb1a4..cbe5f19 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/MainActivity.kt +++ b/module_main/src/main/java/com/btpj/module_main/ui/main/MainActivity.kt @@ -1,19 +1,15 @@ -package com.btpj.wanandroid.ui.main +package com.btpj.module_main.ui.main import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.export.* +import com.btpj.lib_base.ext.clearLongClickToast import com.btpj.lib_base.utils.ToastUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityMainBinding -import com.btpj.wanandroid.ext.clearLongClickToast -import com.btpj.wanandroid.ui.main.home.HomeFragment -import com.btpj.wanandroid.ui.main.mine.MineFragment -import com.btpj.wanandroid.ui.main.project.ProjectFragment -import com.btpj.wanandroid.ui.main.square.SquareFragment -import com.btpj.wanandroid.ui.main.wechat.WechatFragment +import com.btpj.module_main.R +import com.btpj.module_main.databinding.MainActivityMainBinding /** * 主页 @@ -21,7 +17,7 @@ import com.btpj.wanandroid.ui.main.wechat.WechatFragment * @author LTP 2022/3/9 */ class MainActivity : - BaseActivity(R.layout.activity_main) { + BaseVMBActivity(R.layout.main_activity_main) { companion object { /** 记录修改配置(如页面旋转)前navBar的位置的常量 */ @@ -33,11 +29,11 @@ class MainActivity : } } - private val mHomeFragment by lazy { HomeFragment.newInstance() } - private val mProjectFragment by lazy { ProjectFragment.newInstance() } - private val mSquareFragment by lazy { SquareFragment.newInstance() } - private val mWechatFragment by lazy { WechatFragment.newInstance() } - private val mMineFragment by lazy { MineFragment.newInstance() } + private val mHomeFragment by lazy { ModuleHomeApi.getHomeFragment() } + private val mProjectFragment by lazy { ModuleProjectApi.getProjectFragment() } + private val mSquareFragment by lazy { ModuleSquareApi.getSquareFragment() } + private val mWechatFragment by lazy { ModuleWechatApi.getWechatFragment() } + private val mMineFragment by lazy { ModuleMineApi.getMineFragment() } /** 当前显示的Fragment(默认开始为首页) */ private var mCurrentFragment: Fragment = mHomeFragment @@ -154,7 +150,7 @@ class MainActivity : // 重写返回键监听实现双击退出 if (System.currentTimeMillis() - lastBackMills > 2000) { lastBackMills = System.currentTimeMillis() - ToastUtil.showShort(this, getString(R.string.toast_double_back_exit)) + ToastUtil.showShort(this, getString(com.btpj.lib_base.R.string.toast_double_back_exit)) } else { super.onBackPressed() } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/MainViewModel.kt b/module_main/src/main/java/com/btpj/module_main/ui/main/MainViewModel.kt similarity index 80% rename from app/src/main/java/com/btpj/wanandroid/ui/main/MainViewModel.kt rename to module_main/src/main/java/com/btpj/module_main/ui/main/MainViewModel.kt index a9c354e..6eed2bf 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/MainViewModel.kt +++ b/module_main/src/main/java/com/btpj/module_main/ui/main/MainViewModel.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.main +package com.btpj.module_main.ui.main import com.btpj.lib_base.base.BaseViewModel diff --git a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashActivity.kt b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashActivity.kt similarity index 77% rename from app/src/main/java/com/btpj/wanandroid/ui/splash/SplashActivity.kt rename to module_main/src/main/java/com/btpj/module_main/ui/splash/SplashActivity.kt index b451206..463e33b 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashActivity.kt +++ b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashActivity.kt @@ -1,13 +1,13 @@ -package com.btpj.wanandroid.ui.splash +package com.btpj.module_main.ui.splash import android.annotation.SuppressLint import android.os.Bundle import android.view.View -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.local.CacheManager -import com.btpj.wanandroid.databinding.ActivitySplashBinding -import com.btpj.wanandroid.ui.main.MainActivity +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.module_main.R +import com.btpj.module_main.databinding.MainActivitySplashBinding +import com.btpj.module_main.ui.main.MainActivity +import com.btpj.module_main.data.local.CacheManager import com.youth.banner.indicator.CircleIndicator import com.youth.banner.listener.OnPageChangeListener @@ -18,10 +18,14 @@ import com.youth.banner.listener.OnPageChangeListener */ @SuppressLint("CustomSplashScreen") class SplashActivity : - BaseActivity(R.layout.activity_splash) { + BaseVMBActivity(R.layout.main_activity_splash) { private val mBannerList = - listOf(R.drawable.ic_splash, R.drawable.ic_splash2, R.drawable.ic_splash3) + listOf( + com.btpj.lib_base.R.drawable.ic_splash, + com.btpj.lib_base.R.drawable.ic_splash2, + com.btpj.lib_base.R.drawable.ic_splash3 + ) private val mAdapter by lazy { SplashBannerAdapter(mBannerList) } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashBannerAdapter.kt b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashBannerAdapter.kt similarity index 96% rename from app/src/main/java/com/btpj/wanandroid/ui/splash/SplashBannerAdapter.kt rename to module_main/src/main/java/com/btpj/module_main/ui/splash/SplashBannerAdapter.kt index e40bcff..8902161 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashBannerAdapter.kt +++ b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashBannerAdapter.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.splash +package com.btpj.module_main.ui.splash import android.view.ViewGroup import android.widget.ImageView diff --git a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashViewModel.kt b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashViewModel.kt similarity index 76% rename from app/src/main/java/com/btpj/wanandroid/ui/splash/SplashViewModel.kt rename to module_main/src/main/java/com/btpj/module_main/ui/splash/SplashViewModel.kt index a6125ee..60b0b24 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/splash/SplashViewModel.kt +++ b/module_main/src/main/java/com/btpj/module_main/ui/splash/SplashViewModel.kt @@ -1,8 +1,8 @@ -package com.btpj.wanandroid.ui.splash +package com.btpj.module_main.ui.splash import androidx.databinding.ObservableBoolean import com.btpj.lib_base.base.BaseViewModel -import com.btpj.wanandroid.data.local.CacheManager +import com.btpj.module_main.data.local.CacheManager /** * @author LTP 2022/4/21 diff --git a/app/src/main/res/layout/activity_main.xml b/module_main/src/main/res/layout/main_activity_main.xml similarity index 88% rename from app/src/main/res/layout/activity_main.xml rename to module_main/src/main/res/layout/main_activity_main.xml index 59be9da..991e1dd 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/module_main/src/main/res/layout/main_activity_main.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.main.MainActivity"> + tools:context="com.btpj.module_main.ui.main.MainActivity"> + app:menu="@menu/main_menu_bottom_nav" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_splash.xml b/module_main/src/main/res/layout/main_activity_splash.xml similarity index 92% rename from app/src/main/res/layout/activity_splash.xml rename to module_main/src/main/res/layout/main_activity_splash.xml index 3ac09e2..4b6a3b3 100644 --- a/app/src/main/res/layout/activity_splash.xml +++ b/module_main/src/main/res/layout/main_activity_splash.xml @@ -7,7 +7,7 @@ + type="com.btpj.module_main.ui.splash.SplashViewModel" /> @@ -18,7 +18,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ic_splash" - tools:context=".ui.splash.SplashActivity"> + tools:context="com.btpj.module_main.ui.splash.SplashActivity"> + + + \ No newline at end of file diff --git a/module_main/src/main/res/values/themes.xml b/module_main/src/main/res/values/themes.xml new file mode 100644 index 0000000..54571f0 --- /dev/null +++ b/module_main/src/main/res/values/themes.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/module_main/src/test/java/com/btpj/module_main/ExampleUnitTest.kt b/module_main/src/test/java/com/btpj/module_main/ExampleUnitTest.kt new file mode 100644 index 0000000..8ff56f9 --- /dev/null +++ b/module_main/src/test/java/com/btpj/module_main/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_main + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_mine/.gitignore b/module_mine/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_mine/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_mine/build.gradle b/module_mine/build.gradle new file mode 100644 index 0000000..4111800 --- /dev/null +++ b/module_mine/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_mine' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_mine" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "mine_" +} \ No newline at end of file diff --git a/module_mine/proguard-rules.pro b/module_mine/proguard-rules.pro new file mode 100644 index 0000000..e134359 --- /dev/null +++ b/module_mine/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_mine.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_mine/src/androidTest/java/com/btpj/module_mine/ExampleInstrumentedTest.kt b/module_mine/src/androidTest/java/com/btpj/module_mine/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..7fcf16a --- /dev/null +++ b/module_mine/src/androidTest/java/com/btpj/module_mine/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_mine + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_user", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_mine/src/main/AndroidManifest.xml b/module_mine/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f9f3eb9 --- /dev/null +++ b/module_mine/src/main/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_mine/src/main/alone/AndroidManifest.xml b/module_mine/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..304b40d --- /dev/null +++ b/module_mine/src/main/alone/AndroidManifest.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_mine/src/main/java/com/btpj/module_mine/data/DataRepository.kt b/module_mine/src/main/java/com/btpj/module_mine/data/DataRepository.kt new file mode 100644 index 0000000..782bb99 --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/data/DataRepository.kt @@ -0,0 +1,71 @@ +package com.btpj.module_mine.data + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.lib_base.data.bean.CoinInfo +import com.btpj.lib_base.data.bean.IntegralRecord +import com.btpj.lib_base.data.bean.Share +import com.btpj.module_mine.data.http.Api + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + override suspend fun login(username: String, pwd: String): ApiResponse { + return apiCall { service.login(username, pwd) } + } + + override suspend fun register( + username: String, + pwd: String, + pwdSure: String + ): ApiResponse { + return apiCall { service.register(username, pwd, pwdSure) } + } + + override suspend fun getUserIntegral(): ApiResponse { + return apiCall { service.getUserIntegral() } + } + + override suspend fun getIntegralRankPageList(pageNo: Int): ApiResponse> { + return apiCall { service.getIntegralRankPageList(pageNo) } + } + + override suspend fun getIntegralRecordPageList(pageNo: Int): ApiResponse> { + return apiCall { service.getIntegralRecordPageList(pageNo) } + } + + override suspend fun getCollectUrlList(): ApiResponse> { + return apiCall { service.getCollectUrlList() } + } + + override suspend fun getMyShareArticlePageList(pageNo: Int): ApiResponse { + return apiCall { service.getMyShareArticlePageList(pageNo) } + } + + override suspend fun addArticle(title: String, link: String): ApiResponse { + return apiCall { service.addArticle(title, link) } + } + + override suspend fun deleteShareArticle(id: Int): ApiResponse { + return apiCall { service.deleteShareArticle(id) } + } + + override suspend fun unCollectUrl(id: Int): ApiResponse { + return apiCall { service.unCollectUrl(id) } + } + + override suspend fun getCollectArticlePageList(pageNo: Int): ApiResponse> { + return apiCall { service.getCollectArticlePageList(pageNo) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } +} \ No newline at end of file diff --git a/module_mine/src/main/java/com/btpj/module_mine/data/http/Api.kt b/module_mine/src/main/java/com/btpj/module_mine/data/http/Api.kt new file mode 100644 index 0000000..9a15236 --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/data/http/Api.kt @@ -0,0 +1,76 @@ +package com.btpj.module_mine.data.http + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.data.bean.CoinInfo +import com.btpj.lib_base.data.bean.IntegralRecord +import com.btpj.lib_base.data.bean.Share +import retrofit2.http.* + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 登录 */ + @FormUrlEncoded + @POST("user/login") + suspend fun login( + @Field("username") username: String, + @Field("password") pwd: String + ): ApiResponse + + /** 注册 */ + @FormUrlEncoded + @POST("user/register") + suspend fun register( + @Field("username") username: String, + @Field("password") pwd: String, + @Field("repassword") pwdSure: String + ): ApiResponse + + /** 获取个人积分 */ + @GET("lg/coin/userinfo/json") + suspend fun getUserIntegral(): ApiResponse + + /** 获取积分排行列表分页 */ + @GET("coin/rank/{pageNo}/json") + suspend fun getIntegralRankPageList(@Path("pageNo") pageNo: Int): ApiResponse> + + /** 获取积分历史 */ + @GET("lg/coin/list/{pageNo}/json") + suspend fun getIntegralRecordPageList(@Path("pageNo") pageNo: Int): ApiResponse> + + /** 获取收藏网址列表 */ + @GET("lg/collect/usertools/json") + suspend fun getCollectUrlList(): ApiResponse> + + /** 获取我分享的文章分页列表 */ + @GET("user/lg/private_articles/{pageNo}/json") + suspend fun getMyShareArticlePageList(@Path("pageNo") pageNo: Int): ApiResponse + + /** 添加要分享的文章 */ + @POST("lg/user_article/add/json") + @FormUrlEncoded + suspend fun addArticle( + @Field("title") title: String, + @Field("link") link: String + ): ApiResponse + + /** 删除自己分享的文章 */ + @POST("lg/user_article/delete/{id}/json") + suspend fun deleteShareArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/collect/deletetool/json") + suspend fun unCollectUrl(@Query("id") id: Int): ApiResponse + + /** 获取收藏文章分页列表 */ + @GET("lg/collect/list/{pageNo}/json") + suspend fun getCollectArticlePageList(@Path("pageNo") pageNo: Int): ApiResponse> + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse +} \ No newline at end of file diff --git a/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneActivity.kt new file mode 100644 index 0000000..7fb7e99 --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneActivity.kt @@ -0,0 +1,22 @@ +package com.btpj.module_mine.ui.alone + +import android.os.Bundle +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.databinding.CommonContainerBinding +import com.btpj.lib_base.export.ModuleMineApi + +/** + * 作为Application时的测试页面 + * + * @author LTP 2022/4/8 + */ +class AloneActivity : + BaseVMBActivity(R.layout.common_container) { + + override fun initView(savedInstanceState: Bundle?) { + supportFragmentManager.beginTransaction() + .add(R.id.fl_container, ModuleMineApi.getMineFragment()) + .commit() + } +} \ No newline at end of file diff --git a/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneViewModel.kt new file mode 100644 index 0000000..44adfc2 --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/alone/AloneViewModel.kt @@ -0,0 +1,10 @@ +package com.btpj.module_mine.ui.alone + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author LTP 2022/3/9 + */ +class AloneViewModel : BaseViewModel() { + override fun start() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/CollectActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectActivity.kt similarity index 81% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/CollectActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectActivity.kt index 3d7a8ca..b622dd8 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/CollectActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectActivity.kt @@ -1,15 +1,15 @@ -package com.btpj.wanandroid.ui.collect +package com.btpj.module_mine.ui.collect import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityCollectBinding -import com.btpj.wanandroid.ui.collect.article.CollectArticleFragment -import com.btpj.wanandroid.ui.collect.url.CollectUrlFragment +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityCollectBinding +import com.btpj.module_mine.ui.collect.article.CollectArticleFragment +import com.btpj.module_mine.ui.collect.url.CollectUrlFragment import com.google.android.material.tabs.TabLayoutMediator /** @@ -18,7 +18,7 @@ import com.google.android.material.tabs.TabLayoutMediator * @author LTP 2022/4/13 */ class CollectActivity : - BaseActivity(R.layout.activity_collect) { + BaseVMBActivity(R.layout.mine_activity_collect) { /** 标题 */ private val mTitleList = arrayListOf("文章", "网址") diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/CollectViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectViewModel.kt similarity index 75% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/CollectViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectViewModel.kt index 7e73b92..30fdaf9 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/CollectViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/CollectViewModel.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.collect +package com.btpj.module_mine.ui.collect import com.btpj.lib_base.base.BaseViewModel diff --git a/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleAdapter.kt new file mode 100644 index 0000000..6206172 --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleAdapter.kt @@ -0,0 +1,39 @@ +package com.btpj.module_mine.ui.collect.article + +import com.btpj.lib_base.data.bean.CollectArticle +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemCollectArticleBinding +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder + +/** + * 收藏文章列表的Adapter + * + * @author LTP 2022/3/23 + */ +class CollectArticleAdapter : + BaseQuickAdapter>( + layoutResId = R.layout.mine_list_item_collect_article + ), + LoadMoreModule { + + init { + setAnimationWithDefault(AnimationType.ScaleIn) + } + + override fun convert( + holder: BaseDataBindingHolder, + item: CollectArticle + ) { + holder.dataBinding?.apply { + collectArticle = item + executePendingBindings() + + clItem.setOnClickListener { + ModuleWebApi.navToWebActivity(item) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleFragment.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleFragment.kt similarity index 85% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleFragment.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleFragment.kt index c67f426..6ff3d17 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleFragment.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleFragment.kt @@ -1,14 +1,14 @@ -package com.btpj.wanandroid.ui.collect.article +package com.btpj.module_mine.ui.collect.article import androidx.recyclerview.widget.LinearLayoutManager import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.CollectArticle +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.CollectArticle -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.module_mine.R import java.util.* /** @@ -17,7 +17,7 @@ import java.util.* * @author LTP 2022/3/10 */ class CollectArticleFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(com.btpj.lib_base.R.layout.include_swiperefresh_recyclerview) { /** 页数 */ private var mPageNo: Int = 0 @@ -78,11 +78,11 @@ class CollectArticleFragment : for (position in mAdapter.data.indices) { if (mAdapter.data[position].id == it.id) { // 取消收藏再次收藏会回到第一个,收藏时间也会变为 “刚刚” - // -----不想重新请求刷新的话,这种处理会有问题--start------- - // mAdapter.data[position].niceDate = "刚刚" - // mAdapter.notifyItemChanged(position) - // mAdapter.notifyItemMoved(position, 0) - // --------------------end------------------------------- + /**-----不想重新请求刷新的话,这种处理会有问题---start--------- + mAdapter.data[position].niceDate = "刚刚" + mAdapter.notifyItemChanged(position) + mAdapter.notifyItemMoved(position, 0) + --------------------end--------------------------------*/ // 采用直接操作List的方式,分页请求时重新刷新体验不太好 val oldList = ArrayList(mAdapter.data) diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleViewModel.kt similarity index 87% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleViewModel.kt index a01b6bd..ffb344f 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/article/CollectArticleViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/article/CollectArticleViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.collect.article +package com.btpj.module_mine.ui.collect.article import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.CollectArticle +import com.btpj.lib_base.data.bean.CollectArticle +import com.btpj.module_mine.data.DataRepository class CollectArticleViewModel : BaseViewModel() { diff --git a/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlAdapter.kt new file mode 100644 index 0000000..d33a17f --- /dev/null +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlAdapter.kt @@ -0,0 +1,35 @@ +package com.btpj.module_mine.ui.collect.url + +import com.btpj.lib_base.data.bean.CollectUrl +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemCollectUrlBinding +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder + +/** + * 收藏网址列表的Adapter + * + * @author LTP 2022/3/23 + */ +class CollectUrlAdapter : + BaseQuickAdapter>(layoutResId = R.layout.mine_list_item_collect_url) { + + init { + setAnimationWithDefault(AnimationType.ScaleIn) + } + + override fun convert( + holder: BaseDataBindingHolder, + item: CollectUrl + ) { + holder.dataBinding?.apply { + collectUrl = item + executePendingBindings() + + clItem.setOnClickListener { + ModuleWebApi.navToWebActivity(item) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlFragment.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlFragment.kt similarity index 88% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlFragment.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlFragment.kt index 9c5de95..91dbb08 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlFragment.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlFragment.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.collect.url +package com.btpj.module_mine.ui.collect.url import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.module_mine.R /** * 收藏的文章 @@ -14,7 +14,7 @@ import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding * @author LTP 2022/3/10 */ class CollectUrlFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(com.btpj.lib_base.R.layout.include_swiperefresh_recyclerview) { private val mAdapter by lazy { CollectUrlAdapter() } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlViewModel.kt similarity index 85% rename from app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlViewModel.kt index 8b8d10e..d638cec 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/collect/url/CollectUrlViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/collect/url/CollectUrlViewModel.kt @@ -1,11 +1,11 @@ -package com.btpj.wanandroid.ui.collect.url +package com.btpj.module_mine.ui.collect.url import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.CollectUrl +import com.btpj.lib_base.data.bean.CollectUrl +import com.btpj.module_mine.data.DataRepository class CollectUrlViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralAdapter.kt similarity index 51% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralAdapter.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralAdapter.kt index 76ee15d..6ad024e 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralAdapter.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralAdapter.kt @@ -1,8 +1,8 @@ -package com.btpj.wanandroid.ui.integral.rank +package com.btpj.module_mine.ui.integral.rank -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.CoinInfo -import com.btpj.wanandroid.databinding.ListItemIntegralBinding +import com.btpj.lib_base.data.bean.CoinInfo +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemIntegralBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -13,14 +13,19 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class IntegralAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_integral), + BaseQuickAdapter>( + layoutResId = R.layout.mine_list_item_integral + ), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: CoinInfo) { + override fun convert( + holder: BaseDataBindingHolder, + item: CoinInfo + ) { holder.dataBinding?.apply { integral = item executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankActivity.kt similarity index 86% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankActivity.kt index de62c52..27826bd 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankActivity.kt @@ -1,21 +1,21 @@ -package com.btpj.wanandroid.ui.integral.rank +package com.btpj.module_mine.ui.integral.rank import android.content.Context import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.base.BaseVMBActivity import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView -import com.btpj.lib_base.ext.initClose import com.btpj.lib_base.ext.initColors import com.btpj.lib_base.ext.initTitle -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.Banner -import com.btpj.wanandroid.data.bean.CoinInfo -import com.btpj.wanandroid.databinding.ActivityIntegralRankBinding -import com.btpj.wanandroid.ui.integral.record.IntegralRecordActivity -import com.btpj.wanandroid.ui.web.WebActivity +import com.btpj.lib_base.ext.initClose +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.data.bean.CoinInfo +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_mine.ui.integral.record.IntegralRecordActivity +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityIntegralRankBinding /** * 积分排行 @@ -23,7 +23,7 @@ import com.btpj.wanandroid.ui.web.WebActivity * @author LTP 2022/4/12 */ class IntegralRankActivity : - BaseActivity(R.layout.activity_integral_rank) { + BaseVMBActivity(R.layout.mine_activity_integral_rank) { /** 页数 */ private var mPageNo: Int = 0 @@ -47,13 +47,12 @@ class IntegralRankActivity : .apply { initTitle("积分排行") initClose { onBackPressed() } - inflateMenu(R.menu.menu_integral_rank) + inflateMenu(R.menu.mine_menu_integral_rank) setOnMenuItemClickListener { when (it.itemId) { R.id.item_integralRule -> // 积分规则 - WebActivity.launch( - this@IntegralRankActivity, + ModuleWebApi.navToWebActivity( Banner( title = "积分规则", url = "https://www.wanandroid.com/blog/show/2653" diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankViewModel.kt similarity index 85% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankViewModel.kt index 6ddd104..90d7a16 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/rank/IntegralRankViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/rank/IntegralRankViewModel.kt @@ -1,14 +1,14 @@ -package com.btpj.wanandroid.ui.integral.rank +package com.btpj.module_mine.ui.integral.rank import androidx.databinding.ObservableField import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.bean.CoinInfo import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.data.local.UserManager import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.CoinInfo -import com.btpj.wanandroid.data.local.UserManager +import com.btpj.module_mine.data.DataRepository class IntegralRankViewModel : BaseViewModel() { /** 我的积分信息 */ diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordActivity.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordActivity.kt index 3c7e606..052369d 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordActivity.kt @@ -1,16 +1,16 @@ -package com.btpj.wanandroid.ui.integral.record +package com.btpj.module_mine.ui.integral.record import android.content.Context import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.ext.initColors +import com.btpj.lib_base.data.bean.IntegralRecord import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView -import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.IntegralRecord -import com.btpj.wanandroid.databinding.ActivityIntegralRecordBinding +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityIntegralRecordBinding /** * 积分记录 @@ -18,7 +18,7 @@ import com.btpj.wanandroid.databinding.ActivityIntegralRecordBinding * @author LTP 2022/4/12 */ class IntegralRecordActivity : - BaseActivity(R.layout.activity_integral_record) { + BaseVMBActivity(R.layout.mine_activity_integral_record) { /** 页数 */ private var mPageNo: Int = 0 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordAdapter.kt similarity index 67% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordAdapter.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordAdapter.kt index 2683c59..b73420a 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordAdapter.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordAdapter.kt @@ -1,9 +1,9 @@ -package com.btpj.wanandroid.ui.integral.record +package com.btpj.module_mine.ui.integral.record import android.annotation.SuppressLint -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.IntegralRecord -import com.btpj.wanandroid.databinding.ListItemIntegralRecordBinding +import com.btpj.lib_base.data.bean.IntegralRecord +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemIntegralRecordBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -14,8 +14,8 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class IntegralRecordAdapter : - BaseQuickAdapter>( - layoutResId = R.layout.list_item_integral_record + BaseQuickAdapter>( + layoutResId = R.layout.mine_list_item_integral_record ), LoadMoreModule { init { @@ -24,7 +24,7 @@ class IntegralRecordAdapter : @SuppressLint("SetTextI18n") override fun convert( - holder: BaseDataBindingHolder, + holder: BaseDataBindingHolder, item: IntegralRecord ) { holder.dataBinding?.apply { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordViewModel.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordViewModel.kt index a5b931c..56cf721 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/integral/record/IntegralRecordViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/integral/record/IntegralRecordViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.integral.record +package com.btpj.module_mine.ui.integral.record import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.bean.IntegralRecord import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.IntegralRecord +import com.btpj.module_mine.data.DataRepository class IntegralRecordViewModel : BaseViewModel() { val integralRecordPageList = MutableLiveData>() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpActivity.kt similarity index 86% rename from app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpActivity.kt index 431c387..9edda6d 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpActivity.kt @@ -1,16 +1,16 @@ -package com.btpj.wanandroid.ui.ip +package com.btpj.module_mine.ui.ip import android.content.Context import android.content.Intent import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.base.BaseVMBActivity import com.btpj.lib_base.data.local.IpManager import com.btpj.lib_base.ext.showDialog import com.btpj.lib_base.http.RetrofitManager import com.btpj.lib_base.utils.KeyboardUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityChangeIpBinding +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityChangeIpBinding /** * 切换Ip的界面 @@ -18,7 +18,7 @@ import com.btpj.wanandroid.databinding.ActivityChangeIpBinding * @author LTP 2019/8/5 */ class ChangeIpActivity : - BaseActivity(R.layout.activity_change_ip) { + BaseVMBActivity(R.layout.mine_activity_change_ip) { companion object { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpViewModel.kt similarity index 96% rename from app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpViewModel.kt index c8690eb..f999f78 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/ip/ChangeIpViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/ChangeIpViewModel.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.ip +package com.btpj.module_mine.ui.ip import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel diff --git a/app/src/main/java/com/btpj/wanandroid/ui/ip/IpListAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/IpListAdapter.kt similarity index 71% rename from app/src/main/java/com/btpj/wanandroid/ui/ip/IpListAdapter.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/ip/IpListAdapter.kt index d6614b4..fc8f225 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/ip/IpListAdapter.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/ip/IpListAdapter.kt @@ -1,9 +1,9 @@ -package com.btpj.wanandroid.ui.ip +package com.btpj.module_mine.ui.ip import android.view.View import com.btpj.lib_base.data.local.IpManager -import com.btpj.wanandroid.R -import com.btpj.wanandroid.databinding.ListItemIpBinding +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemIpBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -14,13 +14,13 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @param currentIp 当前IP */ class IpListAdapter(private val currentIp: String) : - BaseQuickAdapter>(R.layout.list_item_ip) { + BaseQuickAdapter>(R.layout.mine_list_item_ip) { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: String) { + override fun convert(holder: BaseDataBindingHolder, item: String) { holder.dataBinding?.apply { this.item = item executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/login/LoginActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginActivity.kt similarity index 75% rename from app/src/main/java/com/btpj/wanandroid/ui/login/LoginActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginActivity.kt index c466e63..7a1d780 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/login/LoginActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginActivity.kt @@ -1,17 +1,19 @@ -package com.btpj.wanandroid.ui.login +package com.btpj.module_mine.ui.login import android.content.Context import android.content.Intent import android.os.Bundle import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.export.ModuleMineApi import com.btpj.lib_base.ext.hideLoading import com.btpj.lib_base.ext.showLoading -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityLoginBinding -import com.btpj.wanandroid.ui.ip.ChangeIpActivity -import com.btpj.wanandroid.ui.login.register.RegisterActivity +import com.btpj.module_mine.ui.ip.ChangeIpActivity +import com.btpj.module_mine.ui.login.register.RegisterActivity +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityLoginBinding import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -20,20 +22,9 @@ import kotlinx.coroutines.launch * * @author LTP 2022/4/8 */ +@Route(path = ModuleMineApi.ROUTER_MINE_LOGIN_ACTIVITY) class LoginActivity : - BaseActivity(R.layout.activity_login) { - - companion object { - - - /** - * 页面启动 - * @param context Context - */ - fun launch(context: Context) { - context.startActivity(Intent(context, LoginActivity::class.java)) - } - } + BaseVMBActivity(R.layout.mine_activity_login) { override fun initView(savedInstanceState: Bundle?) { // Activity Results需要先注册 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/login/LoginViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginViewModel.kt similarity index 88% rename from app/src/main/java/com/btpj/wanandroid/ui/login/LoginViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginViewModel.kt index 74ca467..65c4414 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/login/LoginViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/login/LoginViewModel.kt @@ -1,13 +1,13 @@ -package com.btpj.wanandroid.ui.login +package com.btpj.module_mine.ui.login import androidx.databinding.ObservableBoolean import androidx.databinding.ObservableField import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.local.UserManager +import com.btpj.lib_base.base.App +import com.btpj.module_mine.data.DataRepository +import com.btpj.lib_base.data.local.UserManager /** * @author LTP 2022/3/9 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterActivity.kt similarity index 87% rename from app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterActivity.kt index ad469bd..cab997d 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterActivity.kt @@ -1,14 +1,14 @@ -package com.btpj.wanandroid.ui.login.register +package com.btpj.module_mine.ui.login.register import android.content.Context import android.content.Intent import android.os.Bundle +import com.btpj.lib_base.base.BaseVMBActivity import com.btpj.lib_base.ext.hideLoading import com.btpj.lib_base.ext.showLoading import com.btpj.lib_base.utils.ToastUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityRegisterBinding +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityRegisterBinding /** * 注册 @@ -16,7 +16,7 @@ import com.btpj.wanandroid.databinding.ActivityRegisterBinding * @author LTP 2022/4/8 */ class RegisterActivity : - BaseActivity(R.layout.activity_register) { + BaseVMBActivity(R.layout.mine_activity_register) { companion object { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterViewModel.kt similarity index 90% rename from app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterViewModel.kt index 25ae436..6728bf4 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/login/register/RegisterViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/login/register/RegisterViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.login.register +package com.btpj.module_mine.ui.login.register import androidx.databinding.ObservableBoolean import androidx.databinding.ObservableField import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.local.UserManager +import com.btpj.module_mine.data.DataRepository +import com.btpj.lib_base.data.local.UserManager /** * @author LTP 2022/3/9 diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineFragment.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineFragment.kt similarity index 66% rename from app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineFragment.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineFragment.kt index 6cd87b3..a9fe606 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineFragment.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineFragment.kt @@ -1,31 +1,30 @@ -package com.btpj.wanandroid.ui.main.mine +package com.btpj.module_mine.ui.mine import android.annotation.SuppressLint +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.data.local.UserManager +import com.btpj.lib_base.export.ModuleMineApi +import com.btpj.lib_base.export.ModuleWebApi import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Banner -import com.btpj.wanandroid.data.local.UserManager -import com.btpj.wanandroid.databinding.FragmentMineBinding -import com.btpj.wanandroid.ext.launchCheckLogin -import com.btpj.wanandroid.ui.collect.CollectActivity -import com.btpj.wanandroid.ui.integral.rank.IntegralRankActivity -import com.btpj.wanandroid.ui.login.LoginActivity -import com.btpj.wanandroid.ui.setting.SettingActivity -import com.btpj.wanandroid.ui.share.list.MyArticleActivity -import com.btpj.wanandroid.ui.web.WebActivity +import com.btpj.lib_base.ext.launchCheckLogin +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineFragmentMineBinding +import com.btpj.module_mine.ui.collect.CollectActivity +import com.btpj.module_mine.ui.integral.rank.IntegralRankActivity +import com.btpj.module_mine.ui.setting.SettingActivity +import com.btpj.module_mine.ui.share.list.MyArticleActivity /** * 我的Tab * * @author LTP 2022/3/10 */ -class MineFragment : BaseFragment(R.layout.fragment_mine) { - - companion object { - fun newInstance() = MineFragment() - } +@Route(path = ModuleMineApi.ROUTER_MINE_MINE_FRAGMENT) +class MineFragment : + BaseVMBFragment(R.layout.mine_fragment_mine) { override fun initView() { mBinding.apply { @@ -36,7 +35,7 @@ class MineFragment : BaseFragment(R.layout.f clUser.setOnClickListener { if (!UserManager.isLogin()) { - LoginActivity.launch(requireContext()) + ModuleMineApi.navToLoginActivity() } } @@ -57,9 +56,11 @@ class MineFragment : BaseFragment(R.layout.f // 开源网站 tvWeb.setOnClickListener { - WebActivity.launch( - requireContext(), - Banner(title = "玩Android网站", url = "https://www.wanandroid.com/") + ModuleWebApi.navToWebActivity( + Banner( + title = "玩Android网站", + url = "https://www.wanandroid.com/" + ) ) } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineViewModel.kt similarity index 80% rename from app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineViewModel.kt index a60ee04..21aa54c 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/mine/MineViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/mine/MineViewModel.kt @@ -1,14 +1,14 @@ -package com.btpj.wanandroid.ui.main.mine +package com.btpj.module_mine.ui.mine import androidx.databinding.ObservableField import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel -import com.btpj.lib_base.ext.handleRequest +import com.btpj.lib_base.data.bean.CoinInfo import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.CoinInfo -import com.btpj.wanandroid.data.bean.User -import com.btpj.wanandroid.data.local.UserManager +import com.btpj.lib_base.data.bean.User +import com.btpj.lib_base.data.local.UserManager +import com.btpj.lib_base.ext.handleRequest +import com.btpj.module_mine.data.DataRepository class MineViewModel : BaseViewModel() { val user = ObservableField() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/setting/SettingActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingActivity.kt similarity index 75% rename from app/src/main/java/com/btpj/wanandroid/ui/setting/SettingActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingActivity.kt index f2fe28a..03940ec 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/setting/SettingActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingActivity.kt @@ -1,19 +1,19 @@ -package com.btpj.wanandroid.ui.setting +package com.btpj.module_mine.ui.setting import android.content.Context import android.content.Intent import android.os.Bundle -import com.btpj.lib_base.ext.showDialog import com.btpj.lib_base.http.RetrofitManager import com.btpj.lib_base.utils.AppUtil import com.btpj.lib_base.utils.CacheUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.Banner -import com.btpj.wanandroid.data.local.UserManager -import com.btpj.wanandroid.databinding.ActivitySettingBinding -import com.btpj.wanandroid.ui.web.WebActivity +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.Banner +import com.btpj.lib_base.data.local.UserManager +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.lib_base.ext.showDialog +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivitySettingBinding /** * 设置 @@ -21,7 +21,7 @@ import com.btpj.wanandroid.ui.web.WebActivity * @author LTP 2022/4/11 */ class SettingActivity : - BaseActivity(R.layout.activity_setting) { + BaseVMBActivity(R.layout.mine_activity_setting) { companion object { /** @@ -57,9 +57,11 @@ class SettingActivity : // 项目源码 tvSourceCode.setOnClickListener { - WebActivity.launch( - this@SettingActivity, - Banner(title = "项目源码", url = "https://gitee.com/BTPJ_git/WanAndroid") + ModuleWebApi.navToWebActivity( + Banner( + title = "项目源码", + url = "https://gitee.com/BTPJ_git/WanAndroid" + ) ) } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/setting/SettingViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingViewModel.kt similarity index 87% rename from app/src/main/java/com/btpj/wanandroid/ui/setting/SettingViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingViewModel.kt index c6a8cf5..19703fa 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/setting/SettingViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/setting/SettingViewModel.kt @@ -1,13 +1,12 @@ -package com.btpj.wanandroid.ui.setting +package com.btpj.module_mine.ui.setting import androidx.databinding.ObservableBoolean -import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.App.Companion.appContext import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.local.UserManager import com.btpj.lib_base.utils.ToastUtil -import com.btpj.wanandroid.data.local.UserManager import com.tencent.bugly.beta.Beta - /** * @author LTP 2022/4/11 */ diff --git a/app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleActivity.kt similarity index 72% rename from app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleActivity.kt index 38c9604..da53db0 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleActivity.kt @@ -1,48 +1,38 @@ -package com.btpj.wanandroid.ui.share.add +package com.btpj.module_mine.ui.share.add -import android.content.Context -import android.content.Intent import android.os.Bundle import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.lifecycle.lifecycleOwner +import com.alibaba.android.arouter.facade.annotation.Route import com.btpj.lib_base.ext.hideLoading -import com.btpj.lib_base.ext.showLoading import com.btpj.lib_base.utils.ToastUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.databinding.ActivityAddArticleBinding +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.export.ModuleMineApi +import com.btpj.lib_base.ext.showLoading +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityAddArticleBinding /** * 添加分享的文章 * * @author LTP 2022/4/12 */ +@Route(path = ModuleMineApi.ROUTER_MINE_ADD_ARTICLE_ACTIVITY) class AddArticleActivity : - BaseActivity(R.layout.activity_add_article) { - - companion object { - - /** - * 页面启动 - * @param context Context - */ - fun launch(context: Context) { - context.startActivity(Intent(context, AddArticleActivity::class.java)) - } - } + BaseVMBActivity(R.layout.mine_activity_add_article) { override fun initView(savedInstanceState: Bundle?) { mBinding.apply { - titleLayout.setRightView(R.drawable.ic_integral_rule) { + titleLayout.setRightView(com.btpj.lib_base.R.drawable.ic_integral_rule) { MaterialDialog(this@AddArticleActivity, BottomSheet()) .lifecycleOwner(this@AddArticleActivity) .show { title(text = "温馨提示") customView( - R.layout.dialog_share_article_tip, + R.layout.mine_dialog_share_article_tip, scrollable = true, horizontalPadding = true ) diff --git a/app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleViewModel.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleViewModel.kt index f089bde..8540007 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/share/add/AddArticleViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/share/add/AddArticleViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.share.add +package com.btpj.module_mine.ui.share.add import androidx.databinding.ObservableBoolean import androidx.databinding.ObservableField import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.local.UserManager import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.local.UserManager +import com.btpj.module_mine.data.DataRepository class AddArticleViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleActivity.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleActivity.kt similarity index 88% rename from app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleActivity.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleActivity.kt index 6b1e760..f7ebe7d 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleActivity.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleActivity.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.share.list +package com.btpj.module_mine.ui.share.list import android.annotation.SuppressLint import android.content.Context @@ -8,13 +8,13 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.export.ModuleMineApi import com.btpj.lib_base.ext.showDialog -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.databinding.ActivityIntegralRecordBinding -import com.btpj.wanandroid.ui.share.add.AddArticleActivity +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineActivityIntegralRecordBinding /** * 我分享的文章列表 @@ -22,7 +22,7 @@ import com.btpj.wanandroid.ui.share.add.AddArticleActivity * @author LTP 2022/4/12 */ class MyArticleActivity : - BaseActivity(R.layout.activity_integral_record) { + BaseVMBActivity(R.layout.mine_activity_integral_record) { /** 页数 */ private var mPageNo: Int = 0 @@ -43,7 +43,7 @@ class MyArticleActivity : override fun initView(savedInstanceState: Bundle?) { mBinding.apply { titleLayout.setTitleText("我分享的文章") - .setRightView(R.drawable.ic_add) { AddArticleActivity.launch(this@MyArticleActivity) } + .setRightView(com.btpj.lib_base.R.drawable.ic_add) { ModuleMineApi.navToAddArticleActivity() } includeList.apply { recyclerView.apply { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleAdapter.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleAdapter.kt similarity index 52% rename from app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleAdapter.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleAdapter.kt index 37267c6..fbf84a7 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleAdapter.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleAdapter.kt @@ -1,10 +1,10 @@ -package com.btpj.wanandroid.ui.share.list +package com.btpj.module_mine.ui.share.list import android.annotation.SuppressLint -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.databinding.ListItemShareArticleBinding -import com.btpj.wanandroid.ui.web.WebActivity +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_mine.R +import com.btpj.module_mine.databinding.MineListItemShareArticleBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -15,8 +15,8 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class MyArticleAdapter : - BaseQuickAdapter>( - layoutResId = R.layout.list_item_share_article + BaseQuickAdapter>( + layoutResId = R.layout.mine_list_item_share_article ), LoadMoreModule { init { @@ -25,14 +25,16 @@ class MyArticleAdapter : @SuppressLint("SetTextI18n") override fun convert( - holder: BaseDataBindingHolder, + holder: BaseDataBindingHolder, item: Article ) { holder.dataBinding?.apply { article = item executePendingBindings() - clItem.setOnClickListener { WebActivity.launch(context, item) } + clItem.setOnClickListener { + ModuleWebApi.navToWebActivity(item) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleViewModel.kt b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleViewModel.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleViewModel.kt rename to module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleViewModel.kt index d1ea96c..ad2faec 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/share/list/MyArticleViewModel.kt +++ b/module_mine/src/main/java/com/btpj/module_mine/ui/share/list/MyArticleViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.share.list +package com.btpj.module_mine.ui.share.list import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_mine.data.DataRepository class MyArticleViewModel : BaseViewModel() { val articlePageList = MutableLiveData>() diff --git a/app/src/main/res/layout/activity_add_article.xml b/module_mine/src/main/res/layout/mine_activity_add_article.xml similarity index 96% rename from app/src/main/res/layout/activity_add_article.xml rename to module_mine/src/main/res/layout/mine_activity_add_article.xml index 9b8df42..b6cb068 100644 --- a/app/src/main/res/layout/activity_add_article.xml +++ b/module_mine/src/main/res/layout/mine_activity_add_article.xml @@ -7,14 +7,14 @@ + type="com.btpj.module_mine.ui.share.add.AddArticleViewModel" /> + tools:context="com.btpj.module_mine.ui.share.add.AddArticleActivity"> + type="com.btpj.module_mine.ui.ip.ChangeIpViewModel" /> + tools:context="com.btpj.module_mine.ui.ip.ChangeIpActivity"> + tools:context="com.btpj.module_mine.ui.collect.CollectActivity"> + type="com.btpj.module_mine.ui.integral.rank.IntegralRankViewModel" /> + tools:context="layout.IntegralRankActivity"> + tools:context="com.btpj.module_mine.ui.integral.record.IntegralRecordActivity"> + type="com.btpj.module_mine.ui.login.LoginViewModel" /> + tools:context="com.btpj.module_mine.ui.login.LoginActivity"> + type="com.btpj.module_mine.ui.login.register.RegisterViewModel" /> + tools:context="com.btpj.module_mine.ui.login.register.RegisterActivity"> + type="com.btpj.module_mine.ui.setting.SettingViewModel" /> @@ -15,7 +15,7 @@ + tools:context="com.btpj.module_mine.ui.setting.SettingActivity"> + type="com.btpj.module_mine.ui.mine.MineViewModel" /> + type="com.btpj.lib_base.data.bean.CollectArticle" /> diff --git a/app/src/main/res/layout/list_item_collect_url.xml b/module_mine/src/main/res/layout/mine_list_item_collect_url.xml similarity index 97% rename from app/src/main/res/layout/list_item_collect_url.xml rename to module_mine/src/main/res/layout/mine_list_item_collect_url.xml index a316e90..a8c2f44 100644 --- a/app/src/main/res/layout/list_item_collect_url.xml +++ b/module_mine/src/main/res/layout/mine_list_item_collect_url.xml @@ -7,7 +7,7 @@ + type="com.btpj.lib_base.data.bean.CollectUrl" /> diff --git a/app/src/main/res/layout/list_item_integral.xml b/module_mine/src/main/res/layout/mine_list_item_integral.xml similarity index 97% rename from app/src/main/res/layout/list_item_integral.xml rename to module_mine/src/main/res/layout/mine_list_item_integral.xml index f63d79a..41897a9 100644 --- a/app/src/main/res/layout/list_item_integral.xml +++ b/module_mine/src/main/res/layout/mine_list_item_integral.xml @@ -7,7 +7,7 @@ + type="com.btpj.lib_base.data.bean.CoinInfo" /> + type="com.btpj.lib_base.data.bean.IntegralRecord" /> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_share_article.xml b/module_mine/src/main/res/layout/mine_list_item_share_article.xml similarity index 97% rename from app/src/main/res/layout/list_item_share_article.xml rename to module_mine/src/main/res/layout/mine_list_item_share_article.xml index 0de9d7f..4dde92b 100644 --- a/app/src/main/res/layout/list_item_share_article.xml +++ b/module_mine/src/main/res/layout/mine_list_item_share_article.xml @@ -7,7 +7,7 @@ + type="com.btpj.lib_base.data.bean.Article" /> diff --git a/app/src/main/res/menu/menu_integral_rank.xml b/module_mine/src/main/res/menu/mine_menu_integral_rank.xml similarity index 100% rename from app/src/main/res/menu/menu_integral_rank.xml rename to module_mine/src/main/res/menu/mine_menu_integral_rank.xml diff --git a/module_mine/src/main/res/mipmap-hdpi/ic_launcher.webp b/module_mine/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/module_mine/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/module_mine/src/main/res/mipmap-mdpi/ic_launcher.webp b/module_mine/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/module_mine/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/module_mine/src/main/res/mipmap-xhdpi/ic_launcher.webp b/module_mine/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/module_mine/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/module_mine/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/module_mine/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/module_mine/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/module_mine/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/module_mine/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/module_mine/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/module_mine/src/main/res/values-night/themes.xml b/module_mine/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..bf22505 --- /dev/null +++ b/module_mine/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_mine/src/main/res/values/themes.xml b/module_mine/src/main/res/values/themes.xml new file mode 100644 index 0000000..8c0c7ef --- /dev/null +++ b/module_mine/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_mine/src/test/java/com/btpj/module_mine/ExampleUnitTest.kt b/module_mine/src/test/java/com/btpj/module_mine/ExampleUnitTest.kt new file mode 100644 index 0000000..731aceb --- /dev/null +++ b/module_mine/src/test/java/com/btpj/module_mine/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_mine + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_project/.gitignore b/module_project/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_project/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_project/build.gradle b/module_project/build.gradle new file mode 100644 index 0000000..1770d8a --- /dev/null +++ b/module_project/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_project' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_project" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "project_" +} \ No newline at end of file diff --git a/module_project/proguard-rules.pro b/module_project/proguard-rules.pro new file mode 100644 index 0000000..d767f2e --- /dev/null +++ b/module_project/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_project.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_project/src/androidTest/java/com/btpj/module_project/ExampleInstrumentedTest.kt b/module_project/src/androidTest/java/com/btpj/module_project/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0feeed5 --- /dev/null +++ b/module_project/src/androidTest/java/com/btpj/module_project/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_project + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_project", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_project/src/main/AndroidManifest.xml b/module_project/src/main/AndroidManifest.xml new file mode 100644 index 0000000..568741e --- /dev/null +++ b/module_project/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module_project/src/main/alone/AndroidManifest.xml b/module_project/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..105d850 --- /dev/null +++ b/module_project/src/main/alone/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_project/src/main/java/com/btpj/module_project/data/DataRepository.kt b/module_project/src/main/java/com/btpj/module_project/data/DataRepository.kt new file mode 100644 index 0000000..564bfbd --- /dev/null +++ b/module_project/src/main/java/com/btpj/module_project/data/DataRepository.kt @@ -0,0 +1,46 @@ +package com.btpj.module_project.data + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.module_project.data.http.Api +import retrofit2.http.Path +import retrofit2.http.Query + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + + override suspend fun collectArticle(id: Int): ApiResponse { + return apiCall { service.collectArticle(id) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } + + override suspend fun getProjectTitleList(): ApiResponse> { + return apiCall { service.getProjectTitleList() } + } + + override suspend fun getNewProjectPageList( + pageNo: Int, + pageSize: Int + ): ApiResponse> { + return apiCall { service.getNewProjectPageList(pageNo, pageSize) } + } + + override suspend fun getProjectPageList( + @Path(value = "pageNo") pageNo: Int, + @Query(value = "page_size") pageSize: Int, + @Query(value = "cid") categoryId: Int + ): ApiResponse> { + return apiCall { service.getProjectPageList(pageNo, pageSize, categoryId) } + } +} \ No newline at end of file diff --git a/module_project/src/main/java/com/btpj/module_project/data/http/Api.kt b/module_project/src/main/java/com/btpj/module_project/data/http/Api.kt new file mode 100644 index 0000000..0f1056e --- /dev/null +++ b/module_project/src/main/java/com/btpj/module_project/data/http/Api.kt @@ -0,0 +1,39 @@ +package com.btpj.module_project.data.http + +import com.btpj.lib_base.data.bean.* +import retrofit2.http.* + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 收藏站内文章 */ + @POST("lg/collect/{id}/json") + suspend fun collectArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse + + /** 获取项目分类数据 */ + @GET("project/tree/json") + suspend fun getProjectTitleList(): ApiResponse> + + /** 获取最新项目列表分页数据 */ + @GET("article/listproject/{pageNo}/json") + suspend fun getNewProjectPageList( + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int + ): ApiResponse> + + /** 获取项目列表分页数据 */ + @GET("project/list/{pageNo}/json") + suspend fun getProjectPageList( + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int, + @Query("cid") categoryId: Int + ): ApiResponse> +} \ No newline at end of file diff --git a/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneActivity.kt b/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneActivity.kt new file mode 100644 index 0000000..c8e8599 --- /dev/null +++ b/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneActivity.kt @@ -0,0 +1,22 @@ +package com.btpj.module_project.ui.alone + +import android.os.Bundle +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.databinding.CommonContainerBinding +import com.btpj.lib_base.export.ModuleProjectApi + +/** + * 作为Application时的测试页面 + * + * @author LTP 2022/4/8 + */ +class AloneActivity : + BaseVMBActivity(R.layout.common_container) { + + override fun initView(savedInstanceState: Bundle?) { + supportFragmentManager.beginTransaction() + .add(R.id.fl_container, ModuleProjectApi.getProjectFragment()) + .commit() + } +} \ No newline at end of file diff --git a/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneViewModel.kt b/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneViewModel.kt new file mode 100644 index 0000000..7bfc439 --- /dev/null +++ b/module_project/src/main/java/com/btpj/module_project/ui/alone/AloneViewModel.kt @@ -0,0 +1,10 @@ +package com.btpj.module_project.ui.alone + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author LTP 2022/3/9 + */ +class AloneViewModel : BaseViewModel() { + override fun start() {} +} \ No newline at end of file diff --git a/module_project/src/main/java/com/btpj/module_project/ui/project/ImageArticleAdapter.kt b/module_project/src/main/java/com/btpj/module_project/ui/project/ImageArticleAdapter.kt new file mode 100644 index 0000000..f89fbfc --- /dev/null +++ b/module_project/src/main/java/com/btpj/module_project/ui/project/ImageArticleAdapter.kt @@ -0,0 +1,37 @@ +package com.btpj.module_project.ui.project + +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_project.R +import com.btpj.module_project.databinding.ProjectListItemArticleImageBinding +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder + +/** + * 带图片的文章列表的Adapter + * + * @author LTP 2022/3/23 + */ +class ImageArticleAdapter : + BaseQuickAdapter>(layoutResId = R.layout.project_list_item_article_image), + LoadMoreModule { + + init { + setAnimationWithDefault(AnimationType.ScaleIn) + } + + override fun convert( + holder: BaseDataBindingHolder, + item: Article + ) { + holder.dataBinding?.apply { + article = item + executePendingBindings() + + clItem.setOnClickListener { + ModuleWebApi.navToWebActivity(item) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildFragment.kt b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildFragment.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildFragment.kt rename to module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildFragment.kt index 1cc1a13..25edfa3 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildFragment.kt +++ b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildFragment.kt @@ -1,19 +1,18 @@ -package com.btpj.wanandroid.ui.main.project +package com.btpj.module_project.ui.project import android.annotation.SuppressLint import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.HomeViewModel +import com.btpj.lib_base.R +import com.btpj.lib_base.export.ModuleHomeApi /** * 项目Tab下的子Fragment @@ -21,7 +20,7 @@ import com.btpj.wanandroid.ui.main.home.HomeViewModel * @author LTP 2022/3/10 */ class ProjectChildFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { /** 列表总数 */ private var mTotalCount: Int = 0 @@ -63,10 +62,8 @@ class ProjectChildFragment : setOnItemChildClickListener { _, view, position -> when (view.id) { // 查看作者文章列表 - R.id.tv_author -> AuthorActivity.launch( - requireContext(), - mAdapter.getItem(position).userId - ) + R.id.tv_author -> + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) R.id.iv_collect -> if (mAdapter.getItem(position).collect) { mViewModel.unCollectArticle(mAdapter.getItem(position).id) { @@ -172,7 +169,7 @@ class ProjectChildFragment : mCurrentCount = data.size loadMoreModule.apply { isEnableLoadMore = true - if (list.size < HomeViewModel.PAGE_SIZE || mCurrentCount == mTotalCount) { + if (list.size < ProjectChildViewModel.PAGE_SIZE || mCurrentCount == mTotalCount) { // 如果加载到的数据不够一页或都已加载完,显示没有更多数据布局, // 当然后台接口不同分页方式判断方法不同,这个是比较通用的(通常都有TotalCount) loadMoreEnd() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildViewModel.kt b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildViewModel.kt similarity index 92% rename from app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildViewModel.kt rename to module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildViewModel.kt index 9a97b6d..29c7cee 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectChildViewModel.kt +++ b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectChildViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.main.project +package com.btpj.module_project.ui.project import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_project.data.DataRepository class ProjectChildViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectFragment.kt b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectFragment.kt similarity index 84% rename from app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectFragment.kt rename to module_project/src/main/java/com/btpj/module_project/ui/project/ProjectFragment.kt index 22e1bd5..242719a 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectFragment.kt +++ b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectFragment.kt @@ -1,13 +1,15 @@ -package com.btpj.wanandroid.ui.main.project +package com.btpj.module_project.ui.project import android.annotation.SuppressLint import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.ProjectTitle +import com.btpj.lib_base.databinding.CommonFragmentViewpagerBinding import com.btpj.lib_base.ext.toHtml -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.ProjectTitle -import com.btpj.wanandroid.databinding.FragmentViewpagerBinding +import com.btpj.lib_base.R +import com.btpj.lib_base.export.ModuleProjectApi import com.google.android.material.tabs.TabLayoutMediator /** @@ -15,8 +17,9 @@ import com.google.android.material.tabs.TabLayoutMediator * * @author LTP 2022/3/10 */ +@Route(path = ModuleProjectApi.ROUTER_PROJECT_PROJECT_FRAGMENT) class ProjectFragment : - BaseFragment(R.layout.fragment_viewpager) { + BaseVMBFragment(R.layout.common_fragment_viewpager) { /** TabLayout的标题集合 */ private val mProjectTitleList = ArrayList() @@ -26,10 +29,6 @@ class ProjectFragment : private lateinit var mFragmentStateAdapter: FragmentStateAdapter - companion object { - fun newInstance() = ProjectFragment() - } - override fun initView() { mFragmentStateAdapter = object : FragmentStateAdapter(parentFragmentManager, lifecycle) { override fun getItemCount(): Int { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectViewModel.kt b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectViewModel.kt similarity index 81% rename from app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectViewModel.kt rename to module_project/src/main/java/com/btpj/module_project/ui/project/ProjectViewModel.kt index 036dbc0..6f77e04 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/project/ProjectViewModel.kt +++ b/module_project/src/main/java/com/btpj/module_project/ui/project/ProjectViewModel.kt @@ -1,11 +1,11 @@ -package com.btpj.wanandroid.ui.main.project +package com.btpj.module_project.ui.project import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.ProjectTitle +import com.btpj.lib_base.data.bean.ProjectTitle +import com.btpj.module_project.data.DataRepository class ProjectViewModel : BaseViewModel() { diff --git a/app/src/main/res/layout/list_item_article_image.xml b/module_project/src/main/res/layout/project_list_item_article_image.xml similarity index 98% rename from app/src/main/res/layout/list_item_article_image.xml rename to module_project/src/main/res/layout/project_list_item_article_image.xml index ccced1d..0f58924 100644 --- a/app/src/main/res/layout/list_item_article_image.xml +++ b/module_project/src/main/res/layout/project_list_item_article_image.xml @@ -7,7 +7,7 @@ + type="com.btpj.lib_base.data.bean.Article" /> diff --git a/module_project/src/main/res/mipmap-hdpi/ic_launcher.webp b/module_project/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/module_project/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/module_project/src/main/res/mipmap-mdpi/ic_launcher.webp b/module_project/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/module_project/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/module_project/src/main/res/mipmap-xhdpi/ic_launcher.webp b/module_project/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/module_project/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/module_project/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/module_project/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/module_project/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/module_project/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/module_project/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/module_project/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/module_project/src/main/res/values-night/themes.xml b/module_project/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..f13fcb3 --- /dev/null +++ b/module_project/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_project/src/main/res/values/themes.xml b/module_project/src/main/res/values/themes.xml new file mode 100644 index 0000000..8140ed5 --- /dev/null +++ b/module_project/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_project/src/test/java/com/btpj/module_project/ExampleUnitTest.kt b/module_project/src/test/java/com/btpj/module_project/ExampleUnitTest.kt new file mode 100644 index 0000000..a50788c --- /dev/null +++ b/module_project/src/test/java/com/btpj/module_project/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_project + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_square/.gitignore b/module_square/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_square/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_square/build.gradle b/module_square/build.gradle new file mode 100644 index 0000000..fe685c4 --- /dev/null +++ b/module_square/build.gradle @@ -0,0 +1,21 @@ +apply from: "../module.build.gradle" +apply plugin: 'org.jetbrains.kotlin.android' + +android { + namespace 'com.btpj.module_square' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_square" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "square_" +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' +} \ No newline at end of file diff --git a/module_square/proguard-rules.pro b/module_square/proguard-rules.pro new file mode 100644 index 0000000..d23eb31 --- /dev/null +++ b/module_square/proguard-rules.pro @@ -0,0 +1,176 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_square.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_square/src/androidTest/java/com/btpj/module_square/ExampleInstrumentedTest.kt b/module_square/src/androidTest/java/com/btpj/module_square/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..d61c6b4 --- /dev/null +++ b/module_square/src/androidTest/java/com/btpj/module_square/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_square + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_square", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_square/src/main/AndroidManifest.xml b/module_square/src/main/AndroidManifest.xml new file mode 100644 index 0000000..48bec07 --- /dev/null +++ b/module_square/src/main/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/module_square/src/main/alone/AndroidManifest.xml b/module_square/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..c6cae8f --- /dev/null +++ b/module_square/src/main/alone/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/data/DataRepository.kt b/module_square/src/main/java/com/btpj/module_square/data/DataRepository.kt new file mode 100644 index 0000000..8709501 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/data/DataRepository.kt @@ -0,0 +1,53 @@ +package com.btpj.module_square.data + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.module_square.data.http.Api + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + override suspend fun collectArticle(id: Int): ApiResponse { + return apiCall { service.collectArticle(id) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } + + override suspend fun getSquarePageList( + pageNo: Int, + pageSize: Int + ): ApiResponse> { + return apiCall { service.getSquarePageList(pageNo, pageSize) } + } + + override suspend fun getAskPageList( + pageNo: Int + ): ApiResponse> { + return apiCall { service.getAskPageList(pageNo) } + } + + override suspend fun getTreeList(): ApiResponse> { + return apiCall { service.getTreeList() } + } + + override suspend fun getNavigationList(): ApiResponse> { + return apiCall { service.getNavigationList() } + } + + override suspend fun getSystemArticlePageList( + pageNo: Int, + pageSize: Int, + categoryId: Int + ): ApiResponse> { + return apiCall { service.getSystemArticlePageList(pageNo, pageSize, categoryId) } + } +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/data/http/Api.kt b/module_square/src/main/java/com/btpj/module_square/data/http/Api.kt new file mode 100644 index 0000000..de218f0 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/data/http/Api.kt @@ -0,0 +1,47 @@ +package com.btpj.module_square.data.http + +import com.btpj.lib_base.data.bean.* +import retrofit2.http.* + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 收藏站内文章 */ + @POST("lg/collect/{id}/json") + suspend fun collectArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse + + /** 获取广场列表分页数据 */ + @GET("user_article/list/{pageNo}/json") + suspend fun getSquarePageList( + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int + ): ApiResponse> + + /** 获取每日一问列表分页数据 */ + @GET("wenda/list/{pageNo}/json") + suspend fun getAskPageList(@Path("pageNo") pageNo: Int): ApiResponse> + + /** 获取体系数据 */ + @GET("tree/json") + suspend fun getTreeList(): ApiResponse> + + /** 获取导航数据 */ + @GET("navi/json") + suspend fun getNavigationList(): ApiResponse> + + /** 获取体系文章列表数据 */ + @GET("article/list/{pageNo}/json") + suspend fun getSystemArticlePageList( + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int, + @Query("cid") categoryId: Int + ): ApiResponse> +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneActivity.kt b/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneActivity.kt new file mode 100644 index 0000000..79343d7 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneActivity.kt @@ -0,0 +1,22 @@ +package com.btpj.module_square.ui.alone + +import android.os.Bundle +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.databinding.CommonContainerBinding +import com.btpj.lib_base.export.ModuleSquareApi + +/** + * 作为Application时的测试页面 + * + * @author LTP 2022/4/8 + */ +class AloneActivity : + BaseVMBActivity(R.layout.common_container) { + + override fun initView(savedInstanceState: Bundle?) { + supportFragmentManager.beginTransaction() + .add(R.id.fl_container, ModuleSquareApi.getSquareFragment()) + .commit() + } +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneViewModel.kt new file mode 100644 index 0000000..6627879 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/alone/AloneViewModel.kt @@ -0,0 +1,10 @@ +package com.btpj.module_square.ui.alone + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author LTP 2022/3/9 + */ +class AloneViewModel : BaseViewModel() { + override fun start() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/SquareFragment.kt similarity index 75% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareFragment.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/SquareFragment.kt index ec483a6..26c9b6d 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareFragment.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/SquareFragment.kt @@ -1,19 +1,21 @@ -package com.btpj.wanandroid.ui.main.square +package com.btpj.module_square.ui.square import androidx.constraintlayout.widget.ConstraintLayout import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.databinding.CommonFragmentViewpagerBinding import com.btpj.lib_base.utils.ScreenUtil -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.databinding.FragmentViewpagerBinding -import com.btpj.wanandroid.ext.launchCheckLogin -import com.btpj.wanandroid.ui.main.square.ask.AskFragment -import com.btpj.wanandroid.ui.main.square.navigation.NavigationFragment -import com.btpj.wanandroid.ui.main.square.square.SquareChildFragment -import com.btpj.wanandroid.ui.main.square.system.SystemFragment -import com.btpj.wanandroid.ui.share.add.AddArticleActivity +import com.btpj.lib_base.R +import com.btpj.lib_base.export.ModuleMineApi +import com.btpj.lib_base.export.ModuleSquareApi +import com.btpj.lib_base.ext.launchCheckLogin +import com.btpj.module_square.ui.square.ask.AskFragment +import com.btpj.module_square.ui.square.navigation.NavigationFragment +import com.btpj.module_square.ui.square.square.SquareChildFragment +import com.btpj.module_square.ui.square.system.SystemFragment import com.google.android.material.tabs.TabLayoutMediator /** @@ -21,8 +23,9 @@ import com.google.android.material.tabs.TabLayoutMediator * * @author LTP 2022/3/10 */ +@Route(path = ModuleSquareApi.ROUTER_SQUARE_SQUARE_FRAGMENT) class SquareFragment : - BaseFragment(R.layout.fragment_viewpager) { + BaseVMBFragment(R.layout.common_fragment_viewpager) { /** 标题 */ private val mTitleList = arrayListOf("广场", "每日一问", "体系", "导航") @@ -36,7 +39,9 @@ class SquareFragment : super.onPageSelected(position) if (position == 0) { mBinding.titleLayout.setRightView(R.drawable.ic_add) { - requireContext().launchCheckLogin { AddArticleActivity.launch(it) } + requireContext().launchCheckLogin { + ModuleMineApi.navToAddArticleActivity() + } } } else { mBinding.titleLayout.setRightView("") @@ -51,10 +56,6 @@ class SquareFragment : mFragmentList.add(NavigationFragment.newInstance()) } - companion object { - fun newInstance() = SquareFragment() - } - override fun initView() { mFragmentStateAdapter = object : FragmentStateAdapter(parentFragmentManager, lifecycle) { override fun getItemCount(): Int { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/SquareViewModel.kt similarity index 74% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareViewModel.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/SquareViewModel.kt index c5bc3ba..e79cd90 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/SquareViewModel.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/SquareViewModel.kt @@ -1,4 +1,4 @@ -package com.btpj.wanandroid.ui.main.square +package com.btpj.module_square.ui.square import com.btpj.lib_base.base.BaseViewModel diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskFragment.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskFragment.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskFragment.kt index 74185a3..21868ad 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskFragment.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskFragment.kt @@ -1,18 +1,18 @@ -package com.btpj.wanandroid.ui.main.square.ask +package com.btpj.module_square.ui.square.ask import android.annotation.SuppressLint import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.adapter.ArticleAdapter import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.R +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.ArticleAdapter /** * 广场Tab里的每日一问 @@ -20,7 +20,7 @@ import com.btpj.wanandroid.ui.main.home.ArticleAdapter * @author LTP 2022/3/10 */ class AskFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { /** 列表总数 */ private var mTotalCount: Int = 0 @@ -50,10 +50,7 @@ class AskFragment : when (view.id) { // 查看作者文章列表 R.id.tv_author -> - AuthorActivity.launch( - requireContext(), - mAdapter.getItem(position).userId - ) + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) // 收藏与取消收藏 R.id.iv_collect -> if (mAdapter.getItem(position).collect) { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskViewModel.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskViewModel.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskViewModel.kt index 7019d9a..50e1876 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/ask/AskViewModel.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/ask/AskViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.main.square.ask +package com.btpj.module_square.ui.square.ask import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_square.data.DataRepository class AskViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationAdapter.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationAdapter.kt similarity index 59% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationAdapter.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationAdapter.kt index 02d2224..1591e22 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationAdapter.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationAdapter.kt @@ -1,8 +1,9 @@ -package com.btpj.wanandroid.ui.main.square.navigation +package com.btpj.module_square.ui.square.navigation -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Navigation -import com.btpj.wanandroid.databinding.ListItemSystemBinding +import com.btpj.lib_base.data.bean.Navigation +import com.btpj.lib_base.export.ModuleWebApi +import com.btpj.module_square.R +import com.btpj.module_square.databinding.SquareListItemSystemBinding import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -14,14 +15,17 @@ import com.google.android.flexbox.FlexboxLayoutManager * @author LTP 2022/3/23 */ class NavigationAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_system), + BaseQuickAdapter>(layoutResId = R.layout.square_list_item_system), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: Navigation) { + override fun convert( + holder: BaseDataBindingHolder, + item: Navigation + ) { holder.dataBinding?.apply { text = item.name executePendingBindings() @@ -32,6 +36,9 @@ class NavigationAdapter : setItemViewCacheSize(200) // 设置缓存大小为200,默认为2 adapter = NavigationChildAdapter().apply { setList(item.articles) + setOnItemClickListener { _, _, position -> + ModuleWebApi.navToWebActivity(item.articles[position]) + } } } } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationChildAdapter.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationChildAdapter.kt similarity index 55% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationChildAdapter.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationChildAdapter.kt index e7aa803..3b450a7 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationChildAdapter.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationChildAdapter.kt @@ -1,8 +1,8 @@ -package com.btpj.wanandroid.ui.main.square.navigation +package com.btpj.module_square.ui.square.navigation -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.databinding.ListItemTvBinding +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.databinding.CommonListItemTvBinding +import com.btpj.lib_base.R import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -13,14 +13,14 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class NavigationChildAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_tv), + BaseQuickAdapter>(layoutResId = R.layout.common_list_item_tv), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: Article) { + override fun convert(holder: BaseDataBindingHolder, item: Article) { holder.dataBinding?.apply { text = item.title executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationFragment.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationFragment.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationFragment.kt index b6c3b97..1d2ea85 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationFragment.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationFragment.kt @@ -1,11 +1,12 @@ -package com.btpj.wanandroid.ui.main.square.navigation +package com.btpj.module_square.ui.square.navigation import androidx.recyclerview.widget.LinearLayoutManager import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBFragment import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding + /** * 广场Tab下的体系 @@ -13,7 +14,7 @@ import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding * @author LTP 2022/4/7 */ class NavigationFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { private val mAdapter by lazy { NavigationAdapter() } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationViewModel.kt similarity index 79% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationViewModel.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationViewModel.kt index c9b85c0..73a4cd6 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/navigation/NavigationViewModel.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/navigation/NavigationViewModel.kt @@ -1,11 +1,11 @@ -package com.btpj.wanandroid.ui.main.square.navigation +package com.btpj.module_square.ui.square.navigation import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Navigation +import com.btpj.lib_base.data.bean.Navigation +import com.btpj.module_square.data.DataRepository class NavigationViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildFragment.kt similarity index 88% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildFragment.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildFragment.kt index 7b107c1..224522a 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildFragment.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildFragment.kt @@ -1,18 +1,18 @@ -package com.btpj.wanandroid.ui.main.square.square +package com.btpj.module_square.ui.square.square import android.annotation.SuppressLint import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.adapter.ArticleAdapter import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.R +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.ArticleAdapter /** * 广场Tab里的子广场 @@ -20,7 +20,7 @@ import com.btpj.wanandroid.ui.main.home.ArticleAdapter * @author LTP 2022/3/10 */ class SquareChildFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { /** 页数 */ private var mPageNo: Int = 0 @@ -44,10 +44,7 @@ class SquareChildFragment : when (view.id) { // 查看作者文章列表 R.id.tv_author -> - AuthorActivity.launch( - requireContext(), - mAdapter.getItem(position).userId - ) + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) // 收藏与取消收藏 R.id.iv_collect -> if (mAdapter.getItem(position).collect) { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildViewModel.kt similarity index 90% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildViewModel.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildViewModel.kt index f86e41f..592db0e 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/square/SquareChildViewModel.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/square/SquareChildViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.main.square.square +package com.btpj.module_square.ui.square.square import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_square.data.DataRepository class SquareChildViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemAdapter.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemAdapter.kt similarity index 58% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemAdapter.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemAdapter.kt index 85362ac..8866ffa 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemAdapter.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemAdapter.kt @@ -1,8 +1,9 @@ -package com.btpj.wanandroid.ui.main.square.system +package com.btpj.module_square.ui.square.system -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.System -import com.btpj.wanandroid.databinding.ListItemSystemBinding +import com.btpj.lib_base.data.bean.MySystem +import com.btpj.module_square.R +import com.btpj.module_square.databinding.SquareListItemSystemBinding +import com.btpj.module_square.ui.square.system.details.SystemArticleListActivity import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -14,14 +15,17 @@ import com.google.android.flexbox.FlexboxLayoutManager * @author LTP 2022/3/23 */ class SystemAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_system), + BaseQuickAdapter>(layoutResId = R.layout.square_list_item_system), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: System) { + override fun convert( + holder: BaseDataBindingHolder, + item: MySystem + ) { holder.dataBinding?.apply { text = item.name executePendingBindings() @@ -32,6 +36,9 @@ class SystemAdapter : setItemViewCacheSize(200) // 设置缓存大小为200,默认为2 adapter = SystemChildAdapter().apply { setList(item.children) + setOnItemClickListener { _, _, position -> + SystemArticleListActivity.launch(context, item, position) + } } } } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemChildAdapter.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemChildAdapter.kt similarity index 50% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemChildAdapter.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemChildAdapter.kt index 2bb8ea5..0e0aa8c 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemChildAdapter.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemChildAdapter.kt @@ -1,8 +1,9 @@ -package com.btpj.wanandroid.ui.main.square.system +package com.btpj.module_square.ui.square.system -import com.btpj.wanandroid.R -import com.btpj.wanandroid.data.bean.Classify -import com.btpj.wanandroid.databinding.ListItemTvBinding +import com.btpj.lib_base.R +import com.btpj.lib_base.data.bean.Classify +import com.btpj.lib_base.databinding.CommonListItemTvBinding +import com.btpj.module_square.ui.square.system.details.SystemArticleListActivity import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.module.LoadMoreModule import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder @@ -13,14 +14,14 @@ import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder * @author LTP 2022/3/23 */ class SystemChildAdapter : - BaseQuickAdapter>(layoutResId = R.layout.list_item_tv), + BaseQuickAdapter>(layoutResId = R.layout.common_list_item_tv), LoadMoreModule { init { setAnimationWithDefault(AnimationType.ScaleIn) } - override fun convert(holder: BaseDataBindingHolder, item: Classify) { + override fun convert(holder: BaseDataBindingHolder, item: Classify) { holder.dataBinding?.apply { text = item.name executePendingBindings() diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemFragment.kt similarity index 79% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemFragment.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemFragment.kt index afe7eab..4643224 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemFragment.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemFragment.kt @@ -1,11 +1,12 @@ -package com.btpj.wanandroid.ui.main.square.system +package com.btpj.module_square.ui.square.system import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.module_square.ui.square.system.details.SystemArticleListActivity /** * 广场Tab下的体系 @@ -13,7 +14,7 @@ import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding * @author LTP 2022/4/7 */ class SystemFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { private val mAdapter by lazy { SystemAdapter() } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemViewModel.kt similarity index 59% rename from app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemViewModel.kt rename to module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemViewModel.kt index f28b7c1..8d104ca 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/square/system/SystemViewModel.kt +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/SystemViewModel.kt @@ -1,25 +1,25 @@ -package com.btpj.wanandroid.ui.main.square.system +package com.btpj.module_square.ui.square.system import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.System +import com.btpj.lib_base.data.bean.MySystem +import com.btpj.module_square.data.DataRepository class SystemViewModel : BaseViewModel() { /** 体系列表LiveData */ - val systemListLiveData = MutableLiveData>() + val systemListLiveData = MutableLiveData>() override fun start() { } /** 请求体系列表 */ - fun fetchSystemList(pageNo: Int = 0) { + fun fetchSystemList() { launch({ - handleRequest(DataRepository.getTreeList(), { systemListLiveData.value = it.data }) + handleRequest(DataRepository.getTreeList(), { systemListLiveData.value = it.data!! }) }) } } \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildFragment.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildFragment.kt new file mode 100644 index 0000000..0c159e6 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildFragment.kt @@ -0,0 +1,170 @@ +package com.btpj.module_square.ui.square.system.details + +import android.os.Bundle +import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.R +import com.btpj.lib_base.adapter.ArticleAdapter +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.lib_base.export.ModuleHomeApi +import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.ext.initColors + +/** + * 广场Tab下的体系 + * + * @author LTP 2022/4/7 + */ +class SystemArticleChildFragment : + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { + + /** 列表总数 */ + private var mTotalCount: Int = 0 + + /** 页数 */ + private var mPageNo: Int = 0 + + /** 当前列表的数量 */ + private var mCurrentCount: Int = 0 + + private val mCategoryId by lazy { arguments?.getInt(EXTRA_CATEGORY_ID) ?: 0 } + + private val mAdapter by lazy { ArticleAdapter() } + + companion object { + private const val EXTRA_CATEGORY_ID = "extra_category_id" + + fun newInstance(categoryId: Int) = SystemArticleChildFragment().apply { + arguments = Bundle().apply { putInt(EXTRA_CATEGORY_ID, categoryId) } + } + } + + override fun initView() { + mBinding.apply { + recyclerView.apply { + layoutManager = LinearLayoutManager(context) + adapter = mAdapter.apply { + loadMoreModule.setOnLoadMoreListener { loadMoreData() } + addChildClickViewIds( + R.id.tv_author, + R.id.iv_collect + ) + setOnItemChildClickListener { _, view, position -> + when (view.id) { + // 查看作者文章列表 + R.id.tv_author -> + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) + // 收藏与取消收藏 + R.id.iv_collect -> + if (mAdapter.getItem(position).collect) { + mViewModel.unCollectArticle(mAdapter.getItem(position).id) { + // 取消收藏成功后,手动更改避免刷新整个列表 + mAdapter.getItem(position).collect = false + // 注意:这里position需要+1,因为0位置属于轮播图HeaderView + mAdapter.notifyItemChanged(position + 1) + App.appViewModel.collectEvent.setValue( + CollectData( + mAdapter.getItem(position).id, + collect = false + ) + ) + } + } else { + mViewModel.collectArticle(mAdapter.getItem(position).id) { + // 收藏成功后,手动更改避免刷新整个列表 + mAdapter.getItem(position).collect = true + mAdapter.notifyItemChanged(position + 1) + App.appViewModel.collectEvent.setValue( + CollectData( + mAdapter.getItem(position).id, + collect = true + ) + ) + } + } + } + } + } + } + + swipeRefreshLayout.apply { + initColors() + setOnRefreshListener { onRefresh() } + } + + } + } + + override fun lazyLoadData() { + super.lazyLoadData() + onRefresh() + } + + override fun createObserve() { + super.createObserve() + mViewModel.articlePageListLiveData.observe(viewLifecycleOwner) { + it?.let { handleArticleData(it) } + } + } + + /** + * 文章分页数据处理 + * + * @param pageResponse + */ + private fun handleArticleData(pageResponse: PageResponse
) { + mPageNo = pageResponse.curPage + mTotalCount = pageResponse.pageCount + val list = pageResponse.datas + mAdapter.apply { + if (mPageNo == 1) { + if (list.isEmpty()) { + setEmptyView(recyclerView.getEmptyView()) + } + // 如果是加载的第一页数据,用 setData() + setList(list) + } else { + // 不是第一页,则用add + addData(list) + } + mCurrentCount = data.size + loadMoreModule.apply { + isEnableLoadMore = true + if (list.size < SystemArticleChildViewModel.PAGE_SIZE || mCurrentCount == mTotalCount) { + // 如果加载到的数据不够一页或都已加载完,显示没有更多数据布局, + // 当然后台接口不同分页方式判断方法不同,这个是比较通用的(通常都有TotalCount) + loadMoreEnd() + } else { + loadMoreComplete() + } + } + mBinding.swipeRefreshLayout.isEnabled = true + } + mBinding.swipeRefreshLayout.isRefreshing = false + } + + + /**下拉刷新 */ + private fun onRefresh() { + mBinding.swipeRefreshLayout.isRefreshing = true + // 这里的作用是防止下拉刷新的时候还可以上拉加载 + mAdapter.loadMoreModule.isEnableLoadMore = false + mViewModel.apply { fetchArticlePageList(categoryId = mCategoryId) } + } + + /** 下拉加载更多 */ + private fun loadMoreData() { + // 上拉加载时禁止下拉刷新 + mBinding.swipeRefreshLayout.isEnabled = false + mViewModel.fetchArticlePageList(++mPageNo, mCategoryId) + } + + override fun requestError(msg: String?) { + super.requestError(msg) + mBinding.swipeRefreshLayout.isRefreshing = false + } +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildViewModel.kt new file mode 100644 index 0000000..4ed0bd3 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleChildViewModel.kt @@ -0,0 +1,57 @@ +package com.btpj.module_square.ui.square.system.details + +import androidx.lifecycle.MutableLiveData +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.ext.handleRequest +import com.btpj.lib_base.ext.launch +import com.btpj.module_square.data.DataRepository + +class SystemArticleChildViewModel : BaseViewModel() { + + companion object { + /** 每页显示的条目大小 */ + const val PAGE_SIZE = 10 + } + + /** 体系列表LiveData */ + val articlePageListLiveData = MutableLiveData>() + + override fun start() { + + } + + /** 请求体系下的文章列表 */ + fun fetchArticlePageList(pageNo: Int = 0, categoryId: Int) { + launch({ + handleRequest( + DataRepository.getSystemArticlePageList(pageNo, PAGE_SIZE, categoryId), + { articlePageListLiveData.value = it.data!! }) + }) + } + + /** + * 收藏文章 + * @param id 文章id + */ + fun collectArticle(id: Int, successCallBack: () -> Any? = {}) { + launch({ + handleRequest(DataRepository.collectArticle(id), { + successCallBack.invoke() + }) + }) + } + + /** + * 取消收藏文章 + * @param id 文章id + */ + fun unCollectArticle(id: Int, successCallBack: () -> Any? = {}) { + launch({ + handleRequest(DataRepository.unCollectArticle(id), { + successCallBack.invoke() + }) + }) + } +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListActivity.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListActivity.kt new file mode 100644 index 0000000..93fe875 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListActivity.kt @@ -0,0 +1,84 @@ +package com.btpj.module_square.ui.square.system.details + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.MySystem +import com.btpj.module_square.R +import com.btpj.module_square.databinding.ActivitySystemArticleListBinding +import com.google.android.material.tabs.TabLayoutMediator + +/** + * 体系文章详情页面 + * + * @author LTP 2024/1/18 + */ +class SystemArticleListActivity : + BaseVMBActivity( + R.layout.activity_system_article_list + ) { + + private var mPageIndex = 0 + private lateinit var mySystem: MySystem + private lateinit var mTitleList: List + private lateinit var mFragmentList: List + + private lateinit var mTabLayoutMediator: TabLayoutMediator + private lateinit var mFragmentStateAdapter: FragmentStateAdapter + + companion object { + private const val EXTRA_MY_SYSTEM = "extra_my_system" + private const val EXTRA_PAGE_INDEX = "extra_page_index" + + /** + * 页面启动 + * @param context Context + */ + fun launch(context: Context, mySystem: MySystem, pageIndex: Int = 0) { + context.startActivity(Intent(context, SystemArticleListActivity::class.java).apply { + putExtra(EXTRA_MY_SYSTEM, mySystem) + putExtra(EXTRA_PAGE_INDEX, pageIndex) + }) + } + } + + override fun initView(savedInstanceState: Bundle?) { + mySystem = intent.getParcelableExtra(EXTRA_MY_SYSTEM)!! + mViewModel.title.set(mySystem.name) + mPageIndex = intent.getIntExtra(EXTRA_PAGE_INDEX, 0) + + mTitleList = mySystem.children.map { it.name } + mFragmentList = + (1..mTitleList.size).map { SystemArticleChildFragment.newInstance(mySystem.id) } + + mFragmentStateAdapter = object : FragmentStateAdapter(supportFragmentManager, lifecycle) { + override fun getItemCount(): Int { + return mTitleList.size + } + + override fun createFragment(position: Int): Fragment { + return mFragmentList[position] + } + } + + mBinding.apply { + viewPager2.apply { + adapter = mFragmentStateAdapter + offscreenPageLimit = mFragmentList.size + } + + mTabLayoutMediator = TabLayoutMediator(tabLayout, viewPager2) { tab, position -> + tab.apply { + // 处理长按出现toast的问题 + view.setOnLongClickListener { true } + text = mTitleList[position] + } + }.apply { attach() } + + viewPager2.currentItem = mPageIndex + } + } +} \ No newline at end of file diff --git a/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListViewModel.kt b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListViewModel.kt new file mode 100644 index 0000000..d543e12 --- /dev/null +++ b/module_square/src/main/java/com/btpj/module_square/ui/square/system/details/SystemArticleListViewModel.kt @@ -0,0 +1,13 @@ +package com.btpj.module_square.ui.square.system.details + +import androidx.databinding.ObservableField +import com.btpj.lib_base.base.BaseViewModel + +class SystemArticleListViewModel : BaseViewModel() { + + var title = ObservableField("") + + override fun start() { + + } +} \ No newline at end of file diff --git a/module_square/src/main/res/layout/activity_system_article_list.xml b/module_square/src/main/res/layout/activity_system_article_list.xml new file mode 100644 index 0000000..cc82481 --- /dev/null +++ b/module_square/src/main/res/layout/activity_system_article_list.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_square.xml b/module_square/src/main/res/layout/square_fragment_square.xml similarity index 92% rename from app/src/main/res/layout/fragment_square.xml rename to module_square/src/main/res/layout/square_fragment_square.xml index ea7392b..2e00490 100644 --- a/app/src/main/res/layout/fragment_square.xml +++ b/module_square/src/main/res/layout/square_fragment_square.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.main.square.SquareFragment"> + tools:context="com.btpj.module_square.ui.square.SquareFragment"> + + + \ No newline at end of file diff --git a/module_square/src/main/res/values/strings.xml b/module_square/src/main/res/values/strings.xml new file mode 100644 index 0000000..73862c4 --- /dev/null +++ b/module_square/src/main/res/values/strings.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/module_square/src/main/res/values/themes.xml b/module_square/src/main/res/values/themes.xml new file mode 100644 index 0000000..0f94e8d --- /dev/null +++ b/module_square/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_square/src/test/java/com/btpj/module_square/ExampleUnitTest.kt b/module_square/src/test/java/com/btpj/module_square/ExampleUnitTest.kt new file mode 100644 index 0000000..5843c86 --- /dev/null +++ b/module_square/src/test/java/com/btpj/module_square/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_square + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_web/.gitignore b/module_web/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_web/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_web/build.gradle b/module_web/build.gradle new file mode 100644 index 0000000..3e71981 --- /dev/null +++ b/module_web/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_web' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_web" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "web_" +} \ No newline at end of file diff --git a/module_web/proguard-rules.pro b/module_web/proguard-rules.pro new file mode 100644 index 0000000..0794d78 --- /dev/null +++ b/module_web/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_web.data.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_web/src/androidTest/java/com/btpj/module_web/ExampleInstrumentedTest.kt b/module_web/src/androidTest/java/com/btpj/module_web/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..7442a40 --- /dev/null +++ b/module_web/src/androidTest/java/com/btpj/module_web/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.btpj.module_web + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_web", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_web/src/main/AndroidManifest.xml b/module_web/src/main/AndroidManifest.xml new file mode 100644 index 0000000..71dbfbd --- /dev/null +++ b/module_web/src/main/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/module_web/src/main/alone/AndroidManifest.xml b/module_web/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..9fae56d --- /dev/null +++ b/module_web/src/main/alone/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_web/src/main/java/com/btpj/module_web/data/DataRepository.kt b/module_web/src/main/java/com/btpj/module_web/data/DataRepository.kt new file mode 100644 index 0000000..989efc2 --- /dev/null +++ b/module_web/src/main/java/com/btpj/module_web/data/DataRepository.kt @@ -0,0 +1,34 @@ +package com.btpj.module_web.data + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.data.bean.CollectUrl +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.module_web.data.http.Api + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + override suspend fun collectArticle(id: Int): ApiResponse { + return apiCall { service.collectArticle(id) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } + + override suspend fun collectUrl(name: String, link: String): ApiResponse { + return apiCall { service.collectUrl(name, link) } + } + + override suspend fun unCollectUrl(id: Int): ApiResponse { + return apiCall { service.unCollectUrl(id) } + } + +} \ No newline at end of file diff --git a/module_web/src/main/java/com/btpj/module_web/data/http/Api.kt b/module_web/src/main/java/com/btpj/module_web/data/http/Api.kt new file mode 100644 index 0000000..5b580d0 --- /dev/null +++ b/module_web/src/main/java/com/btpj/module_web/data/http/Api.kt @@ -0,0 +1,35 @@ +package com.btpj.module_web.data.http + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.data.bean.CollectUrl +import retrofit2.http.POST +import retrofit2.http.Path +import retrofit2.http.Query + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 收藏站内文章 */ + @POST("lg/collect/{id}/json") + suspend fun collectArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse + + /** 收藏网址 */ + @POST("lg/collect/addtool/json") + suspend fun collectUrl( + @Query("name") name: String, + @Query("link") link: String + ): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/collect/deletetool/json") + suspend fun unCollectUrl(@Query("id") id: Int): ApiResponse + +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/web/WebActivity.kt b/module_web/src/main/java/com/btpj/module_web/ui/web/WebActivity.kt similarity index 72% rename from app/src/main/java/com/btpj/wanandroid/ui/web/WebActivity.kt rename to module_web/src/main/java/com/btpj/module_web/ui/web/WebActivity.kt index fb5b88a..fb68087 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/web/WebActivity.kt +++ b/module_web/src/main/java/com/btpj/module_web/ui/web/WebActivity.kt @@ -1,6 +1,5 @@ -package com.btpj.wanandroid.ui.web +package com.btpj.module_web.ui.web -import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle @@ -9,13 +8,17 @@ import android.view.MenuItem import android.webkit.WebView import android.widget.FrameLayout import androidx.core.content.ContextCompat +import com.alibaba.android.arouter.facade.annotation.Autowired +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.export.ModuleWebApi import com.btpj.lib_base.ext.initClose import com.btpj.lib_base.ext.initTitle -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseActivity -import com.btpj.wanandroid.data.bean.* -import com.btpj.wanandroid.databinding.ActivityWebBinding +import com.btpj.module_web.R +import com.btpj.module_web.databinding.WebActivityWebBinding import com.just.agentweb.AgentWeb import com.just.agentweb.WebChromeClient @@ -24,88 +27,42 @@ import com.just.agentweb.WebChromeClient * * @author LTP 2022/4/2 */ -class WebActivity : BaseActivity(R.layout.activity_web) { +@Route(path = ModuleWebApi.ROUTER_WEB_WEB_ACTIVITY) +class WebActivity : + BaseVMBActivity(R.layout.web_activity_web) { private lateinit var mAgentWeb: AgentWeb - private var mArticle: Article? = null - private var mCollectArticle: CollectArticle? = null - private var mCollectUrl: CollectUrl? = null - private var mBanner: Banner? = null + @Autowired(name = ModuleWebApi.ROUTER_WEB_EXTRA_ARTICLE) + @JvmField + var mArticle: Article? = null - private lateinit var mUrl: String - private var mCollect = false - private lateinit var mTitle: String - - companion object { - private const val EXTRA_ARTICLE = "extra_article" - private const val EXTRA_COLLECT_ARTICLE = "extra_collect_article" - private const val EXTRA_COLLECT_URL = "extra_collect_url" - private const val EXTRA_BANNER = "extra_banner" - - /** - * 页面跳转 - * - * @param context Context - * @param article Article - */ - fun launch(context: Context, article: Article) { - context.startActivity(Intent(context, WebActivity::class.java).apply { - putExtra(EXTRA_ARTICLE, article) - }) - } + @Autowired(name = ModuleWebApi.ROUTER_WEB_EXTRA_COLLECT_ARTICLE) + @JvmField + var mCollectArticle: CollectArticle? = null - /** - * 页面跳转 - * - * @param context Context - * @param collectArticle CollectArticle - */ - fun launch(context: Context, collectArticle: CollectArticle) { - context.startActivity(Intent(context, WebActivity::class.java).apply { - putExtra(EXTRA_COLLECT_ARTICLE, collectArticle) - }) - } + @Autowired(name = ModuleWebApi.ROUTER_WEB_EXTRA_COLLECT_URL) + @JvmField + var mCollectUrl: CollectUrl? = null - /** - * 页面跳转 - * - * @param context Context - * @param collectUrl CollectUrl - */ - fun launch(context: Context, collectUrl: CollectUrl) { - context.startActivity(Intent(context, WebActivity::class.java).apply { - putExtra(EXTRA_COLLECT_URL, collectUrl) - }) - } + @Autowired(name = ModuleWebApi.ROUTER_WEB_EXTRA_BANNER) + @JvmField + var mBanner: Banner? = null - /** - * 页面跳转 - * - * @param context Context - * @param banner Banner - */ - fun launch(context: Context, banner: Banner) { - context.startActivity(Intent(context, WebActivity::class.java).apply { - putExtra(EXTRA_BANNER, banner) - }) - } - } + private lateinit var mUrl: String + private var mCollect = false + private lateinit var mTitle: String override fun initView(savedInstanceState: Bundle?) { + // 自动完成参数注入 + ARouter.getInstance().inject(this) + mBinding.toolbar.apply { setSupportActionBar(this) initTitle("加载中...") initClose { onBackPressed() } } - intent.apply { - mArticle = getParcelableExtra(EXTRA_ARTICLE) - mCollectArticle = getParcelableExtra(EXTRA_COLLECT_ARTICLE) - mCollectUrl = getParcelableExtra(EXTRA_COLLECT_URL) - mBanner = getParcelableExtra(EXTRA_BANNER) - } - when { mArticle != null -> { mUrl = mArticle!!.link @@ -141,14 +98,14 @@ class WebActivity : BaseActivity(R.layout.acti } override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_web, menu) + menuInflater.inflate(R.menu.web_menu_web, menu) return super.onCreateOptionsMenu(menu) } override fun onPrepareOptionsMenu(menu: Menu?): Boolean { menu?.findItem(R.id.item_collect)?.icon = ContextCompat.getDrawable( this, - if (mCollect) R.drawable.ic_collect else R.drawable.ic_un_collect + if (mCollect) com.btpj.lib_base.R.drawable.ic_collect else com.btpj.lib_base.R.drawable.ic_un_collect ) return super.onPrepareOptionsMenu(menu) } diff --git a/app/src/main/java/com/btpj/wanandroid/ui/web/WebViewModel.kt b/module_web/src/main/java/com/btpj/module_web/ui/web/WebViewModel.kt similarity index 91% rename from app/src/main/java/com/btpj/wanandroid/ui/web/WebViewModel.kt rename to module_web/src/main/java/com/btpj/module_web/ui/web/WebViewModel.kt index 83c4f9f..f0869f1 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/web/WebViewModel.kt +++ b/module_web/src/main/java/com/btpj/module_web/ui/web/WebViewModel.kt @@ -1,10 +1,10 @@ -package com.btpj.wanandroid.ui.web +package com.btpj.module_web.ui.web import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.bean.CollectUrl import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.CollectUrl +import com.btpj.module_web.data.DataRepository /** * @author LTP 2022/4/2 diff --git a/app/src/main/res/layout/activity_web.xml b/module_web/src/main/res/layout/web_activity_web.xml similarity index 94% rename from app/src/main/res/layout/activity_web.xml rename to module_web/src/main/res/layout/web_activity_web.xml index 7e71d4a..300a55e 100644 --- a/app/src/main/res/layout/activity_web.xml +++ b/module_web/src/main/res/layout/web_activity_web.xml @@ -20,7 +20,7 @@ android:background="@color/purple_500" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_scrollFlags="scroll|enterAlways" - app:popupTheme="@style/ToolbarPopTheme" /> + app:popupTheme="@style/Web.ToolbarPopTheme" /> + + + \ No newline at end of file diff --git a/module_web/src/main/res/values/themes.xml b/module_web/src/main/res/values/themes.xml new file mode 100644 index 0000000..e26aaef --- /dev/null +++ b/module_web/src/main/res/values/themes.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/module_web/src/test/java/com/btpj/module_web/ExampleUnitTest.kt b/module_web/src/test/java/com/btpj/module_web/ExampleUnitTest.kt new file mode 100644 index 0000000..fb645a6 --- /dev/null +++ b/module_web/src/test/java/com/btpj/module_web/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.btpj.module_web + +import org.junit.Assert.assertEquals +import org.junit.Test + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/module_wechat/.gitignore b/module_wechat/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/module_wechat/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/module_wechat/build.gradle b/module_wechat/build.gradle new file mode 100644 index 0000000..338eb1b --- /dev/null +++ b/module_wechat/build.gradle @@ -0,0 +1,14 @@ +apply from: "../module.build.gradle" + +android { + namespace 'com.btpj.module_wechat' + + defaultConfig { + if (rootProject.ext.isBuildModule) { + applicationId "com.btpj.module_wechat" + } + } + + //统一资源前缀,规范资源引用,会让编译器自动提示你不规范的命名 + resourcePrefix "wechat_" +} \ No newline at end of file diff --git a/module_wechat/proguard-rules.pro b/module_wechat/proguard-rules.pro new file mode 100644 index 0000000..cad34a0 --- /dev/null +++ b/module_wechat/proguard-rules.pro @@ -0,0 +1,175 @@ +# 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 + +############## 对于一些基本指令的添加start ################## +# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 +-optimizationpasses 5 +# 混合时不使用大小写混合,混合后的类名为小写 +-dontusemixedcaseclassnames +# 指定不去忽略非公共库的类 +-dontskipnonpubliclibraryclasses +# 这句话能够使我们的项目混淆后产生映射文件 +# 包含有类名->混淆后类名的映射关系 +-verbose +# 指定不去忽略非公共库的类成员 +-dontskipnonpubliclibraryclassmembers +# 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 +-dontpreverify +# 忽略警告 +-ignorewarnings +# 保留Annotation不混淆 +-keepattributes *Annotation*,InnerClasses +# 避免混淆泛型 +-keepattributes Signature +# 抛出异常时保留代码行号 +-keepattributes SourceFile,LineNumberTable +# 指定混淆是采用的算法,后面的参数是一个过滤器 +# 这个过滤器是谷歌推荐的算法,一般不做更改 +-optimizations !code/simplification/cast,!field/*,!class/merging/* +############### 对于一些基本指令的添加end ######################### + + +############### Android开发中一些需要保留的公共部分start ################## +# 保留我们使用的四大组件,自定义的Application等等这些类不被混淆,因为这些子类都有可能被外部调用 +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.view.View +# 保留support下的所有类及其内部类 +-keep class android.support.** {*;} +# 保留继承的 +-keep public class * extends android.support.v4.** +-keep public class * extends android.support.v7.** +-keep public class * extends android.support.annotation.** +# Androidx的混淆 +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +# 保留R下面的资源 +-keep class **.R$* {*;} +# 保留本地native方法不被混淆 +-keepclasseswithmembernames class * { native ;} +# 保留在Activity中的方法参数是view的方法, +# 这样以来我们在layout中写的onClick就不会被影响 +-keepclassmembers class * extends android.app.Activity{ public void *(android.view.View);} +# 保留枚举类不被混淆 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} +# 保留我们自定义控件(继承自View)不被混淆 +-keep public class * extends android.view.View{ + *** get*(); + void set*(***); + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} +# 保留Parcelable序列化类不被混淆 +-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;} +# 保留Serializable序列化的类不被混淆 +-keepnames class * implements java.io.Serializable +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} +# 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 +-keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); +} + +# 所有实体类不能混淆 model文件夹下的所有实体类不能混淆 +-keep class com.btpj.lib_base.data.bean.** {*;} +-keep class com.btpj.module_wechat.data.bean.** {*;} +############### Android开发中一些需要保留的公共部分end ################## + + +############### 第三方库中的混淆规则start ############################## +# BaseRecyclerViewAdapterHelper混淆 +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder +-keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +-keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} +-keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { +public (android.view.View); +} + +# Glide混淆 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# bugly混淆 +-dontwarn com.tencent.bugly.** +-keep public class com.tencent.bugly.**{*;} + +# ARouter混淆 +-keep public class com.alibaba.android.arouter.routes.**{*;} +-keep public class com.alibaba.android.arouter.facade.**{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;} +-keep class * implements com.alibaba.android.arouter.facade.template.IProvider +-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider + +# Retrofit混淆 +-keepattributes Signature, InnerClasses, EnclosingMethod +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations +-keepattributes AnnotationDefault +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} +-dontwarn javax.annotation.** +-dontwarn kotlin.Unit +-dontwarn retrofit2.KotlinExtensions +-dontwarn retrofit2.KotlinExtensions$* +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface * extends <1> +-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation +-if interface * { @retrofit2.http.* public *** *(...); } +-keep,allowoptimization,allowshrinking,allowobfuscation class <3> +-keep,allowobfuscation,allowshrinking class retrofit2.Response \ No newline at end of file diff --git a/module_wechat/src/androidTest/java/com/btpj/module_wechat/ExampleInstrumentedTest.kt b/module_wechat/src/androidTest/java/com/btpj/module_wechat/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..92c6615 --- /dev/null +++ b/module_wechat/src/androidTest/java/com/btpj/module_wechat/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.btpj.module_wechat + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.btpj.module_wechat", appContext.packageName) + } +} \ No newline at end of file diff --git a/module_wechat/src/main/AndroidManifest.xml b/module_wechat/src/main/AndroidManifest.xml new file mode 100644 index 0000000..568741e --- /dev/null +++ b/module_wechat/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/module_wechat/src/main/alone/AndroidManifest.xml b/module_wechat/src/main/alone/AndroidManifest.xml new file mode 100644 index 0000000..edb4b55 --- /dev/null +++ b/module_wechat/src/main/alone/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module_wechat/src/main/java/com/btpj/module_wechat/data/DataRepository.kt b/module_wechat/src/main/java/com/btpj/module_wechat/data/DataRepository.kt new file mode 100644 index 0000000..d17b571 --- /dev/null +++ b/module_wechat/src/main/java/com/btpj/module_wechat/data/DataRepository.kt @@ -0,0 +1,36 @@ +package com.btpj.module_wechat.data + +import com.btpj.lib_base.data.bean.* +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.module_wechat.data.http.Api + +/** + * 数据仓库 + * + * @author LTP 2022/3/23 + */ +object DataRepository : BaseRepository(), Api { + + private val service by lazy { RetrofitManager.getService(Api::class.java) } + + override suspend fun collectArticle(id: Int): ApiResponse { + return apiCall { service.collectArticle(id) } + } + + override suspend fun unCollectArticle(id: Int): ApiResponse { + return apiCall { service.unCollectArticle(id) } + } + + override suspend fun getAuthorTitleList(): ApiResponse> { + return apiCall { service.getAuthorTitleList() } + } + + override suspend fun getAuthorArticlePageList( + authorId: Int, + pageNo: Int, + pageSize: Int + ): ApiResponse> { + return apiCall { service.getAuthorArticlePageList(authorId, pageNo, pageSize) } + } +} \ No newline at end of file diff --git a/module_wechat/src/main/java/com/btpj/module_wechat/data/http/Api.kt b/module_wechat/src/main/java/com/btpj/module_wechat/data/http/Api.kt new file mode 100644 index 0000000..f33f4d5 --- /dev/null +++ b/module_wechat/src/main/java/com/btpj/module_wechat/data/http/Api.kt @@ -0,0 +1,32 @@ +package com.btpj.module_wechat.data.http + +import com.btpj.lib_base.data.bean.* +import retrofit2.http.* + +/** + * Http接口,Retrofit的请求Service + * + * @author LTP 2022/3/21 + */ +interface Api { + + /** 收藏站内文章 */ + @POST("lg/collect/{id}/json") + suspend fun collectArticle(@Path("id") id: Int): ApiResponse + + /** 取消收藏站内文章 */ + @POST("lg/uncollect_originId/{id}/json") + suspend fun unCollectArticle(@Path("id") id: Int): ApiResponse + + /** 获取公众号作者列表 */ + @GET("wxarticle/chapters/json") + suspend fun getAuthorTitleList(): ApiResponse> + + /** 获取公众号作者文章分页列表 */ + @GET("wxarticle/list/{authorId}/{pageNo}/json") + suspend fun getAuthorArticlePageList( + @Path("authorId") authorId: Int, + @Path("pageNo") pageNo: Int, + @Query("page_size") pageSize: Int + ): ApiResponse> +} \ No newline at end of file diff --git a/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneActivity.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneActivity.kt new file mode 100644 index 0000000..427da21 --- /dev/null +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneActivity.kt @@ -0,0 +1,22 @@ +package com.btpj.module_wechat.ui.alone + +import android.os.Bundle +import com.btpj.lib_base.R +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.databinding.CommonContainerBinding +import com.btpj.lib_base.export.ModuleWechatApi + +/** + * 作为Application时的测试页面 + * + * @author LTP 2022/4/8 + */ +class AloneActivity : + BaseVMBActivity(R.layout.common_container) { + + override fun initView(savedInstanceState: Bundle?) { + supportFragmentManager.beginTransaction() + .add(R.id.fl_container, ModuleWechatApi.getWechatFragment()) + .commit() + } +} \ No newline at end of file diff --git a/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneViewModel.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneViewModel.kt new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/alone/AloneViewModel.kt @@ -0,0 +1,10 @@ +package com.btpj.module_wechat.ui.alone + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author LTP 2022/3/9 + */ +class AloneViewModel : BaseViewModel() { + override fun start() {} +} \ No newline at end of file diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildFragment.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildFragment.kt similarity index 89% rename from app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildFragment.kt rename to module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildFragment.kt index 97429b7..4fd4c5e 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildFragment.kt +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildFragment.kt @@ -1,19 +1,19 @@ -package com.btpj.wanandroid.ui.main.wechat +package com.btpj.module_wechat.ui.wechat import android.annotation.SuppressLint import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager +import com.btpj.lib_base.adapter.ArticleAdapter import com.btpj.lib_base.data.bean.PageResponse +import com.btpj.lib_base.R +import com.btpj.lib_base.base.App +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.data.bean.Article +import com.btpj.lib_base.data.bean.CollectData +import com.btpj.lib_base.databinding.IncludeSwiperefreshRecyclerviewBinding +import com.btpj.lib_base.export.ModuleHomeApi import com.btpj.lib_base.ext.getEmptyView import com.btpj.lib_base.ext.initColors -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.App -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Article -import com.btpj.wanandroid.data.bean.CollectData -import com.btpj.wanandroid.databinding.IncludeSwiperefreshRecyclerviewBinding -import com.btpj.wanandroid.ui.author.AuthorActivity -import com.btpj.wanandroid.ui.main.home.ArticleAdapter /** * 公众号Tab下的子Fragment @@ -21,7 +21,7 @@ import com.btpj.wanandroid.ui.main.home.ArticleAdapter * @author LTP 2022/3/10 */ class WechatChildFragment : - BaseFragment(R.layout.include_swiperefresh_recyclerview) { + BaseVMBFragment(R.layout.include_swiperefresh_recyclerview) { /** 列表总数 */ private var mTotalCount: Int = 0 @@ -61,10 +61,7 @@ class WechatChildFragment : when (view.id) { // 查看作者文章列表 R.id.tv_author -> - AuthorActivity.launch( - requireContext(), - mAdapter.getItem(position).userId - ) + ModuleHomeApi.navToAuthorActivity(mAdapter.getItem(position).userId) // 收藏与取消收藏 R.id.iv_collect -> if (mAdapter.getItem(position).collect) { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildViewModel.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildViewModel.kt similarity index 91% rename from app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildViewModel.kt rename to module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildViewModel.kt index f8ea6bb..4d26286 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatChildViewModel.kt +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatChildViewModel.kt @@ -1,12 +1,12 @@ -package com.btpj.wanandroid.ui.main.wechat +package com.btpj.module_wechat.ui.wechat import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.data.bean.PageResponse import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Article +import com.btpj.lib_base.data.bean.Article +import com.btpj.module_wechat.data.DataRepository class WechatChildViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatFragment.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatFragment.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatFragment.kt rename to module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatFragment.kt index 955db5f..f4a97fe 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatFragment.kt +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatFragment.kt @@ -1,12 +1,14 @@ -package com.btpj.wanandroid.ui.main.wechat +package com.btpj.module_wechat.ui.wechat import android.annotation.SuppressLint import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter -import com.btpj.wanandroid.R -import com.btpj.wanandroid.base.BaseFragment -import com.btpj.wanandroid.data.bean.Classify -import com.btpj.wanandroid.databinding.FragmentViewpagerBinding +import com.alibaba.android.arouter.facade.annotation.Route +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.R +import com.btpj.lib_base.data.bean.Classify +import com.btpj.lib_base.databinding.CommonFragmentViewpagerBinding +import com.btpj.lib_base.export.ModuleWechatApi import com.google.android.material.tabs.TabLayoutMediator /** @@ -14,8 +16,9 @@ import com.google.android.material.tabs.TabLayoutMediator * * @author LTP 2022/3/10 */ +@Route(path = ModuleWechatApi.ROUTER_WECHAT_WECHAT_FRAGMENT) class WechatFragment : - BaseFragment(R.layout.fragment_viewpager) { + BaseVMBFragment(R.layout.common_fragment_viewpager) { /** TabLayout的标题集合 */ private val mAuthorTitleList = ArrayList() @@ -24,10 +27,6 @@ class WechatFragment : private lateinit var mFragmentStateAdapter: FragmentStateAdapter - companion object { - fun newInstance() = WechatFragment() - } - override fun initView() { mFragmentStateAdapter = object : FragmentStateAdapter(parentFragmentManager, lifecycle) { override fun getItemCount(): Int { diff --git a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatViewModel.kt b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatViewModel.kt similarity index 82% rename from app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatViewModel.kt rename to module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatViewModel.kt index 3b8f031..5eebe6b 100644 --- a/app/src/main/java/com/btpj/wanandroid/ui/main/wechat/WechatViewModel.kt +++ b/module_wechat/src/main/java/com/btpj/module_wechat/ui/wechat/WechatViewModel.kt @@ -1,11 +1,11 @@ -package com.btpj.wanandroid.ui.main.wechat +package com.btpj.module_wechat.ui.wechat import androidx.lifecycle.MutableLiveData import com.btpj.lib_base.base.BaseViewModel import com.btpj.lib_base.ext.handleRequest import com.btpj.lib_base.ext.launch -import com.btpj.wanandroid.data.DataRepository -import com.btpj.wanandroid.data.bean.Classify +import com.btpj.lib_base.data.bean.Classify +import com.btpj.module_wechat.data.DataRepository class WechatViewModel : BaseViewModel() { diff --git a/app/src/main/res/layout/fragment_wechat.xml b/module_wechat/src/main/res/layout/wechat_fragment_wechat.xml similarity index 92% rename from app/src/main/res/layout/fragment_wechat.xml rename to module_wechat/src/main/res/layout/wechat_fragment_wechat.xml index 302160f..0851fe6 100644 --- a/app/src/main/res/layout/fragment_wechat.xml +++ b/module_wechat/src/main/res/layout/wechat_fragment_wechat.xml @@ -11,7 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ui.main.wechat.WechatFragment"> + tools:context="com.btpj.module_wechat.ui.wechat.WechatFragment"> + + + \ No newline at end of file diff --git a/module_wechat/src/main/res/values/themes.xml b/module_wechat/src/main/res/values/themes.xml new file mode 100644 index 0000000..631ad2a --- /dev/null +++ b/module_wechat/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/module_wechat/src/test/java/com/btpj/module_wechat/ExampleUnitTest.kt b/module_wechat/src/test/java/com/btpj/module_wechat/ExampleUnitTest.kt new file mode 100644 index 0000000..c83daca --- /dev/null +++ b/module_wechat/src/test/java/com/btpj/module_wechat/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.btpj.module_wechat + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index f3bcd7c..6cfbc56 100644 --- a/settings.gradle +++ b/settings.gradle @@ -16,4 +16,11 @@ dependencyResolutionManagement { } rootProject.name = "WanAndroid" include ':app' -include ':lib_base' +include ':lib_common' +include ':module_web' +include ':module_mine' +include ':module_main' +include ':module_home' +include ':module_project' +include ':module_square' +include ':module_wechat'