Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package ru.bartwell.kick.module.overlay.core.overlay
package ru.bartwell.kick.core.presentation.overlay

import android.annotation.SuppressLint
import android.content.Context
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import android.widget.FrameLayout
import kotlin.math.abs

@Suppress("ReturnCount")
internal class DraggableContainer(
context: android.content.Context
public class DraggableContainer public constructor(
context: Context,
private val onPositionChanged: ((Float, Float) -> Unit)? = null,
) : FrameLayout(context) {

var dragTarget: View? = null
public var dragTarget: View? = null

private var downX = 0f
private var downY = 0f
Expand All @@ -22,9 +24,9 @@ internal class DraggableContainer(
private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop

@Suppress("EmptyFunctionBlock")
override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
public override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}

override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
public override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
val t = dragTarget ?: return false

val hit = ev.x >= t.x && ev.x <= t.x + t.width &&
Expand All @@ -39,8 +41,8 @@ internal class DraggableContainer(
return false
}
MotionEvent.ACTION_MOVE -> {
val dx = abs(ev.rawX - downX)
val dy = abs(ev.rawY - downY)
val dx = kotlin.math.abs(ev.rawX - downX)
val dy = kotlin.math.abs(ev.rawY - downY)
if (dx > touchSlop || dy > touchSlop) {
dragging = true
lastX = ev.rawX
Expand All @@ -58,7 +60,7 @@ internal class DraggableContainer(
}

@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
public override fun onTouchEvent(event: MotionEvent): Boolean {
val t = dragTarget ?: return false
if (!dragging) return false

Expand All @@ -70,6 +72,7 @@ internal class DraggableContainer(
lastY = event.rawY
t.translationX += dx
t.translationY += dy
onPositionChanged?.invoke(t.translationX, t.translationY)
return true
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ public enum class ModuleDescription(
title = "Firebase Cloud Messaging",
description = "Inspect FCM tokens, installation id, and delivered pushes."
),
FIREBASE_ANALYTICS(
title = "Firebase Analytics",
description = "Watch Firebase Analytics events, user ids, and properties as they happen."
),
RUNNER(
title = "Runner",
description = "Register debug actions and view their rendered results."
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.bartwell.kick.core.presentation.overlay

import kotlinx.cinterop.ObjCAction
import platform.UIKit.UIButton
import platform.darwin.NSObject

@kotlinx.cinterop.BetaInteropApi
public class ButtonTarget public constructor(private val action: () -> Unit) : NSObject() {
@Suppress("UnusedParameter")
@ObjCAction
public fun invoke(sender: UIButton?) {
action()
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.bartwell.kick.module.overlay.core.overlay
package ru.bartwell.kick.core.presentation.overlay

import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.ObjCAction
Expand All @@ -8,11 +8,12 @@ import platform.UIKit.UIPanGestureRecognizer
import platform.darwin.NSObject

@OptIn(ExperimentalForeignApi::class)
internal class PanTarget(
@kotlinx.cinterop.BetaInteropApi
public class PanTarget public constructor(
private val onDelta: (dx: Double, dy: Double) -> Unit
) : NSObject() {
@ObjCAction
fun onPan(gr: UIPanGestureRecognizer) {
public fun onPan(gr: UIPanGestureRecognizer) {
val v = gr.view ?: return
val container = v.superview ?: return
val t = gr.translationInView(container)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.bartwell.kick.module.overlay.core.overlay
package ru.bartwell.kick.core.presentation.overlay

import kotlinx.cinterop.CValue
import kotlinx.cinterop.ExperimentalForeignApi
Expand All @@ -11,14 +11,14 @@ import platform.UIKit.UIWindow
import platform.UIKit.UIWindowScene

@OptIn(ExperimentalForeignApi::class)
internal class PassThroughWindow : UIWindow {
public class PassThroughWindow : UIWindow {

var panel: UIView? = null
public var panel: UIView? = null

constructor(frame: CValue<CGRect>) : super(frame)
constructor(windowScene: UIWindowScene) : super(windowScene = windowScene)
public constructor(frame: CValue<CGRect>) : super(frame)
public constructor(windowScene: UIWindowScene) : super(windowScene = windowScene)

override fun pointInside(point: CValue<CGPoint>, withEvent: UIEvent?): Boolean {
public override fun pointInside(point: CValue<CGPoint>, withEvent: UIEvent?): Boolean {
val p = panel ?: return false
val rectInWindow = p.convertRect(p.bounds, toView = null)
return CGRectContainsPoint(rectInWindow, point)
Expand Down
89 changes: 89 additions & 0 deletions module/firebase/firebase-analytics-stub/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidLibrary)
alias(libs.plugins.jetbrainsCompose)
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.publish.plugin)
id("publish-convention")
}

group = "ru.bartwell.kick"
version = extra["libraryVersionName"] as String

kotlin {
androidTarget {
compilations.all {
compileTaskProvider.configure {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_1_8)
}
}
}
}

listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach {
it.binaries.framework {
baseName = "firebase-analytics-stub"
isStatic = true
}
}

sourceSets {
commonMain.dependencies {
implementation(projects.mainCore)
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.materialIconsExtended)
implementation(libs.decompose)
implementation(libs.decompose.extensions.compose)
implementation(libs.decompose.essenty.lifecycle.coroutines)
}
commonTest.dependencies {
implementation(libs.kotlin.test)
}
androidMain.dependencies {
implementation(libs.androidx.activity.compose)
}
appleMain.dependencies {
}
iosTest.dependencies {
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
implementation(compose.uiTest)
implementation(libs.kotlin.test)
}
wasmJsTest.dependencies {
@OptIn(org.jetbrains.compose.ExperimentalComposeLibrary::class)
implementation(compose.uiTest)
implementation(libs.kotlin.test)
}
}

explicitApi()
}

android {
namespace = "ru.bartwell.kick"
compileSdk = 35

defaultConfig {
minSdk = 24
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}

buildFeatures {
compose = true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.bartwell.kick.module.firebase.analytics

import android.os.Bundle

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.logEvent(name: String, params: Bundle?) {}

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.setUserId(id: String?) {}

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.setUserProperty(name: String, value: String) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package ru.bartwell.kick.module.firebase.analytics

public class FirebaseAnalyticsAccessor internal constructor()
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ru.bartwell.kick.module.firebase.analytics

import androidx.compose.runtime.Composable
import com.arkivanov.decompose.ComponentContext
import com.arkivanov.decompose.router.stack.StackNavigation
import kotlinx.serialization.modules.PolymorphicModuleBuilder
import ru.bartwell.kick.core.component.Child
import ru.bartwell.kick.core.component.Config
import ru.bartwell.kick.core.component.StubConfig
import ru.bartwell.kick.core.data.Module
import ru.bartwell.kick.core.data.ModuleDescription
import ru.bartwell.kick.core.data.PlatformContext

@Suppress("EmptyFunctionBlock", "UNUSED_PARAMETER")
public class FirebaseAnalyticsModule(
context: PlatformContext,
) : Module {

override val description: ModuleDescription = ModuleDescription.FIREBASE_ANALYTICS
override val startConfig: Config = StubConfig(description)

override fun getComponent(
componentContext: ComponentContext,
nav: StackNavigation<Config>,
config: Config,
): Child<*>? = null

@Composable
override fun Content(instance: Child<*>) {}

override fun registerSubclasses(builder: PolymorphicModuleBuilder<Config>) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.bartwell.kick.module.firebase.analytics

import ru.bartwell.kick.Kick

public val Kick.Companion.firebaseAnalytics: FirebaseAnalyticsAccessor
get() = FirebaseAnalyticsAccessor()
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ru.bartwell.kick.module.firebase.analytics

import platform.Foundation.NSDictionary

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.logEvent(name: String, params: NSDictionary?) {}

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.logEvent(name: String, params: Map<Any?, *>?) {}

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.setUserId(id: String?) {}

@Suppress("UnusedParameter", "EmptyFunctionBlock")
public fun FirebaseAnalyticsAccessor.setUserProperty(name: String, value: String) {}
Loading