From 22ce7444e502dd289364994002ce6564a4b5929e Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Apr 2022 15:05:15 +0400 Subject: [PATCH 1/5] Fixed CountDownTimer --- .gitignore | 9 ++++- .../utils/core/coroutines/CountDownTimer.kt | 34 +++++++++---------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 539157b..f60479b 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,11 @@ local.properties app/src/main/obj/ -buildSrc/build \ No newline at end of file +buildSrc/build +sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/mpp_library.xcscheme + +sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/Pods-ios-app.xcscheme + +sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/Reachability.xcscheme + +sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt index 86967d7..34fa16c 100644 --- a/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt +++ b/utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/coroutines/CountDownTimer.kt @@ -83,29 +83,27 @@ class CountDownTimer( private fun timerCanStart() { timerJob = scope.launch { - withContext(Dispatchers.Unconfined) { - state = CurrentTimerState.RUNNING + state = CurrentTimerState.RUNNING - onTick(countDownTimer) - delay(delay) + onTick(countDownTimer) + delay(delay) - timerLoop@ while (isActive) { - countDownTimer -= delay + timerLoop@ while (isActive) { + countDownTimer -= delay - if (countDownTimer <= TimeUnit.getEmpty()) { - state = CurrentTimerState.STOPPED + if (countDownTimer <= TimeUnit.getEmpty()) { + state = CurrentTimerState.STOPPED - onTick(TimeUnit.getEmpty()) - timerJob?.cancel() - listener.onStop() - } else { - onTick(countDownTimer) + onTick(TimeUnit.getEmpty()) + timerJob?.cancel() + listener.onStop() + } else { + onTick(countDownTimer) - if (countDownTimer < delay) { - delay(countDownTimer) - } else { - delay(delay) - } + if (countDownTimer < delay) { + delay(countDownTimer) + } else { + delay(delay) } } } From 84c4991277288faec44df23af5d9e4f04aba58b3 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Apr 2022 15:16:17 +0400 Subject: [PATCH 2/5] rewrite gitignore --- .gitignore | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index f60479b..74999c5 100644 --- a/.gitignore +++ b/.gitignore @@ -42,10 +42,7 @@ local.properties app/src/main/obj/ buildSrc/build -sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/mpp_library.xcscheme -sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/Pods-ios-app.xcscheme +xcschemes -sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/Reachability.xcscheme - -sample/ios-app/Pods/Pods.xcodeproj/xcuserdata/andrey.xcuserdatad/xcschemes/xcschememanagement.plist +Pods From 440fdae2ecb3a3c284876c531a37cd7875b19374 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 27 Apr 2022 15:18:17 +0400 Subject: [PATCH 3/5] xschemes -> xcuserdata --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 74999c5..722f40a 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,6 @@ app/src/main/obj/ buildSrc/build -xcschemes +xcuserdata Pods From 30589f57c138412de6e5a8ea30ce6d634621b6c9 Mon Sep 17 00:00:00 2001 From: Ivan Sablin Date: Fri, 29 Apr 2022 20:19:59 +0700 Subject: [PATCH 4/5] Add kmm notifications feature, android sample --- .../presentation/fragment/BaseVMFragment.kt | 14 ++-- buildSrc/settings.gradle.kts | 2 +- buildSrc/src/main/kotlin/Versions.kt | 2 +- sample/androidApp/build.gradle.kts | 38 +++++++++ .../androidApp/src/main/AndroidManifest.xml | 23 +++++- .../com/merseyside/sample/MainApplication.kt | 19 +++++ .../com/merseyside/sample/di/AndroidModule.kt | 21 +++++ .../notification/AppNotificationAdapter.kt | 77 +++++++++++++++++ .../merseyside/sample/view/MainActivity.kt | 35 ++++++++ .../src/main/res/drawable/ic_notification.xml | 5 ++ .../src/main/res/layout/activity_main.xml | 17 ++++ .../androidApp/src/main/res/values/colors.xml | 25 ++++++ .../androidApp/src/main/res/values/styles.xml | 28 +++++++ .../xcschemes/xcschememanagement.plist | 6 -- sample/mpp-library/build.gradle.kts | 13 +++ .../src/androidMain/AndroidManifest.xml | 2 +- .../sample/notifications/Converters.kt | 23 ++++++ .../kotlin/com/merseyside/sample/di/Koin.kt | 36 ++++++++ .../sample/notifications/Converters.kt | 7 ++ .../sample/notifications/MessageEntity.kt | 7 ++ .../sample/notifications/NotificationTest.kt | 22 +++++ settings.gradle.kts | 2 +- utils-core/build.gradle.kts | 3 +- .../utils/core/notification/Notification.kt | 64 +++++++++++++++ .../core/notification/NotificationAdapter.kt | 49 +++++++++++ .../utils/core/notification/Typealias.kt | 5 ++ .../utils/core/koin/KoinMultibinding.kt | 82 +++++++++++++++++++ .../utils/core/notification/Notification.kt | 32 ++++++++ .../core/notification/NotificationAdapter.kt | 9 ++ .../core/notification/NotificationBuilder.kt | 47 +++++++++++ .../utils/core/notification/di/KoinExt.kt | 39 +++++++++ .../utils/core/notification/Notification.kt | 43 ++++++++++ .../core/notification/NotificationAdapter.kt | 10 +++ 33 files changed, 787 insertions(+), 20 deletions(-) create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/MainApplication.kt create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/di/AndroidModule.kt create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/utils/notification/AppNotificationAdapter.kt create mode 100644 sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt create mode 100644 sample/androidApp/src/main/res/drawable/ic_notification.xml create mode 100644 sample/androidApp/src/main/res/layout/activity_main.xml create mode 100644 sample/androidApp/src/main/res/values/colors.xml create mode 100644 sample/androidApp/src/main/res/values/styles.xml create mode 100644 sample/mpp-library/src/androidMain/kotlin/com/merseyside/sample/notifications/Converters.kt create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/di/Koin.kt create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/notifications/Converters.kt create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/notifications/MessageEntity.kt create mode 100644 sample/mpp-library/src/commonMain/kotlin/com/merseyside/sample/notifications/NotificationTest.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/notification/Notification.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/notification/NotificationAdapter.kt create mode 100644 utils-core/src/androidMain/kotlin/com/merseyside/merseyLib/utils/core/notification/Typealias.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/koin/KoinMultibinding.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/notification/Notification.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/notification/NotificationAdapter.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/notification/NotificationBuilder.kt create mode 100644 utils-core/src/commonMain/kotlin/com/merseyside/merseyLib/utils/core/notification/di/KoinExt.kt create mode 100644 utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/notification/Notification.kt create mode 100644 utils-core/src/iosMain/kotlin/com/merseyside/merseyLib/utils/core/notification/NotificationAdapter.kt diff --git a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt index f51d362..9beeec4 100644 --- a/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt +++ b/archy-android/src/main/java/com/merseyside/merseyLib/archy/android/presentation/fragment/BaseVMFragment.kt @@ -18,10 +18,10 @@ import kotlinx.serialization.builtins.MapSerializer import kotlinx.serialization.builtins.serializer import kotlin.reflect.KClass -abstract class BaseVMFragment - : BaseBindingFragment() { +abstract class BaseVMFragment + : BaseBindingFragment() { - protected abstract val viewModel: M + protected abstract val viewModel: Model private val messageObserver = { message: BaseViewModel.TextMessage? -> if (message != null) { @@ -67,8 +67,8 @@ abstract class BaseVMFragment abstract fun getBindingVariable(): Int - open fun initDataBinding(): ViewDataBinding.() -> Unit { - return { + open fun initDataBinding(binding: Binding) { + binding.apply { setVariable(getBindingVariable(), viewModel) executePendingBindings() } @@ -81,9 +81,7 @@ abstract class BaseVMFragment override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - requireBinding().apply { - initDataBinding().invoke(this) - } + initDataBinding(requireBinding()) viewModel.apply { errorLiveEvent.ld().observe(viewLifecycleOwner, errorObserver) diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts index bdfa9b5..0d0365b 100644 --- a/buildSrc/settings.gradle.kts +++ b/buildSrc/settings.gradle.kts @@ -16,7 +16,7 @@ dependencyResolutionManagement { gradlePluginPortal() } - val catalogVersions = "1.4.4" + val catalogVersions = "1.4.5" val group = "io.github.merseyside" versionCatalogs { diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 352fe4f..3a30086 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -3,7 +3,7 @@ object Application { const val version = Metadata.version const val versionCode = 148 - const val applicationId = "com.merseyside.merseyLib.sample" + const val applicationId = "com.merseyside.sample" const val compileSdk = 31 const val targetSdk = 31 diff --git a/sample/androidApp/build.gradle.kts b/sample/androidApp/build.gradle.kts index 16a730f..9876c95 100644 --- a/sample/androidApp/build.gradle.kts +++ b/sample/androidApp/build.gradle.kts @@ -22,6 +22,8 @@ android { versionName = Application.version } + buildFeatures.dataBinding = true + lint { lintConfig = rootProject.file(".lint/config.xml") @@ -40,3 +42,39 @@ android { ) } } + +kotlinConvention { + debug = true + setCompilerArgs( + "-Xinline-classes", + "-opt-in=kotlin.RequiresOptIn", + "-Xskip-prerelease-check" + ) +} + +val android = listOf( + androidLibs.appCompat, + androidLibs.material, + androidLibs.koin +) + +val merseyLibs = listOf( + androidLibs.merseyLib.archy, + androidLibs.merseyLib.utils +) + +val merseyModules = listOf( + Modules.Android.MerseyLibs.archy, + Modules.Android.MerseyLibs.utils +) + +dependencies { + implementation(project(":sample:mpp-library")) + android.forEach { lib -> implementation(lib) } + + if (isLocalAndroidDependencies()) { + merseyModules.forEach { module -> implementation(project(module)) } + } else { + merseyLibs.forEach { lib -> implementation(lib) } + } +} diff --git a/sample/androidApp/src/main/AndroidManifest.xml b/sample/androidApp/src/main/AndroidManifest.xml index 1e1732b..3c35280 100644 --- a/sample/androidApp/src/main/AndroidManifest.xml +++ b/sample/androidApp/src/main/AndroidManifest.xml @@ -1,2 +1,23 @@ - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/MainApplication.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/MainApplication.kt new file mode 100644 index 0000000..d1b5732 --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/MainApplication.kt @@ -0,0 +1,19 @@ +package com.merseyside.sample + +import com.merseyside.archy.BaseApplication +import com.merseyside.merseyLib.utils.core.notification.NotificationBuilder +import com.merseyside.sample.di.androidModule +import com.merseyside.sample.di.initKoin +import org.koin.android.ext.koin.androidContext + +class MainApplication : BaseApplication() { + + override fun onCreate() { + super.onCreate() + + val koin = initKoin(androidModule) { + androidContext(this@MainApplication) + }.koin + koin.get() + } +} \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/di/AndroidModule.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/di/AndroidModule.kt new file mode 100644 index 0000000..be64381 --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/di/AndroidModule.kt @@ -0,0 +1,21 @@ +package com.merseyside.sample.di + +import com.merseyside.merseyLib.utils.core.notification.Notification +import com.merseyside.merseyLib.utils.core.notification.NotificationAdapter +import com.merseyside.merseyLib.utils.core.notification.NotificationInterceptor +import com.merseyside.sample.utils.notification.AppNotificationAdapter +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val androidModule = module { + single { + object : NotificationInterceptor() { + override fun intercept(notification: Notification) { + + } + } + } + + singleOf(::AppNotificationAdapter) bind NotificationAdapter::class +} \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/utils/notification/AppNotificationAdapter.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/utils/notification/AppNotificationAdapter.kt new file mode 100644 index 0000000..4116db0 --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/utils/notification/AppNotificationAdapter.kt @@ -0,0 +1,77 @@ +package com.merseyside.sample.utils.notification + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import com.merseyside.merseyLib.utils.core.notification.NotificationAdapter +import com.merseyside.merseyLib.utils.core.notification.NotificationDefinition +import com.merseyside.sample.R +import com.merseyside.sample.view.MainActivity + +class AppNotificationAdapter( + context: Context +): NotificationAdapter(context, CHANNEL_ID) { + + override fun defaultDefinition(context: Context): NotificationDefinition = { + priority = NotificationCompat.PRIORITY_DEFAULT + setVibrate(longArrayOf(200, 50, 200)) + setContentIntent(getPendingIntent(context)) + setSmallIcon(R.drawable.ic_notification) + setChannelId(CHANNEL_ID) + } + + @RequiresApi(Build.VERSION_CODES.O) + override fun createNotificationChannel(): NotificationChannel { + val name: CharSequence = VERBOSE_NOTIFICATION_CHANNEL_NAME + val description: String = VERBOSE_NOTIFICATION_CHANNEL_DESCRIPTION + val importance: Int = NotificationManager.IMPORTANCE_HIGH + + return NotificationChannel(CHANNEL_ID, name, importance).apply { + this.description = description + enableLights(true) + lightColor = Color.GREEN + } + } + + override fun show( + context: Context, + tag: String, + builder: NotificationCompat.Builder + ): Boolean { + val notification: Notification = builder.build() + notification.flags = notification.flags or Notification.FLAG_AUTO_CANCEL + + // Show the notification + NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification) + + return true + } + + private fun getPendingIntent(context: Context): PendingIntent { + val notificationIntent = Intent(context, MainActivity::class.java) + notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + + notificationIntent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + + return PendingIntent.getActivity( + context, 0, + notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT + ) + } + + companion object { + private const val VERBOSE_NOTIFICATION_CHANNEL_NAME = "Verbose notification channel name" + private const val VERBOSE_NOTIFICATION_CHANNEL_DESCRIPTION = "Verbose notification channel description" + private const val CHANNEL_ID = "342" + private val NOTIFICATION_ID = 112 + } + +} \ No newline at end of file diff --git a/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt new file mode 100644 index 0000000..d140bdc --- /dev/null +++ b/sample/androidApp/src/main/kotlin/com/merseyside/sample/view/MainActivity.kt @@ -0,0 +1,35 @@ +package com.merseyside.sample.view + +import android.os.Bundle +import androidx.appcompat.widget.Toolbar +import com.merseyside.archy.presentation.activity.BaseBindingActivity +import com.merseyside.sample.R +import com.merseyside.sample.databinding.ActivityMainBinding +import com.merseyside.sample.notifications.NotificationTest +import com.merseyside.utils.view.ext.onClick +import org.koin.android.ext.android.inject + +class MainActivity : BaseBindingActivity() { + + private val test by inject() + + override fun getFragmentContainer(): Int? { + return null + } + + override fun getLayoutId(): Int { + return R.layout.activity_main + } + + override fun getToolbar(): Toolbar? { + return null + } + + override fun performInjection(bundle: Bundle?, vararg params: Any) {} + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + requireBinding().showNotification.onClick { test.showNotification() } + } +} \ No newline at end of file diff --git a/sample/androidApp/src/main/res/drawable/ic_notification.xml b/sample/androidApp/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..20f9b3b --- /dev/null +++ b/sample/androidApp/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,5 @@ + + + diff --git a/sample/androidApp/src/main/res/layout/activity_main.xml b/sample/androidApp/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..38b8479 --- /dev/null +++ b/sample/androidApp/src/main/res/layout/activity_main.xml @@ -0,0 +1,17 @@ + + + + + +