diff --git a/android/build.gradle b/android/build.gradle index f324b9a9..93fd3266 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -8,8 +8,8 @@ buildscript { dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") - classpath("com.android.tools.build:gradle:7.3.1") - classpath("com.diffplug.spotless:spotless-plugin-gradle:6.11.0") + classpath("com.android.tools.build:gradle:9.2.1") + classpath("com.diffplug.spotless:spotless-plugin-gradle:8.1.0") } } @@ -32,7 +32,23 @@ def isNewArchitectureEnabled() { } apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' + + +def shouldEnableAgpFallback() { + def agpMajorVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger() + if (agpMajorVersion <= 8) { + return true + } + + def propertyVal = providers.gradleProperty("android.builtInKotlin").orNull + def isBuiltInKotlinEnabled = propertyVal != null ? propertyVal.toBoolean() : true + + return !isBuiltInKotlinEnabled +} + +if (shouldEnableAgpFallback()) { + apply plugin: 'kotlin-android' +} if (isNewArchitectureEnabled()) { apply plugin: "com.facebook.react" @@ -82,17 +98,11 @@ android { exclude "**/libreact_render*.so" } sourceSets.main { - java { - if (isNewArchitectureEnabled()) { - srcDirs += [ - "src/fabric/java", - "${project.buildDir}/generated/source/codegen/java" - ] - } else { - srcDirs += [ - "src/paper/java" - ] - } + if (isNewArchitectureEnabled()) { + java.directories.add("${project.buildDir}/generated/source/codegen/java") // contains only java files + kotlin.directories.add("src/fabric/java") // contains only kotlin files + } else { + kotlin.directories.add("src/paper/java") // contains both java and kotlin files } } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index d11cdd90..c61a118f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt b/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt index b60ba5b2..4cb8a235 100644 --- a/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +++ b/android/src/fabric/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt @@ -8,7 +8,7 @@ internal class InsetsChangeEvent( surfaceId: Int, viewTag: Int, private val mInsets: EdgeInsets, - private val mFrame: Rect + private val mFrame: Rect, ) : Event(surfaceId, viewTag) { override fun getEventName() = EVENT_NAME diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt index 10a8c2c9..29c46222 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaContextPackage.kt @@ -30,7 +30,8 @@ class SafeAreaContextPackage : BaseReactPackage() { true, reactModule.needsEagerInit, reactModule.isCxxModule, - BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, + ) } return ReactModuleInfoProvider { reactModuleInfoMap } } diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt index de6f6854..42de8375 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaProviderManager.kt @@ -21,7 +21,8 @@ class SafeAreaProviderManager : override fun getExportedCustomDirectEventTypeConstants() = mutableMapOf( - InsetsChangeEvent.EVENT_NAME to mutableMapOf("registrationName" to "onInsetsChange")) + InsetsChangeEvent.EVENT_NAME to mutableMapOf("registrationName" to "onInsetsChange") + ) override fun addEventEmitters(reactContext: ThemedReactContext, view: SafeAreaProvider) { super.addEventEmitters(reactContext, view) diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt index 1fef8dcd..9dd9eeac 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaUtils.kt @@ -16,13 +16,14 @@ private fun getRootWindowInsetsCompatR(rootView: View): EdgeInsets? { WindowInsets.Type.statusBars() or WindowInsets.Type.displayCutout() or WindowInsets.Type.navigationBars() or - WindowInsets.Type.captionBar()) - ?: return null + WindowInsets.Type.captionBar() + ) ?: return null return EdgeInsets( top = insets.top.toFloat(), right = insets.right.toFloat(), bottom = insets.bottom.toFloat(), - left = insets.left.toFloat()) + left = insets.left.toFloat(), + ) } @RequiresApi(Build.VERSION_CODES.M) @@ -38,7 +39,8 @@ private fun getRootWindowInsetsCompatM(rootView: View): EdgeInsets? { // never get the keyboard offset while still working with devices that // hide the navigation bar. bottom = min(insets.systemWindowInsetBottom, insets.stableInsetBottom).toFloat(), - left = insets.systemWindowInsetLeft.toFloat()) + left = insets.systemWindowInsetLeft.toFloat(), + ) } private fun getRootWindowInsetsCompatBase(rootView: View): EdgeInsets? { @@ -48,7 +50,8 @@ private fun getRootWindowInsetsCompatBase(rootView: View): EdgeInsets? { top = visibleRect.top.toFloat(), right = (rootView.width - visibleRect.right).toFloat(), bottom = (rootView.height - visibleRect.bottom).toFloat(), - left = visibleRect.left.toFloat()) + left = visibleRect.left.toFloat(), + ) } private fun getRootWindowInsetsCompat(rootView: View): EdgeInsets? { @@ -76,7 +79,8 @@ fun getSafeAreaInsets(view: View): EdgeInsets? { top = max(windowInsets.top - visibleRect.top, 0f), right = max(min(visibleRect.left + view.width - windowWidth, 0f) + windowInsets.right, 0f), bottom = max(min(visibleRect.top + view.height - windowHeight, 0f) + windowInsets.bottom, 0f), - left = max(windowInsets.left - visibleRect.left, 0f)) + left = max(windowInsets.left - visibleRect.left, 0f), + ) } fun getFrame(rootView: ViewGroup, view: View): Rect? { @@ -98,5 +102,6 @@ fun getFrame(rootView: ViewGroup, view: View): Rect? { x = offset.left.toFloat(), y = offset.top.toFloat(), width = view.width.toFloat(), - height = view.height.toFloat()) + height = view.height.toFloat(), + ) } diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt index 9c798c64..cc7688ba 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaView.kt @@ -33,7 +33,8 @@ class SafeAreaView(context: Context?) : SafeAreaViewEdgeModes.ADDITIVE, SafeAreaViewEdgeModes.ADDITIVE, SafeAreaViewEdgeModes.ADDITIVE, - SafeAreaViewEdgeModes.ADDITIVE) + SafeAreaViewEdgeModes.ADDITIVE, + ) val stateWrapper = getStateWrapper() if (stateWrapper != null) { val map = Arguments.createMap() diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt index d7b64bff..f6a35536 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewEdges.kt @@ -3,14 +3,14 @@ package com.th3rdwave.safeareacontext enum class SafeAreaViewEdgeModes { OFF, ADDITIVE, - MAXIMUM + MAXIMUM, } data class SafeAreaViewEdges( val top: SafeAreaViewEdgeModes, val right: SafeAreaViewEdgeModes, val bottom: SafeAreaViewEdgeModes, - val left: SafeAreaViewEdgeModes + val left: SafeAreaViewEdgeModes, ) class Safe diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt index 373c9ddf..c9f6f6c9 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewManager.kt @@ -36,7 +36,8 @@ class SafeAreaViewManager : ReactViewManager() { if (propList != null) { view.setEdges( SafeAreaViewEdges( - top = propList.getString("top")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) } + top = + propList.getString("top")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) } ?: SafeAreaViewEdgeModes.OFF, right = propList.getString("right")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) } @@ -44,18 +45,19 @@ class SafeAreaViewManager : ReactViewManager() { bottom = propList.getString("bottom")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) - } - ?: SafeAreaViewEdgeModes.OFF, + } ?: SafeAreaViewEdgeModes.OFF, left = propList.getString("left")?.let { SafeAreaViewEdgeModes.valueOf(it.uppercase()) } - ?: SafeAreaViewEdgeModes.OFF)) + ?: SafeAreaViewEdgeModes.OFF, + ) + ) } } override fun updateState( view: ReactViewGroup, props: ReactStylesDiffMap?, - stateWrapper: StateWrapper? + stateWrapper: StateWrapper?, ): Any? { (view as SafeAreaView).setStateWrapper(stateWrapper) return null diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt index 9af9a712..06fcc983 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewMode.kt @@ -2,5 +2,5 @@ package com.th3rdwave.safeareacontext enum class SafeAreaViewMode { PADDING, - MARGIN + MARGIN, } diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt index 939950ab..7f1d5ea9 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SafeAreaViewShadowNode.kt @@ -81,7 +81,7 @@ class SafeAreaViewShadowNode : LayoutShadowNode() { private fun getEdgeValue( edgeMode: SafeAreaViewEdgeModes, insetValue: Float, - edgeValue: Float + edgeValue: Float, ): Float { if (edgeMode == SafeAreaViewEdgeModes.OFF) { return edgeValue @@ -139,7 +139,9 @@ class SafeAreaViewShadowNode : LayoutShadowNode() { ViewProps.PADDING_TOP, ViewProps.PADDING_BOTTOM, ViewProps.PADDING_LEFT, - ViewProps.PADDING_RIGHT]) + ViewProps.PADDING_RIGHT, + ] + ) override fun setPaddings(index: Int, padding: Dynamic) { val spacingType = ViewProps.PADDING_MARGIN_SPACING_TYPES[index] mPaddings[spacingType] = @@ -159,7 +161,9 @@ class SafeAreaViewShadowNode : LayoutShadowNode() { ViewProps.MARGIN_TOP, ViewProps.MARGIN_BOTTOM, ViewProps.MARGIN_LEFT, - ViewProps.MARGIN_RIGHT]) + ViewProps.MARGIN_RIGHT, + ] + ) override fun setMargins(index: Int, margin: Dynamic) { val spacingType = ViewProps.PADDING_MARGIN_SPACING_TYPES[index] mMargins[spacingType] = diff --git a/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt b/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt index 2c98dd3c..c7654cb2 100644 --- a/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt +++ b/android/src/main/java/com/th3rdwave/safeareacontext/SerializationUtils.kt @@ -18,7 +18,8 @@ fun edgeInsetsToJavaMap(insets: EdgeInsets): Map { "top" to PixelUtil.toDIPFromPixel(insets.top), "right" to PixelUtil.toDIPFromPixel(insets.right), "bottom" to PixelUtil.toDIPFromPixel(insets.bottom), - "left" to PixelUtil.toDIPFromPixel(insets.left)) + "left" to PixelUtil.toDIPFromPixel(insets.left), + ) } fun rectToJsMap(rect: Rect): WritableMap { @@ -35,5 +36,6 @@ fun rectToJavaMap(rect: Rect): Map { "x" to PixelUtil.toDIPFromPixel(rect.x), "y" to PixelUtil.toDIPFromPixel(rect.y), "width" to PixelUtil.toDIPFromPixel(rect.width), - "height" to PixelUtil.toDIPFromPixel(rect.height)) + "height" to PixelUtil.toDIPFromPixel(rect.height), + ) } diff --git a/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt b/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt index ac3b588d..252c90cd 100644 --- a/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt +++ b/android/src/paper/java/com/th3rdwave/safeareacontext/InsetsChangeEvent.kt @@ -10,8 +10,8 @@ internal class InsetsChangeEvent( @Suppress("UNUSED_PARAMETER") surfaceId: Int, viewTag: Int, private val mInsets: EdgeInsets, - private val mFrame: Rect -// New ctor is only available in RN 0.65. + private val mFrame: Rect, + // New ctor is only available in RN 0.65. ) : Event(viewTag) { override fun getEventName() = EVENT_NAME diff --git a/docs/docs/getting-started.mdx b/docs/docs/getting-started.mdx index 11e4d32d..a23d6c94 100644 --- a/docs/docs/getting-started.mdx +++ b/docs/docs/getting-started.mdx @@ -26,7 +26,7 @@ import TabItem from '@theme/TabItem'; | react-native-safe-area-context version | react-native version | | -------------------------------------- | -------------------- | -| 5.x | >= 0.74 | +| 5.x | >= 0.75 | | 4.x | 0.64 - 0.74 | ## New architecture support diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 419df942..63bc9541 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -52,3 +52,8 @@ bridgelessEnabled=true # Version of Kotlin to build against. #KOTLIN_VERSION=1.8.22 + +# Opt out of built-in kotlin and new DSL behavior that ships with AGP 9. +# Starting from AGP 10.x these opt outs will be removed. +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file