diff --git a/.gitignore b/.gitignore index 539157b..722f40a 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,8 @@ local.properties app/src/main/obj/ -buildSrc/build \ No newline at end of file +buildSrc/build + +xcuserdata + +Pods 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..6515166 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -2,8 +2,8 @@ object Application { const val groupId = "io.github.merseyside" const val version = Metadata.version - const val versionCode = 148 - const val applicationId = "com.merseyside.merseyLib.sample" + const val versionCode = 149 + const val applicationId = "com.merseyside.sample" const val compileSdk = 31 const val targetSdk = 31 diff --git a/buildSrc/src/main/kotlin/publication/Metadata.kt b/buildSrc/src/main/kotlin/publication/Metadata.kt index b8c1d59..d7063a6 100644 --- a/buildSrc/src/main/kotlin/publication/Metadata.kt +++ b/buildSrc/src/main/kotlin/publication/Metadata.kt @@ -1,4 +1,4 @@ object Metadata { const val groupId = "io.github.merseyside" - const val version = "1.4.8" + const val version = "1.4.9" } \ No newline at end of file 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 @@ + + + + + +