From 23fcdedb4b1385299a474065e267dee1fd401c14 Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Mon, 31 Aug 2020 10:05:41 +0800 Subject: [PATCH 1/9] =?UTF-8?q?Modify:=20demo=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib_Base/src/main/res/values/colors.xml | 6 +-- .../com/quyunshuo/common/constant/RouteUrl.kt | 8 +++- Lib_Common/src/main/res/values/colors.xml | 4 ++ Lib_Common/src/main/res/values/strings.xml | 2 + Lib_Main/.gitignore | 1 + Lib_Main/build.gradle | 11 +++++ Lib_Main/consumer-rules.pro | 0 Lib_Main/proguard-rules.pro | 21 +++++++++ .../quyunshuo/main/ExampleInstrumentedTest.kt | 24 ++++++++++ Lib_Main/src/main/AndroidManifest.xml | 18 +++++++ .../quyunshuo/main/ui/main/MainActivity.kt | 26 +++++++++++ .../quyunshuo/main/ui/main/MainRepository.kt | 11 +++++ .../quyunshuo/main/ui/main/MainViewModel.kt | 14 ++++++ .../main/ui/splash/SplashActivity.kt | 44 ++++++++++++++++++ .../main/ui/splash/SplashRepository.kt | 11 +++++ .../main/ui/splash/SplashViewModel.kt | 14 ++++++ .../src/main/java/debug/AndroidManifest.xml | 22 +++++++++ .../src/main/java/debug/MainApplication.kt | 11 +++++ .../drawable-xxhdpi/main_splash_bg_img.png | Bin 0 -> 28923 bytes .../src/main/res/drawable/main_splash_bg.xml | 17 +++++++ .../main/res/layout/main_activity_main.xml | 10 ++++ .../main/res/layout/main_activity_splash.xml | 19 ++++++++ Lib_Main/src/main/res/values-v21/styles.xml | 9 ++++ Lib_Main/src/main/res/values/strings.xml | 4 ++ Lib_Main/src/main/res/values/styles.xml | 8 ++++ .../com/quyunshuo/main/ExampleUnitTest.kt | 17 +++++++ app/build.gradle | 3 +- settings.gradle | 1 + 28 files changed, 330 insertions(+), 6 deletions(-) create mode 100644 Lib_Common/src/main/res/values/colors.xml create mode 100644 Lib_Common/src/main/res/values/strings.xml create mode 100644 Lib_Main/.gitignore create mode 100644 Lib_Main/build.gradle create mode 100644 Lib_Main/consumer-rules.pro create mode 100644 Lib_Main/proguard-rules.pro create mode 100644 Lib_Main/src/androidTest/java/com/quyunshuo/main/ExampleInstrumentedTest.kt create mode 100644 Lib_Main/src/main/AndroidManifest.xml create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainRepository.kt create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainViewModel.kt create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashRepository.kt create mode 100644 Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashViewModel.kt create mode 100644 Lib_Main/src/main/java/debug/AndroidManifest.xml create mode 100644 Lib_Main/src/main/java/debug/MainApplication.kt create mode 100644 Lib_Main/src/main/res/drawable-xxhdpi/main_splash_bg_img.png create mode 100644 Lib_Main/src/main/res/drawable/main_splash_bg.xml create mode 100644 Lib_Main/src/main/res/layout/main_activity_main.xml create mode 100644 Lib_Main/src/main/res/layout/main_activity_splash.xml create mode 100644 Lib_Main/src/main/res/values-v21/styles.xml create mode 100644 Lib_Main/src/main/res/values/strings.xml create mode 100644 Lib_Main/src/main/res/values/styles.xml create mode 100644 Lib_Main/src/test/java/com/quyunshuo/main/ExampleUnitTest.kt diff --git a/Lib_Base/src/main/res/values/colors.xml b/Lib_Base/src/main/res/values/colors.xml index b7cee75..063b78c 100644 --- a/Lib_Base/src/main/res/values/colors.xml +++ b/Lib_Base/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #6200EE - #3700B3 - #03DAC5 + #00CFEB + #00CFEB + #00CFEB \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt b/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt index 2d0d113..45f8d7f 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt @@ -6,4 +6,10 @@ package com.quyunshuo.common.constant * @Class: RoutePath * @Remark: 路由地址 */ -object RouteUrl \ No newline at end of file +object RouteUrl { + // 启动页 + const val SplashActivity = "/Lib_Main/SplashActivity" + + // 首页 + const val MainActivity = "/Lib_Main/MainActivity" +} \ No newline at end of file diff --git a/Lib_Common/src/main/res/values/colors.xml b/Lib_Common/src/main/res/values/colors.xml new file mode 100644 index 0000000..c0fa684 --- /dev/null +++ b/Lib_Common/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #00CFEB + \ No newline at end of file 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..e5f8fdc --- /dev/null +++ b/Lib_Common/src/main/res/values/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Lib_Main/.gitignore b/Lib_Main/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/Lib_Main/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Lib_Main/build.gradle b/Lib_Main/build.gradle new file mode 100644 index 0000000..1306b36 --- /dev/null +++ b/Lib_Main/build.gradle @@ -0,0 +1,11 @@ +apply from: '../moduleBase.gradle' +apply plugin: 'kotlin-android' + +android { + resourcePrefix "main_" +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.0' +} \ No newline at end of file diff --git a/Lib_Main/consumer-rules.pro b/Lib_Main/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/Lib_Main/proguard-rules.pro b/Lib_Main/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/Lib_Main/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Lib_Main/src/androidTest/java/com/quyunshuo/main/ExampleInstrumentedTest.kt b/Lib_Main/src/androidTest/java/com/quyunshuo/main/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..b670c36 --- /dev/null +++ b/Lib_Main/src/androidTest/java/com/quyunshuo/main/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.quyunshuo.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.quyunshuo.main.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/Lib_Main/src/main/AndroidManifest.xml b/Lib_Main/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3121d2d --- /dev/null +++ b/Lib_Main/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt new file mode 100644 index 0000000..a9a0f14 --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt @@ -0,0 +1,26 @@ +package com.quyunshuo.main.ui.main + +import android.graphics.Color +import com.alibaba.android.arouter.facade.annotation.Route +import com.jaeger.library.StatusBarUtil +import com.quyunshuo.common.constant.RouteUrl +import com.quyunshuo.common.ui.BaseActivity +import com.quyunshuo.main.R +import com.quyunshuo.main.databinding.MainActivityMainBinding + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: MainActivity + * @Remark: 首页 + */ +@Route(path = RouteUrl.MainActivity) +class MainActivity : + BaseActivity(MainViewModel::class.java) { + + override fun initViewBinding() = MainActivityMainBinding.inflate(layoutInflater) + + override fun initView() { + StatusBarUtil.setColor(this, resources.getColor(R.color.common_theme_color)) + } +} \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainRepository.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainRepository.kt new file mode 100644 index 0000000..e734316 --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainRepository.kt @@ -0,0 +1,11 @@ +package com.quyunshuo.main.ui.main + +import com.quyunshuo.base.mvvm.m.BaseRepository + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: MainRepository + * @Remark: + */ +class MainRepository : BaseRepository() \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainViewModel.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainViewModel.kt new file mode 100644 index 0000000..c9afa4d --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainViewModel.kt @@ -0,0 +1,14 @@ +package com.quyunshuo.main.ui.main + +import com.quyunshuo.base.mvvm.vm.BaseViewModel + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: MainViewModel + * @Remark: + */ +class MainViewModel : BaseViewModel() { + + override fun initRepository() = MainRepository() +} \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt new file mode 100644 index 0000000..03bb7c5 --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt @@ -0,0 +1,44 @@ +package com.quyunshuo.main.ui.splash + +import androidx.lifecycle.lifecycleScope +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.quyunshuo.common.constant.RouteUrl +import com.quyunshuo.common.ui.BaseActivity +import com.quyunshuo.main.databinding.MainActivitySplashBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import me.jessyan.autosize.internal.CancelAdapt + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: + * @Remark: + */ +@Route(path = RouteUrl.SplashActivity) +class SplashActivity : + BaseActivity(SplashViewModel::class.java), + CancelAdapt { + + override fun initViewBinding() = MainActivitySplashBinding.inflate(layoutInflater) + + override fun initView() { + jumpMain() + } + + /** + * 延时跳转到首页 + */ + private fun jumpMain() { + lifecycleScope.launch(Dispatchers.Default) { + delay(1000L) + ARouter.getInstance() + .build(RouteUrl.MainActivity) + .navigation() + delay(100L) + finish() + } + } +} \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashRepository.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashRepository.kt new file mode 100644 index 0000000..fcbe1ab --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashRepository.kt @@ -0,0 +1,11 @@ +package com.quyunshuo.main.ui.splash + +import com.quyunshuo.base.mvvm.m.BaseRepository + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: SplashRepository + * @Remark: + */ +class SplashRepository : BaseRepository() \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashViewModel.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashViewModel.kt new file mode 100644 index 0000000..9b7f58d --- /dev/null +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashViewModel.kt @@ -0,0 +1,14 @@ +package com.quyunshuo.main.ui.splash + +import com.quyunshuo.base.mvvm.vm.BaseViewModel + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: SplashViewModel + * @Remark: + */ +class SplashViewModel : BaseViewModel() { + + override fun initRepository() = SplashRepository() +} \ No newline at end of file diff --git a/Lib_Main/src/main/java/debug/AndroidManifest.xml b/Lib_Main/src/main/java/debug/AndroidManifest.xml new file mode 100644 index 0000000..4fe45e4 --- /dev/null +++ b/Lib_Main/src/main/java/debug/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/java/debug/MainApplication.kt b/Lib_Main/src/main/java/debug/MainApplication.kt new file mode 100644 index 0000000..e45ef83 --- /dev/null +++ b/Lib_Main/src/main/java/debug/MainApplication.kt @@ -0,0 +1,11 @@ +package debug + +import com.quyunshuo.common.CommonApplication + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: MainApplication + * @Remark: Main模块作为App时的Application + */ +class MainApplication : CommonApplication() \ No newline at end of file diff --git a/Lib_Main/src/main/res/drawable-xxhdpi/main_splash_bg_img.png b/Lib_Main/src/main/res/drawable-xxhdpi/main_splash_bg_img.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba6a5da6cab298a77e81f052a8f23e346a16519 GIT binary patch literal 28923 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 + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/layout/main_activity_main.xml b/Lib_Main/src/main/res/layout/main_activity_main.xml new file mode 100644 index 0000000..2fbe2bd --- /dev/null +++ b/Lib_Main/src/main/res/layout/main_activity_main.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/layout/main_activity_splash.xml b/Lib_Main/src/main/res/layout/main_activity_splash.xml new file mode 100644 index 0000000..7a931ae --- /dev/null +++ b/Lib_Main/src/main/res/layout/main_activity_splash.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/values-v21/styles.xml b/Lib_Main/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..2cdadc9 --- /dev/null +++ b/Lib_Main/src/main/res/values-v21/styles.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/values/strings.xml b/Lib_Main/src/main/res/values/strings.xml new file mode 100644 index 0000000..e56a806 --- /dev/null +++ b/Lib_Main/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + Lib_Main + Welcome to AndroidBaseFrameMVVM! + \ No newline at end of file diff --git a/Lib_Main/src/main/res/values/styles.xml b/Lib_Main/src/main/res/values/styles.xml new file mode 100644 index 0000000..40d21cf --- /dev/null +++ b/Lib_Main/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/Lib_Main/src/test/java/com/quyunshuo/main/ExampleUnitTest.kt b/Lib_Main/src/test/java/com/quyunshuo/main/ExampleUnitTest.kt new file mode 100644 index 0000000..e2357c0 --- /dev/null +++ b/Lib_Main/src/test/java/com/quyunshuo/main/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.quyunshuo.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/app/build.gradle b/app/build.gradle index 7dd1ab4..1cb44a6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,8 +70,7 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) if (!BuildConfig.isAppMode) { - // 有业务组件时 把这个去掉 这里只是为了使用base里的依赖库 - implementation project(path: ':Lib_Common') + implementation project(path: ':Lib_Main') } else { implementation project(path: ':Lib_Common') } diff --git a/settings.gradle b/settings.gradle index c01e292..c4314d7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ +include ':Lib_Main' include ':Lib_Common' include ':Lib_Base' include ':app' From 773474f8d172b700a10bd73c6f9d227c1fcc0a69 Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Mon, 31 Aug 2020 10:57:11 +0800 Subject: [PATCH 2/9] =?UTF-8?q?Modify:=20=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib_Base/build.gradle | 2 ++ .../com/quyunshuo/common/ui/BaseActivity.kt | 12 ++++++- .../src/main/res/drawable/common_btn.xml | 7 +++++ .../main/res/drawable/common_layout_bg.xml | 7 +++++ .../src/main/res/drawable/common_sheet.xml | 7 +++++ .../quyunshuo/main/ui/main/MainActivity.kt | 20 ++++++++++-- .../main/res/layout/main_activity_main.xml | 27 ++++++++++++++-- .../res/layout/main_bottom_sheet_layout.xml | 31 +++++++++++++++++++ Lib_Main/src/main/res/values/strings.xml | 2 ++ .../DependencyManager.kt | 2 ++ 10 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 Lib_Common/src/main/res/drawable/common_btn.xml create mode 100644 Lib_Common/src/main/res/drawable/common_layout_bg.xml create mode 100644 Lib_Common/src/main/res/drawable/common_sheet.xml create mode 100644 Lib_Main/src/main/res/layout/main_bottom_sheet_layout.xml diff --git a/Lib_Base/build.gradle b/Lib_Base/build.gradle index c3f6848..42fcaac 100644 --- a/Lib_Base/build.gradle +++ b/Lib_Base/build.gradle @@ -50,6 +50,8 @@ dependencies { api AndroidX.FragmentKtx api AndroidX.MultiDex + api Android.Material + api Kotlin.Kotlin api Kotlin.CoroutinesCore api Kotlin.CoroutinesAndroid diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/ui/BaseActivity.kt b/Lib_Common/src/main/java/com/quyunshuo/common/ui/BaseActivity.kt index b856366..8faa11f 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/ui/BaseActivity.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/ui/BaseActivity.kt @@ -1,7 +1,9 @@ package com.quyunshuo.common.ui +import androidx.annotation.ColorInt import androidx.lifecycle.ViewModel import androidx.viewbinding.ViewBinding +import com.jaeger.library.StatusBarUtil import com.quyunshuo.base.mvvm.v.BaseFrameActivity /** @@ -11,4 +13,12 @@ import com.quyunshuo.base.mvvm.v.BaseFrameActivity * @Remark: 项目相关的Activity基类 */ abstract class BaseActivity(vmClass: Class) : - BaseFrameActivity(vmClass) \ No newline at end of file + BaseFrameActivity(vmClass) { + + /** + * 设置状态栏颜色 + */ + protected fun setStatusBarColor(@ColorInt color: Int) { + StatusBarUtil.setColor(this, color, 0) + } +} \ No newline at end of file diff --git a/Lib_Common/src/main/res/drawable/common_btn.xml b/Lib_Common/src/main/res/drawable/common_btn.xml new file mode 100644 index 0000000..e0cee10 --- /dev/null +++ b/Lib_Common/src/main/res/drawable/common_btn.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Lib_Common/src/main/res/drawable/common_layout_bg.xml b/Lib_Common/src/main/res/drawable/common_layout_bg.xml new file mode 100644 index 0000000..e482ea2 --- /dev/null +++ b/Lib_Common/src/main/res/drawable/common_layout_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Lib_Common/src/main/res/drawable/common_sheet.xml b/Lib_Common/src/main/res/drawable/common_sheet.xml new file mode 100644 index 0000000..b25e244 --- /dev/null +++ b/Lib_Common/src/main/res/drawable/common_sheet.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt index a9a0f14..6e0aea0 100644 --- a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt @@ -1,8 +1,7 @@ package com.quyunshuo.main.ui.main -import android.graphics.Color import com.alibaba.android.arouter.facade.annotation.Route -import com.jaeger.library.StatusBarUtil +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.quyunshuo.common.constant.RouteUrl import com.quyunshuo.common.ui.BaseActivity import com.quyunshuo.main.R @@ -21,6 +20,21 @@ class MainActivity : override fun initViewBinding() = MainActivityMainBinding.inflate(layoutInflater) override fun initView() { - StatusBarUtil.setColor(this, resources.getColor(R.color.common_theme_color)) + setStatusBarColor(resources.getColor(R.color.common_theme_color)) + val sheetBehavior = + BottomSheetBehavior.from(mBinding.mSelectFunctionLayout.mBottomSheetLayout).apply { + state = BottomSheetBehavior.STATE_HIDDEN + isHideable = true + } + mBinding.mSelectFunctionBtn.setOnClickListener { + if (sheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { + sheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + } else { + sheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED + } + } + mBinding.mSelectFunctionLayout.mTranslationTv.setOnClickListener { + // 跳转到翻译模块 + } } } \ No newline at end of file diff --git a/Lib_Main/src/main/res/layout/main_activity_main.xml b/Lib_Main/src/main/res/layout/main_activity_main.xml index 2fbe2bd..fe38ec4 100644 --- a/Lib_Main/src/main/res/layout/main_activity_main.xml +++ b/Lib_Main/src/main/res/layout/main_activity_main.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/layout/main_bottom_sheet_layout.xml b/Lib_Main/src/main/res/layout/main_bottom_sheet_layout.xml new file mode 100644 index 0000000..4837ab1 --- /dev/null +++ b/Lib_Main/src/main/res/layout/main_bottom_sheet_layout.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/Lib_Main/src/main/res/values/strings.xml b/Lib_Main/src/main/res/values/strings.xml index e56a806..1799bd8 100644 --- a/Lib_Main/src/main/res/values/strings.xml +++ b/Lib_Main/src/main/res/values/strings.xml @@ -1,4 +1,6 @@ Lib_Main Welcome to AndroidBaseFrameMVVM! + 选择功能 + Translation \ No newline at end of file diff --git a/buildSrc/src/main/java/com.quyunshuo.androidbaseframemvvm.build/DependencyManager.kt b/buildSrc/src/main/java/com.quyunshuo.androidbaseframemvvm.build/DependencyManager.kt index 4572e09..62627b1 100644 --- a/buildSrc/src/main/java/com.quyunshuo.androidbaseframemvvm.build/DependencyManager.kt +++ b/buildSrc/src/main/java/com.quyunshuo.androidbaseframemvvm.build/DependencyManager.kt @@ -16,6 +16,7 @@ object Version { // Android--------------------------------------------------------------- const val Junit = "4.13" + const val Material = "1.2.0" // Kotlin---------------------------------------------------------------- const val Kotlin = "1.4.0" @@ -61,6 +62,7 @@ object AndroidX { object Android { const val Junit = "junit:junit:${Version.Junit}" + const val Material = "com.google.android.material:material:${Version.Material}" } object JetPack { From 5e89d19358b1090f7543b900cb84cb02a3ea2110 Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Mon, 31 Aug 2020 15:15:13 +0800 Subject: [PATCH 3/9] =?UTF-8?q?Modify:=20=E7=BF=BB=E8=AF=91=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib_Base/build.gradle | 1 + .../base/mvvm/v/BaseFrameActivity.kt | 2 + .../quyunshuo/base/mvvm/vm/BaseViewModel.kt | 4 + .../res/xml/base_network_security_config.xml | 0 .../common/bean/TranslationResponse.kt | 18 ++++ .../quyunshuo/common/constant/AppConstant.kt | 16 +++ .../com/quyunshuo/common/constant/NetUrl.kt | 6 +- .../com/quyunshuo/common/constant/RouteUrl.kt | 4 + .../com/quyunshuo/common/net/NetRequest.kt | 6 ++ .../quyunshuo/common/net/NetServiceCreator.kt | 21 +++- .../net/api/ApiBaiDuTranslationService.kt | 33 +++++++ .../java/com/quyunshuo/common/utils/MD5.kt | 35 +++++++ .../res/drawable/common_translation_btn.xml | 7 ++ .../main/res/layout/common_loading_layout.xml | 18 ++++ Lib_Main/build.gradle | 6 -- .../quyunshuo/main/ui/main/MainActivity.kt | 7 ++ .../main/ui/splash/SplashActivity.kt | 2 + .../src/main/java/debug/AndroidManifest.xml | 10 +- Lib_Translation/.gitignore | 1 + Lib_Translation/build.gradle | 5 + Lib_Translation/consumer-rules.pro | 0 Lib_Translation/proguard-rules.pro | 21 ++++ .../translation/ExampleInstrumentedTest.kt | 24 +++++ Lib_Translation/src/main/AndroidManifest.xml | 8 ++ .../translation/TranslationActivity.kt | 65 +++++++++++++ .../translation/TranslationRepository.kt | 36 +++++++ .../translation/TranslationViewModel.kt | 56 +++++++++++ .../src/main/java/debug/AndroidManifest.xml | 27 ++++++ .../main/java/debug/TranslationApplication.kt | 11 +++ .../res/drawable-xxhdpi/translation_clean.png | Bin 0 -> 3152 bytes .../res/drawable-xxhdpi/translation_copy.png | Bin 0 -> 3833 bytes .../translation_activity_translation.xml | 91 ++++++++++++++++++ .../src/main/res/values/strings.xml | 6 ++ .../quyunshuo/translation/ExampleUnitTest.kt | 17 ++++ app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 +- .../DependencyManager.kt | 2 + settings.gradle | 1 + 38 files changed, 558 insertions(+), 12 deletions(-) rename app/src/main/res/xml/network_security_config.xml => Lib_Base/src/main/res/xml/base_network_security_config.xml (100%) create mode 100644 Lib_Common/src/main/java/com/quyunshuo/common/bean/TranslationResponse.kt create mode 100644 Lib_Common/src/main/java/com/quyunshuo/common/constant/AppConstant.kt create mode 100644 Lib_Common/src/main/java/com/quyunshuo/common/net/api/ApiBaiDuTranslationService.kt create mode 100644 Lib_Common/src/main/java/com/quyunshuo/common/utils/MD5.kt create mode 100644 Lib_Common/src/main/res/drawable/common_translation_btn.xml create mode 100644 Lib_Common/src/main/res/layout/common_loading_layout.xml create mode 100644 Lib_Translation/.gitignore create mode 100644 Lib_Translation/build.gradle create mode 100644 Lib_Translation/consumer-rules.pro create mode 100644 Lib_Translation/proguard-rules.pro create mode 100644 Lib_Translation/src/androidTest/java/com/quyunshuo/translation/ExampleInstrumentedTest.kt create mode 100644 Lib_Translation/src/main/AndroidManifest.xml create mode 100644 Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationActivity.kt create mode 100644 Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationRepository.kt create mode 100644 Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationViewModel.kt create mode 100644 Lib_Translation/src/main/java/debug/AndroidManifest.xml create mode 100644 Lib_Translation/src/main/java/debug/TranslationApplication.kt create mode 100644 Lib_Translation/src/main/res/drawable-xxhdpi/translation_clean.png create mode 100644 Lib_Translation/src/main/res/drawable-xxhdpi/translation_copy.png create mode 100644 Lib_Translation/src/main/res/layout/translation_activity_translation.xml create mode 100644 Lib_Translation/src/main/res/values/strings.xml create mode 100644 Lib_Translation/src/test/java/com/quyunshuo/translation/ExampleUnitTest.kt diff --git a/Lib_Base/build.gradle b/Lib_Base/build.gradle index 42fcaac..b263e7d 100644 --- a/Lib_Base/build.gradle +++ b/Lib_Base/build.gradle @@ -74,6 +74,7 @@ dependencies { api GitHub.EventBus api GitHub.Bugly api GitHub.PermissionX + api GitHub.SpinKit kapt GitHub.GlideCompiler kapt GitHub.ARouteCompiler diff --git a/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/v/BaseFrameActivity.kt b/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/v/BaseFrameActivity.kt index 83d301e..94d707a 100644 --- a/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/v/BaseFrameActivity.kt +++ b/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/v/BaseFrameActivity.kt @@ -26,6 +26,7 @@ abstract class BaseFrameActivity(private val v protected abstract fun initViewBinding(): VB protected abstract fun initView() + protected abstract fun initViewObserve() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -35,6 +36,7 @@ abstract class BaseFrameActivity(private val v // 注册EventBus if (javaClass.isAnnotationPresent(EventBusRegister::class.java)) EventBusUtils.register(this) initView() + initViewObserve() } override fun onDestroy() { diff --git a/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/vm/BaseViewModel.kt b/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/vm/BaseViewModel.kt index 4e4be96..4e1c277 100644 --- a/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/vm/BaseViewModel.kt +++ b/Lib_Base/src/main/java/com/quyunshuo/base/mvvm/vm/BaseViewModel.kt @@ -1,5 +1,6 @@ package com.quyunshuo.base.mvvm.vm +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.quyunshuo.base.mvvm.m.BaseRepository @@ -11,6 +12,9 @@ import com.quyunshuo.base.mvvm.m.BaseRepository */ abstract class BaseViewModel : ViewModel() { + // Loading 状态 + val isLoading = MutableLiveData(false) + protected val mRepository: R by lazy { initRepository() } protected abstract fun initRepository(): R diff --git a/app/src/main/res/xml/network_security_config.xml b/Lib_Base/src/main/res/xml/base_network_security_config.xml similarity index 100% rename from app/src/main/res/xml/network_security_config.xml rename to Lib_Base/src/main/res/xml/base_network_security_config.xml diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/bean/TranslationResponse.kt b/Lib_Common/src/main/java/com/quyunshuo/common/bean/TranslationResponse.kt new file mode 100644 index 0000000..f7698f4 --- /dev/null +++ b/Lib_Common/src/main/java/com/quyunshuo/common/bean/TranslationResponse.kt @@ -0,0 +1,18 @@ +package com.quyunshuo.common.bean + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: TranslationResponse + * @Remark: 百度普通翻译Response + */ +data class TranslationResponse( + val from: String, + val to: String, + val trans_result: List +) + +data class TransResult( + val dst: String, + val src: String +) \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/constant/AppConstant.kt b/Lib_Common/src/main/java/com/quyunshuo/common/constant/AppConstant.kt new file mode 100644 index 0000000..4c3ea9b --- /dev/null +++ b/Lib_Common/src/main/java/com/quyunshuo/common/constant/AppConstant.kt @@ -0,0 +1,16 @@ +package com.quyunshuo.common.constant + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: AppConstant + * @Remark: + */ +object AppConstant { + + //百度翻译接口的AppId + const val translationAppId = "20200110000374346" + + //百度翻译接口的密钥 + const val translationSecurityKry = "gExnXw11K8ho50vo4aRm" +} \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/constant/NetUrl.kt b/Lib_Common/src/main/java/com/quyunshuo/common/constant/NetUrl.kt index 266398b..9b507c2 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/constant/NetUrl.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/constant/NetUrl.kt @@ -6,4 +6,8 @@ package com.quyunshuo.common.constant * @Class: NetUrl * @Remark: 请求公共地址 统一放在此类 */ -object NetUrl \ No newline at end of file +object NetUrl { + + // 百度翻译 + const val translationBaseUrl = "https://api.fanyi.baidu.com/" +} \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt b/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt index 45f8d7f..b0e8317 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/constant/RouteUrl.kt @@ -7,9 +7,13 @@ package com.quyunshuo.common.constant * @Remark: 路由地址 */ object RouteUrl { + // 启动页 const val SplashActivity = "/Lib_Main/SplashActivity" // 首页 const val MainActivity = "/Lib_Main/MainActivity" + + // 翻译 + const val TranslationActivity = "/Lib_Translation/TranslationActivity" } \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/net/NetRequest.kt b/Lib_Common/src/main/java/com/quyunshuo/common/net/NetRequest.kt index 47df493..d819225 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/net/NetRequest.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/net/NetRequest.kt @@ -1,6 +1,7 @@ package com.quyunshuo.common.net import com.quyunshuo.common.net.api.ApiCommonService +import com.quyunshuo.common.net.api.ApiBaiDuTranslationService /** * @Author: QuYunShuo @@ -14,4 +15,9 @@ object NetRequest { val commonService by lazy(mode = LazyThreadSafetyMode.NONE) { NetServiceCreator.create(ApiCommonService::class.java) } + + // 百度翻译接口 + val translationService by lazy(mode = LazyThreadSafetyMode.NONE) { + NetServiceCreator.createBaiDu(ApiBaiDuTranslationService::class.java) + } } \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/net/NetServiceCreator.kt b/Lib_Common/src/main/java/com/quyunshuo/common/net/NetServiceCreator.kt index 54d64d9..21cf032 100644 --- a/Lib_Common/src/main/java/com/quyunshuo/common/net/NetServiceCreator.kt +++ b/Lib_Common/src/main/java/com/quyunshuo/common/net/NetServiceCreator.kt @@ -2,6 +2,7 @@ package com.quyunshuo.common.net import com.quyunshuo.base.BaseApplication import com.quyunshuo.base.BuildConfig +import com.quyunshuo.common.constant.NetUrl import com.readystatesoftware.chuck.ChuckInterceptor import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -17,8 +18,6 @@ import java.util.concurrent.TimeUnit */ object NetServiceCreator { - private const val BASE_URL = "" - private const val CONNECT_TIME_OUT = 15L private const val READ_TIME_OUT = 20L @@ -41,14 +40,30 @@ object NetServiceCreator { .build() } + // App自己的后台 private val retrofit by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { Retrofit.Builder() - .baseUrl(BASE_URL) + .baseUrl("") .addConverterFactory(GsonConverterFactory.create()) // Gson转换器 .client(okHttpClient) .build() } + // 百度翻译 + private val baiDuTranslationRetrofit by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { + Retrofit.Builder() + .baseUrl(NetUrl.translationBaseUrl) + .addConverterFactory(GsonConverterFactory.create()) // Gson转换器 + .client(okHttpClient) + .build() + } + + /** + * 获取百度翻译service动态代理对象 + * @param serviceClass 接口Class对象 + */ + fun createBaiDu(serviceClass: Class): T = baiDuTranslationRetrofit.create(serviceClass) + /** * 获取service动态代理对象 * @param serviceClass 接口Class对象 diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/net/api/ApiBaiDuTranslationService.kt b/Lib_Common/src/main/java/com/quyunshuo/common/net/api/ApiBaiDuTranslationService.kt new file mode 100644 index 0000000..e9de3bd --- /dev/null +++ b/Lib_Common/src/main/java/com/quyunshuo/common/net/api/ApiBaiDuTranslationService.kt @@ -0,0 +1,33 @@ +package com.quyunshuo.common.net.api + +import com.quyunshuo.common.bean.TranslationResponse +import retrofit2.http.GET +import retrofit2.http.Query + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: ApiTranslationService + * @Remark: 百度翻译接口 + */ +interface ApiBaiDuTranslationService { + + /** + * 百度翻译 + * @param translation 需要翻译的文本 + * @param original 源语言 (auto 自动识别) + * @param target 目标语言 + * @param appId 翻译sdk的appId + * @param salt 随机数 + * @param sign 签名 (规则: appId + q + salt + 密钥的MD5值) + */ + @GET("api/trans/vip/translate?") + suspend fun sendBaiDuTranslation( + @Query("q") translation: String, + @Query("from") original: String, + @Query("to") target: String, + @Query("appid") appId: String, + @Query("salt") salt: String, + @Query("sign") sign: String + ): TranslationResponse +} \ No newline at end of file diff --git a/Lib_Common/src/main/java/com/quyunshuo/common/utils/MD5.kt b/Lib_Common/src/main/java/com/quyunshuo/common/utils/MD5.kt new file mode 100644 index 0000000..7e22eb0 --- /dev/null +++ b/Lib_Common/src/main/java/com/quyunshuo/common/utils/MD5.kt @@ -0,0 +1,35 @@ +package com.quyunshuo.common.utils + +import java.security.MessageDigest +import java.security.NoSuchAlgorithmException + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: MD5 + * @Remark:百度翻译MD5加密 + */ +object MD5 { + + fun encode(password: String): String { + try { + val instance: MessageDigest = MessageDigest.getInstance("MD5") // 获取md5加密对象 + val digest: ByteArray = + instance.digest(password.toByteArray()) // 对字符串加密,返回字节数组 + val sb = StringBuffer() + for (b in digest) { + val i: Int = b.toInt() and 0xff // 获取低八位有效值 + var hexString = Integer.toHexString(i) // 将整数转化为16进制 + if (hexString.length < 2) { + hexString = "0$hexString" // 如果是一位的话,补0 + } + sb.append(hexString) + } + return sb.toString() + + } catch (e: NoSuchAlgorithmException) { + e.printStackTrace() + } + return "" + } +} diff --git a/Lib_Common/src/main/res/drawable/common_translation_btn.xml b/Lib_Common/src/main/res/drawable/common_translation_btn.xml new file mode 100644 index 0000000..7437338 --- /dev/null +++ b/Lib_Common/src/main/res/drawable/common_translation_btn.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/Lib_Common/src/main/res/layout/common_loading_layout.xml b/Lib_Common/src/main/res/layout/common_loading_layout.xml new file mode 100644 index 0000000..dbefbe7 --- /dev/null +++ b/Lib_Common/src/main/res/layout/common_loading_layout.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/Lib_Main/build.gradle b/Lib_Main/build.gradle index 1306b36..0e08090 100644 --- a/Lib_Main/build.gradle +++ b/Lib_Main/build.gradle @@ -1,11 +1,5 @@ apply from: '../moduleBase.gradle' -apply plugin: 'kotlin-android' android { resourcePrefix "main_" -} - -dependencies { - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.0' } \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt index 6e0aea0..e6c07ff 100644 --- a/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/main/MainActivity.kt @@ -1,6 +1,7 @@ package com.quyunshuo.main.ui.main import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter import com.google.android.material.bottomsheet.BottomSheetBehavior import com.quyunshuo.common.constant.RouteUrl import com.quyunshuo.common.ui.BaseActivity @@ -35,6 +36,12 @@ class MainActivity : } mBinding.mSelectFunctionLayout.mTranslationTv.setOnClickListener { // 跳转到翻译模块 + ARouter.getInstance() + .build(RouteUrl.TranslationActivity) + .navigation() + sheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED } } + + override fun initViewObserve() {} } \ No newline at end of file diff --git a/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt index 03bb7c5..e9f3eaf 100644 --- a/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt +++ b/Lib_Main/src/main/java/com/quyunshuo/main/ui/splash/SplashActivity.kt @@ -41,4 +41,6 @@ class SplashActivity : finish() } } + + override fun initViewObserve() {} } \ No newline at end of file diff --git a/Lib_Main/src/main/java/debug/AndroidManifest.xml b/Lib_Main/src/main/java/debug/AndroidManifest.xml index 4fe45e4..f36e6e0 100644 --- a/Lib_Main/src/main/java/debug/AndroidManifest.xml +++ b/Lib_Main/src/main/java/debug/AndroidManifest.xml @@ -1,12 +1,20 @@ + + + + + + android:networkSecurityConfig="@xml/base_network_security_config" + android:theme="@style/base_AppTheme" + tools:ignore="UnusedAttribute"> diff --git a/Lib_Translation/.gitignore b/Lib_Translation/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/Lib_Translation/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Lib_Translation/build.gradle b/Lib_Translation/build.gradle new file mode 100644 index 0000000..f6a21c6 --- /dev/null +++ b/Lib_Translation/build.gradle @@ -0,0 +1,5 @@ +apply from: '../moduleBase.gradle' + +android { + resourcePrefix "translation_" +} \ No newline at end of file diff --git a/Lib_Translation/consumer-rules.pro b/Lib_Translation/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/Lib_Translation/proguard-rules.pro b/Lib_Translation/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/Lib_Translation/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Lib_Translation/src/androidTest/java/com/quyunshuo/translation/ExampleInstrumentedTest.kt b/Lib_Translation/src/androidTest/java/com/quyunshuo/translation/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..527a77b --- /dev/null +++ b/Lib_Translation/src/androidTest/java/com/quyunshuo/translation/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.quyunshuo.translation + +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.quyunshuo.translation.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/Lib_Translation/src/main/AndroidManifest.xml b/Lib_Translation/src/main/AndroidManifest.xml new file mode 100644 index 0000000..55c2034 --- /dev/null +++ b/Lib_Translation/src/main/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationActivity.kt b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationActivity.kt new file mode 100644 index 0000000..9016878 --- /dev/null +++ b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationActivity.kt @@ -0,0 +1,65 @@ +package com.quyunshuo.translation + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.text.InputType +import com.alibaba.android.arouter.facade.annotation.Route +import com.quyunshuo.base.ktx.gone +import com.quyunshuo.base.ktx.toast +import com.quyunshuo.base.ktx.visible +import com.quyunshuo.common.constant.RouteUrl +import com.quyunshuo.common.ui.BaseActivity +import com.quyunshuo.translation.databinding.TranslationActivityTranslationBinding +import kotlinx.android.synthetic.main.translation_activity_translation.* + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: TranslationActivity + * @Remark: 翻译主页 + */ +@Route(path = RouteUrl.TranslationActivity) +class TranslationActivity : + BaseActivity(TranslationViewModel::class.java) { + + override fun initViewBinding() = TranslationActivityTranslationBinding.inflate(layoutInflater) + + override fun initView() { + // 设置EditText + mBinding.mEdit.run { + inputType = InputType.TYPE_TEXT_FLAG_MULTI_LINE + isSingleLine = false + setHorizontallyScrolling(false) + } + // 拷贝 + mBinding.mCopyImg.setOnClickListener { + val clipboardManager: ClipboardManager = + getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + clipboardManager.setPrimaryClip(ClipData.newPlainText(mShowTv.text, mShowTv.text)) + toast("已复制") + } + // 清空输入框 + mBinding.mCleanImg.setOnClickListener { mBinding.mEdit.setText("") } + // 翻译按钮监听 + mBinding.mTranslationBtn.setOnClickListener { + if (mEdit.text.toString().isNotEmpty()) { + // 请求翻译 + mViewModel.requestTranslation(mEdit.text.toString()) + } + } + } + + override fun initViewObserve() { + // 观察 ViewModel 的 translationLiveData,当其发生改变时,做出响应 + mViewModel.translationLiveData.observe(this, { mBinding.mShowTv.text = it }) + // Loading 图 + mViewModel.isLoading.observe(this, { + if (it) { + mBinding.mLoadingLayout.visible() + } else { + mBinding.mLoadingLayout.gone() + } + }) + } +} \ No newline at end of file diff --git a/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationRepository.kt b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationRepository.kt new file mode 100644 index 0000000..c92a543 --- /dev/null +++ b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationRepository.kt @@ -0,0 +1,36 @@ +package com.quyunshuo.translation + +import com.quyunshuo.base.mvvm.m.BaseRepository +import com.quyunshuo.common.constant.AppConstant +import com.quyunshuo.common.net.NetRequest +import com.quyunshuo.common.utils.MD5 + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: TranslationRepository + * @Remark: + */ +class TranslationRepository : BaseRepository() { + + /** + * 获取翻译结果 + * @param original 需要翻译的文本 + */ + fun getTranslation(original: String) = + flowRequest { + // 以当前时间做为随机数 + val sign = System.currentTimeMillis().toString() + // 发起请求 + val response = NetRequest.translationService.sendBaiDuTranslation( + original, + "auto", + "en", + AppConstant.translationAppId, + sign, + MD5.encode("${AppConstant.translationAppId}${original}${sign}${AppConstant.translationSecurityKry}") + ) + // 将翻译结果发射出去 + emit(response.trans_result[0].dst) + } +} \ No newline at end of file diff --git a/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationViewModel.kt b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationViewModel.kt new file mode 100644 index 0000000..840f531 --- /dev/null +++ b/Lib_Translation/src/main/java/com/quyunshuo/translation/TranslationViewModel.kt @@ -0,0 +1,56 @@ +package com.quyunshuo.translation + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.quyunshuo.base.mvvm.vm.BaseViewModel +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.launch + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: TranslationViewModel + * @Remark: + */ +class TranslationViewModel : BaseViewModel() { + + override fun initRepository() = TranslationRepository() + + // 私有的可变 LiveData + private val _translationLiveData = MutableLiveData() + + // 对外暴露不可变的 LiveData + + val translationLiveData: LiveData = _translationLiveData + + /** + * 请求翻译 + * @param original 需要翻译的文本 + */ + fun requestTranslation(original: String) { + viewModelScope.launch { + mRepository.getTranslation(original) + .onStart { + // 请求开始之前的操作 + isLoading.value = true + } + .catch { + // 捕获并处理上游抛出的异常 + _translationLiveData.value = "error" + isLoading.value = false + } + .onCompletion { + // 已完成 + isLoading.value = false + } + .collectLatest { + // 获取结果 + _translationLiveData.value = it + } + } + } +} \ No newline at end of file diff --git a/Lib_Translation/src/main/java/debug/AndroidManifest.xml b/Lib_Translation/src/main/java/debug/AndroidManifest.xml new file mode 100644 index 0000000..761b86b --- /dev/null +++ b/Lib_Translation/src/main/java/debug/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Lib_Translation/src/main/java/debug/TranslationApplication.kt b/Lib_Translation/src/main/java/debug/TranslationApplication.kt new file mode 100644 index 0000000..c54bd64 --- /dev/null +++ b/Lib_Translation/src/main/java/debug/TranslationApplication.kt @@ -0,0 +1,11 @@ +package debug + +import com.quyunshuo.common.CommonApplication + +/** + * @Author: QuYunShuo + * @Time: 2020/8/31 + * @Class: TranslationApplication + * @Remark: Translation模块作为App时的Application + */ +class TranslationApplication : CommonApplication() \ No newline at end of file diff --git a/Lib_Translation/src/main/res/drawable-xxhdpi/translation_clean.png b/Lib_Translation/src/main/res/drawable-xxhdpi/translation_clean.png new file mode 100644 index 0000000000000000000000000000000000000000..20dc2028e1398c66cce27679d8b8ae0cfef4bb56 GIT binary patch literal 3152 zcmeH~eK^zm8^>p@Y)Df|B`hJ2d03w2VMB+_<4Gt9ozhkbd0g5NLvfO$Dg9zpv6x_f3WT!pW`R=Et6Fq5SLiPo0Y4DTk&*4p)l`;0|-poZ8Cz9x;+>~ zj4T8NMZiC914C2QlU`VXt=LxK_s+s(AaztnW^W_}{tt|gIyY??XtVqWqAk#baMM6R zQDTlL9hkt1n`w3w64{)ShH>`cj!o$CD1f}PLSZPofND>`Pvjer_YMDq*j6?xn8S+i z0X?z`A5$m9#D~0 z*{Go2hV$$ySr`5U-jMrXhW8gl=Qdy5XZ!@+a+3x_z~c1SV?j!n}$4FCJW zURm@TPf;M$cPe?H*t2e}F=!{0=hxQc+f79TK^D$cA;D!dcMEN8+k2`^CxK+$`r1Bj z7OB&o=yuaY^6Z4G^(6GXUgW!Q!NaF*P-;i8rBD>tD-5C^xqjBglp23)1^7H%Eux^A{|R+c=CkGmBX zQ0a?U{zFv!@%#g?NN{!aQg_yKIjtz;ZxU+Nl=_{|9xX#)0iDiTb;j{{CJEK~9KN{i zkzQhOIc6XSI~SYubaT2xFJt88Spi*rMRMJ%3T?_1VOFjNJ(rs?ruHp7im9X(r)jTT zO;2h`^ceVL5WNV)sQ%QUxIG8Kuzfi-OE3gw z=>R>qV=R*5ZWx-kgB((}1KbU%tGfcnmLwx6?g)c?Db$Dl7uaYMtc<_l|Ni)|CvzDG z1$`&8rRivQp6DDfm=YZFetD}uz6o}z1YU7yj5dn zuV zcX6zNZJ_T$S!--oLCT+*7rVnO`^Mg*-3!2sC3RtuP55U!>_iD1t5Iau?t-|~h%ekr z4skh{2PdbR^lGGHW*IVITH3~>uM+!wi2n`*#c+R*S2E@eay)E1#BA4kN4X}YgI%X^ z`Rl%qMXGbBDvCPOx6m?>0W5M7AymHWRuSL0D`+oS!TI4O5V$+J_JFFQn!-@d+n)3X>(RzB}`d>ap2L#KT<9I5Czr| zBxN;L3G zyWu{AV1YRNGZAm~WK_S#DwbavFZiw5CNVkea>rb{u@S|3ZSZ9t6u7OAbCiz09GUZH z!b%x5#H7w}8yvgu-j}11>#w!#iZ2!$^z!@uqE&=$CvH^$i#BnRr!+g(C4IN=%8N?4 zet~Z1VdTbzp4(-nL}Gj3fUjDUgu_`I&Ltf$Er!mVrUree<@M)tWuN?)`j1?O2I_UfeGiH@r&4OjSGFcQTU+Q@7 z8XkvjHG^MYUw0Eb_WSg`{w{+`@9=(zaIYPC>iv65c zFPjb>)mpM-2G{5Q8r+w$kL|3*3s|dOJA~&?cPNQ+`12hYO_4Ng>$L+`Es-yN?%Xyi2scC5X1en zHbu=5H<5F${(F2SprV-@_+`xn*Pav809*{Ueav(v^FPQ5Zp}LDdQ52Mb^EG&zBFNO x;q$7wQb}VLANi^WMNsr~na)he|605$Yu|j`VQ?jzC*2f4xSu>vR5_kc{uh&J%RvAD literal 0 HcmV?d00001 diff --git a/Lib_Translation/src/main/res/drawable-xxhdpi/translation_copy.png b/Lib_Translation/src/main/res/drawable-xxhdpi/translation_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..618b8b6f2cc98b151450c1ec23f1f61b0f3d1da2 GIT binary patch literal 3833 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 JPtP&*e*neIy}SSb literal 0 HcmV?d00001 diff --git a/Lib_Translation/src/main/res/layout/translation_activity_translation.xml b/Lib_Translation/src/main/res/layout/translation_activity_translation.xml new file mode 100644 index 0000000..4d72039 --- /dev/null +++ b/Lib_Translation/src/main/res/layout/translation_activity_translation.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + +