Unverified Commit aff3c344 authored by dima.avdeev's avatar dima.avdeev Committed by GitHub

Fix Android build with Android SDK-33 and SDK-34 (#746)

Use workaround with Java sources. Because a platform Java type can be used as a platform type MotionEvent!
parent 42e03224
...@@ -88,3 +88,8 @@ tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile>().configureEach ...@@ -88,3 +88,8 @@ tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile>().configureEach
dependsOn(unzipTaskX64) dependsOn(unzipTaskX64)
dependsOn(unzipTaskArm64) dependsOn(unzipTaskArm64)
} }
tasks.withType<Copy> {
// This line needs to properly merge MANIFEST files from jars into dex
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
...@@ -231,6 +231,7 @@ kotlin { ...@@ -231,6 +231,7 @@ kotlin {
if (supportAndroid) { if (supportAndroid) {
jvm("android") { jvm("android") {
withJava() // This line needs to add Java sources in src/androidMain/java
compilations.all { compilations.all {
kotlinOptions.jvmTarget = "1.8" kotlinOptions.jvmTarget = "1.8"
} }
...@@ -653,6 +654,14 @@ if (supportAndroid) { ...@@ -653,6 +654,14 @@ if (supportAndroid) {
for (arch in arrayOf(Arch.X64, Arch.Arm64)) { for (arch in arrayOf(Arch.X64, Arch.Arm64)) {
createSkikoJvmJarTask(os, arch, skikoAndroidJar) createSkikoJvmJarTask(os, arch, skikoAndroidJar)
} }
tasks.getByName("publishAndroidPublicationToMavenLocal") {
// It needs to be compatible with Gradle 8.1
dependsOn(skikoAndroidJar)
}
tasks.getByName("generateMetadataFileForAndroidPublication") {
// It needs to be compatible with Gradle 8.1
dependsOn(skikoAndroidJar)
}
} }
fun createSkikoJvmJarTask(os: OS, arch: Arch, commonJar: TaskProvider<Jar>): TaskProvider<Jar> { fun createSkikoJvmJarTask(os: OS, arch: Arch, commonJar: TaskProvider<Jar>): TaskProvider<Jar> {
...@@ -797,7 +806,9 @@ fun Project.androidJar(askedVersion: String = ""): Provider<File> = ...@@ -797,7 +806,9 @@ fun Project.androidJar(askedVersion: String = ""): Provider<File> =
} else { } else {
"android-$askedVersion" "android-$askedVersion"
} }
androidHome.resolve("platforms/$version/android.jar") androidHome.resolve("platforms/$version/android.jar").also {
println("Skiko task androidJar uses android SDK in $it")
}
} }
fun createCompileJvmBindingsTask( fun createCompileJvmBindingsTask(
...@@ -1405,3 +1416,8 @@ rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJ ...@@ -1405,3 +1416,8 @@ rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJ
} }
} }
tasks.withType<JavaCompile> {
// Workaround to configure Java sources on Android (src/androidMain/java)
targetCompatibility = "1.8"
sourceCompatibility = "1.8"
}
package org.jetbrains.skiko;
import android.view.GestureDetector;
import android.view.MotionEvent;
import org.jetbrains.annotations.Nullable;
/**
* This workaround needs to support both Android SDK 33 (or lower) and SDK 34 (or higher)
*/
@SuppressWarnings("NullableProblems")
public abstract class WorkaroundSimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
final public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
return onScrollWorkaround(event1, event2, distanceX, distanceY);
}
@Override
final public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
return onFlingWorkaround(event1, event2, velocityX, velocityY);
}
/**
* This workaround helps to support @Nullable and @NonNull first argument
*/
abstract boolean onScrollWorkaround(@Nullable MotionEvent event1, MotionEvent event2, float distanceX, float distanceY);
/**
* This workaround helps to support @Nullable and @NonNull first argument
*/
abstract boolean onFlingWorkaround(@Nullable MotionEvent event1, MotionEvent event2, float distanceX, float distanceY);
}
...@@ -36,7 +36,7 @@ internal class SkikoGesturesDetector( ...@@ -36,7 +36,7 @@ internal class SkikoGesturesDetector(
return simpleGestures.onTouchEvent(event) return simpleGestures.onTouchEvent(event)
} }
private val simpleGestures = GestureDetector(context, object: SimpleOnGestureListener() { private val simpleGestures = GestureDetector(context, object: WorkaroundSimpleOnGestureListener() {
override fun onSingleTapUp(event: MotionEvent): Boolean { override fun onSingleTapUp(event: MotionEvent): Boolean {
if (!containsGesture(SkikoGestureEventKind.TAP)) return false if (!containsGesture(SkikoGestureEventKind.TAP)) return false
val density = layer.contentScale val density = layer.contentScale
...@@ -78,7 +78,7 @@ internal class SkikoGesturesDetector( ...@@ -78,7 +78,7 @@ internal class SkikoGesturesDetector(
) )
} }
override fun onScroll( override fun onScrollWorkaround(
event1: MotionEvent?, event1: MotionEvent?,
event2: MotionEvent, event2: MotionEvent,
distanceX: Float, distanceX: Float,
...@@ -97,7 +97,7 @@ internal class SkikoGesturesDetector( ...@@ -97,7 +97,7 @@ internal class SkikoGesturesDetector(
return true return true
} }
override fun onFling( override fun onFlingWorkaround(
event1: MotionEvent?, event1: MotionEvent?,
event2: MotionEvent, event2: MotionEvent,
velocityX: Float, velocityX: Float,
...@@ -277,3 +277,5 @@ internal class SkikoGesturesDetector( ...@@ -277,3 +277,5 @@ internal class SkikoGesturesDetector(
} }
} }
} }
typealias MotionEventNullableOrNo = MotionEvent?
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment