diff --git a/.github/workflows/compilation-check.yml b/.github/workflows/compilation-check.yml index f1f16e6..e56bbd4 100644 --- a/.github/workflows/compilation-check.yml +++ b/.github/workflows/compilation-check.yml @@ -15,7 +15,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 11 + java-version: 17 - name: Build and test run: ./gradlew build publishToMavenLocal syncMultiPlatformLibraryDebugFrameworkIosX64 - name: Install pods diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 49c54c8..1e6567f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -24,7 +24,7 @@ jobs: - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 11 + java-version: 17 - name: Publish run: ./gradlew publish diff --git a/gradle.properties b/gradle.properties index dac9384..5f41d01 100755 --- a/gradle.properties +++ b/gradle.properties @@ -18,4 +18,4 @@ moko.publish.description=Media selection & presenting for mobile (android & ios) moko.publish.repo.org=icerockdev moko.publish.repo.name=moko-media moko.publish.license=Apache-2.0 -moko.publish.developers=alex009|Aleksey Mikhailov|Aleksey.Mikhailov@icerockdev.com,Tetraquark|Vladislav Areshkin|vareshkin@icerockdev.com,RezMike|Mikhail Reznichenko|mreznichenko@icerockdev.com \ No newline at end of file +moko.publish.developers=alex009|Aleksey Mikhailov|Aleksey.Mikhailov@icerockdev.com,Tetraquark|Vladislav Areshkin|vareshkin@icerockdev.com,RezMike|Mikhail Reznichenko|mreznichenko@icerockdev.com diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 752c5ac..10cce68 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlinVersion = "1.8.10" +kotlinVersion = "1.9.10" androidAppCompatVersion = "1.6.1" materialDesignVersion = "1.8.0" androidLifecycleVersion = "2.3.1" @@ -10,7 +10,7 @@ mokoMvvmVersion = "0.16.0" mokoPermissionsVersion = "0.15.0" mokoTestVersion = "0.6.1" mokoMediaVersion = "0.11.0" -composeJetBrainsVersion = "1.3.1" +composeJetBrainsVersion = "1.7.1" [libraries] appCompat = { module = "androidx.appcompat:appcompat", version.ref = "androidAppCompatVersion" } @@ -32,7 +32,7 @@ mokoPermissionsTest = { module = "dev.icerock.moko:permissions-test", version.re kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlinVersion" } androidGradlePlugin = { module = "com.android.tools.build:gradle", version = "7.4.2" } -mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.2.0" } +mokoGradlePlugin = { module = "dev.icerock.moko:moko-gradle-plugin", version = "0.4.2" } mobileMultiplatformGradlePlugin = { module = "dev.icerock:mobile-multiplatform", version = "0.14.2" } composeJetBrainsGradlePlugin = { module = "org.jetbrains.compose:compose-gradle-plugin", version.ref = "composeJetBrainsVersion" } detektGradlePlugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version = "1.22.0" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 774fae8..e411586 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/media-test/build.gradle.kts b/media-test/build.gradle.kts index 108343d..1a58a3d 100644 --- a/media-test/build.gradle.kts +++ b/media-test/build.gradle.kts @@ -9,6 +9,10 @@ plugins { id("dev.icerock.moko.gradle.detekt") } +android { + namespace = "dev.icerock.moko.media.test" +} + dependencies { commonMainApi(projects.media) diff --git a/media-test/src/androidMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt b/media-test/src/androidMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt similarity index 100% rename from media-test/src/androidMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt rename to media-test/src/androidMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt diff --git a/media-test/src/commonMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt b/media-test/src/commonMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt similarity index 100% rename from media-test/src/commonMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt rename to media-test/src/commonMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt diff --git a/media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt b/media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt similarity index 84% rename from media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt rename to media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt index f70fae8..751995a 100644 --- a/media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/createBitmapMock.kt +++ b/media-test/src/iosMain/kotlin/dev/icerock/moko/media/test/CreateBitmapMock.kt @@ -5,10 +5,12 @@ package dev.icerock.moko.media.test import dev.icerock.moko.media.Bitmap +import kotlinx.cinterop.ExperimentalForeignApi import platform.CoreGraphics.CGRectMake import platform.CoreImage.CIImage import platform.UIKit.UIImage +@OptIn(ExperimentalForeignApi::class) actual fun createBitmapMock(): Bitmap { val image = CIImage.clearImage.imageByCroppingToRect(CGRectMake(0.0, 0.0, 1.0, 1.0)) return Bitmap(UIImage(image)) diff --git a/media/build.gradle.kts b/media/build.gradle.kts index c8c5b97..9669164 100644 --- a/media/build.gradle.kts +++ b/media/build.gradle.kts @@ -9,6 +9,10 @@ plugins { id("dev.icerock.moko.gradle.detekt") } +android { + namespace = "dev.icerock.moko.media" +} + dependencies { commonMainImplementation(libs.coroutines) commonMainApi(libs.mokoPermissions) diff --git a/media/src/androidMain/kotlin/dev/icerock/moko/media/BitmapUtils.kt b/media/src/androidMain/kotlin/dev/icerock/moko/media/BitmapUtils.kt index b02cfe2..68f7b9c 100644 --- a/media/src/androidMain/kotlin/dev/icerock/moko/media/BitmapUtils.kt +++ b/media/src/androidMain/kotlin/dev/icerock/moko/media/BitmapUtils.kt @@ -40,14 +40,16 @@ object BitmapUtils { fun getNormalizedBitmap( bitmapStream: InputStream, orientation: Int, - sampleSize: Int? = null + sampleSize: Int? = null, ): Bitmap { val bitmapOptions = if (sampleSize != null) { BitmapFactory.Options().apply { inJustDecodeBounds = false inSampleSize = sampleSize } - } else null + } else { + null + } val bitmap = BitmapFactory.decodeStream(bitmapStream, null, bitmapOptions) ?: throw IOException("Can't decode bitmap stream") @@ -64,10 +66,12 @@ object BitmapUtils { matrix.setRotate(90f) matrix.postScale(-1f, 1f) } + ExifInterface.ORIENTATION_TRANSVERSE -> { matrix.setRotate(-90f) matrix.postScale(-1f, 1f) } + else -> return bitmap } val result = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) @@ -75,17 +79,6 @@ object BitmapUtils { return result } - @Suppress("ForbiddenComment") - // TODO: unused - fun cloneRotated(bitmap: Bitmap, angle: Int): Bitmap { - if (angle != 0) { - val matrix = Matrix() - matrix.postRotate(angle.toFloat()) - return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true) - } - return bitmap - } - fun getResizedBitmap(bitmap: Bitmap, maxSize: Int = DEFAULT_MAX_SIZE): Bitmap { var width = bitmap.width var height = bitmap.height @@ -102,7 +95,7 @@ object BitmapUtils { } fun getBitmapOptionsFromStream( - inputStream: InputStream + inputStream: InputStream, ): BitmapFactory.Options { return BitmapFactory.Options().apply { inJustDecodeBounds = true @@ -110,31 +103,16 @@ object BitmapUtils { } } - @Suppress("ForbiddenComment") - // TODO: unused - fun getBitmapForStream( - inputStream: InputStream, - sampleSize: Int - ): Bitmap? { - val bitmapOptions = BitmapFactory.Options().apply { - inJustDecodeBounds = false - inSampleSize = sampleSize - } - - return BitmapFactory.decodeStream(inputStream, null, bitmapOptions) - } - fun calculateInSampleSize( options: BitmapFactory.Options, maxWidth: Int, - maxHeight: Int + maxHeight: Int, ): Int { val height: Int = options.outHeight val width: Int = options.outWidth var inSampleSize = 1 if (height > maxHeight || width > maxWidth) { - val halfHeight: Int = height / 2 val halfWidth: Int = width / 2 diff --git a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/FilePickerFragment.kt b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/FilePickerFragment.kt index 0403b0b..e4d67c5 100644 --- a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/FilePickerFragment.kt +++ b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/FilePickerFragment.kt @@ -36,6 +36,7 @@ class FilePickerFragment : Fragment() { .start() } + @Suppress("UnreachableCode") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) diff --git a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/ImagePickerFragment.kt b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/ImagePickerFragment.kt index eaf55cd..82b152e 100644 --- a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/ImagePickerFragment.kt +++ b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/ImagePickerFragment.kt @@ -6,6 +6,7 @@ package dev.icerock.moko.media.picker import android.app.Activity import android.content.Intent +import android.graphics.Bitmap import android.net.Uri import android.os.Bundle import android.os.Environment @@ -46,7 +47,7 @@ class ImagePickerFragment : Fragment() { photoFilePath = savedInstanceState?.getString(PHOTO_FILE_PATH_KEY) } - fun pickGalleryImage(callback: (Result) -> Unit) { + fun pickGalleryImage(callback: (Result) -> Unit) { val requestCode = codeCallbackMap.keys.sorted().lastOrNull() ?: 0 codeCallbackMap[requestCode] = @@ -61,7 +62,7 @@ class ImagePickerFragment : Fragment() { startActivityForResult(intent, requestCode) } - fun pickCameraImage(callback: (Result) -> Unit) { + fun pickCameraImage(callback: (Result) -> Unit) { val requestCode = codeCallbackMap.keys.sorted().lastOrNull() ?: 0 val outputUri = createPhotoUri() @@ -92,7 +93,9 @@ class ImagePickerFragment : Fragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - val callbackData = codeCallbackMap[requestCode] ?: return + val callbackData: CallbackData? = codeCallbackMap[requestCode] + if (callbackData == null) return + codeCallbackMap.remove(requestCode) val callback = callbackData.callback @@ -111,6 +114,7 @@ class ImagePickerFragment : Fragment() { callback.invoke(Result.failure(IllegalArgumentException(data?.toString()))) } } + is CallbackData.Camera -> { processResult(callback, callbackData.outputUri) } @@ -119,7 +123,7 @@ class ImagePickerFragment : Fragment() { @Suppress("ReturnCount") private fun processResult( - callback: (Result) -> Unit, + callback: (Result) -> Unit, uri: Uri ) { val contentResolver = requireContext().contentResolver @@ -151,12 +155,12 @@ class ImagePickerFragment : Fragment() { callback.invoke(Result.success(bitmap)) } - sealed class CallbackData(val callback: (Result) -> Unit) { - class Gallery(callback: (Result) -> Unit) : + sealed class CallbackData(val callback: (Result) -> Unit) { + class Gallery(callback: (Result) -> Unit) : CallbackData(callback) class Camera( - callback: (Result) -> Unit, + callback: (Result) -> Unit, val outputUri: Uri ) : CallbackData(callback) } diff --git a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerControllerImpl.kt b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerControllerImpl.kt index 8eda81e..b9b0ae9 100755 --- a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerControllerImpl.kt +++ b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerControllerImpl.kt @@ -132,7 +132,7 @@ internal class MediaPickerControllerImpl( private fun MediaSource.requiredPermissions(): List { return when (this) { - MediaSource.GALLERY -> listOf(Permission.GALLERY) + MediaSource.GALLERY -> listOf() MediaSource.CAMERA -> listOf(Permission.CAMERA) } } diff --git a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerFragment.kt b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerFragment.kt index 46d113a..a4d42fd 100644 --- a/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerFragment.kt +++ b/media/src/androidMain/kotlin/dev/icerock/moko/media/picker/MediaPickerFragment.kt @@ -48,7 +48,9 @@ class MediaPickerFragment : Fragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - val callbackData = codeCallbackMap[requestCode] ?: return + val callbackData: CallbackData? = codeCallbackMap[requestCode] + if (callbackData == null) return + codeCallbackMap.remove(requestCode) val callback = callbackData.callback @@ -81,7 +83,7 @@ class MediaPickerFragment : Fragment() { return } - val result = kotlin.runCatching { + val result = runCatching { MediaFactory.create(context, intentData) } callback.invoke(result) diff --git a/media/src/iosMain/kotlin/dev/icerock/moko/media/Bitmap.kt b/media/src/iosMain/kotlin/dev/icerock/moko/media/Bitmap.kt index e575ae4..f68d981 100755 --- a/media/src/iosMain/kotlin/dev/icerock/moko/media/Bitmap.kt +++ b/media/src/iosMain/kotlin/dev/icerock/moko/media/Bitmap.kt @@ -6,6 +6,7 @@ package dev.icerock.moko.media import kotlinx.cinterop.ByteVar import kotlinx.cinterop.CPointer +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.get import kotlinx.cinterop.reinterpret import kotlinx.cinterop.useContents @@ -18,6 +19,7 @@ import platform.UIKit.UIGraphicsGetImageFromCurrentImageContext import platform.UIKit.UIImage import platform.UIKit.UIImageJPEGRepresentation +@OptIn(ExperimentalForeignApi::class) actual class Bitmap(val image: UIImage) { actual fun toByteArray(): ByteArray { @@ -34,7 +36,7 @@ actual class Bitmap(val image: UIImage) { val imageData = UIImageJPEGRepresentation(image, COMPRESSION_QUALITY) ?: throw IllegalArgumentException("image data is null") - return imageData.base64EncodedStringWithOptions(0) + return imageData.base64EncodedStringWithOptions(0u) } actual fun toBase64WithCompress(maxSize: Int): String { @@ -49,12 +51,12 @@ actual class Bitmap(val image: UIImage) { UIGraphicsBeginImageContextWithOptions(CGSizeMake(newWidth, newHeight), false, 0.0) image.drawInRect(CGRectMake(0.0, 0.0, newWidth, newHeight)) val newImage = UIGraphicsGetImageFromCurrentImageContext() - UIGraphicsEndImageContext(); + UIGraphicsEndImageContext() val imageData = UIImageJPEGRepresentation(newImage!!, COMPRESSION_QUALITY) ?: throw IllegalArgumentException("image data is null") - return imageData.base64EncodedStringWithOptions(0) + return imageData.base64EncodedStringWithOptions(0u) } private companion object { diff --git a/media/src/iosMain/kotlin/dev/icerock/moko/media/FileMediaExt.kt b/media/src/iosMain/kotlin/dev/icerock/moko/media/FileMediaExt.kt index 0df3f7c..4a0d58a 100644 --- a/media/src/iosMain/kotlin/dev/icerock/moko/media/FileMediaExt.kt +++ b/media/src/iosMain/kotlin/dev/icerock/moko/media/FileMediaExt.kt @@ -6,6 +6,7 @@ package dev.icerock.moko.media import kotlinx.cinterop.ByteVar import kotlinx.cinterop.CPointer +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.get import kotlinx.cinterop.reinterpret import platform.Foundation.NSData @@ -18,6 +19,7 @@ fun FileMedia.toNSData(): NSData { return NSData.dataWithContentsOfURL(url) ?: throw IllegalArgumentException("invalid file data") } +@OptIn(ExperimentalForeignApi::class) actual fun FileMedia.toByteArray(): ByteArray { val data = toNSData() val bytes = data.bytes ?: throw IllegalArgumentException("file bytes is null") diff --git a/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ImagePickerDelegateToContinuation.kt b/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ImagePickerDelegateToContinuation.kt index e3ee900..67b7915 100644 --- a/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ImagePickerDelegateToContinuation.kt +++ b/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ImagePickerDelegateToContinuation.kt @@ -8,6 +8,7 @@ import dev.icerock.moko.media.Bitmap import dev.icerock.moko.media.Media import dev.icerock.moko.media.MediaType import dev.icerock.moko.media.picker.ios.MediaPickerController +import kotlinx.cinterop.ExperimentalForeignApi import platform.AVFoundation.AVAsset import platform.AVFoundation.AVAssetImageGenerator import platform.AVFoundation.AVURLAsset @@ -26,6 +27,7 @@ import platform.darwin.NSObject import kotlin.coroutines.Continuation import kotlin.random.Random +@OptIn(ExperimentalForeignApi::class) internal class ImagePickerDelegateToContinuation constructor( private val continuation: Continuation ) : NSObject(), UINavigationControllerDelegateProtocol, UIImagePickerControllerDelegateProtocol { diff --git a/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ios/MediaPickerController.kt b/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ios/MediaPickerController.kt index a739899..ee50bb6 100644 --- a/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ios/MediaPickerController.kt +++ b/media/src/iosMain/kotlin/dev/icerock/moko/media/picker/ios/MediaPickerController.kt @@ -15,6 +15,8 @@ import dev.icerock.moko.media.picker.ImagePickerDelegateToContinuation import dev.icerock.moko.media.picker.MediaSource import dev.icerock.moko.permissions.Permission import dev.icerock.moko.permissions.PermissionsController +import kotlinx.cinterop.ExperimentalForeignApi +import platform.CoreFoundation.CFTypeRef import platform.CoreServices.kUTTypeData import platform.CoreServices.kUTTypeImage import platform.CoreServices.kUTTypeMovie @@ -27,8 +29,10 @@ import platform.UIKit.UIImagePickerControllerSourceType import platform.UIKit.UIViewController import platform.UIKit.presentationController import kotlin.coroutines.suspendCoroutine +import kotlin.experimental.ExperimentalNativeApi import kotlin.native.ref.WeakReference +@OptIn(ExperimentalNativeApi::class) class MediaPickerController( override val permissionsController: PermissionsController ) : MediaPickerControllerProtocol { @@ -155,10 +159,11 @@ class MediaPickerController( return media } + @OptIn(ExperimentalForeignApi::class) internal companion object { - val kVideoType = CFBridgingRelease(kUTTypeVideo) as String - val kMovieType = CFBridgingRelease(kUTTypeMovie) as String - val kImageType = CFBridgingRelease(kUTTypeImage) as String - val kStandardFileTypesId = CFBridgingRelease(kUTTypeData) as String + val kVideoType = CFBridgingRelease(kUTTypeVideo as CFTypeRef?) as String + val kMovieType = CFBridgingRelease(kUTTypeMovie as CFTypeRef?) as String + val kImageType = CFBridgingRelease(kUTTypeImage as CFTypeRef?) as String + val kStandardFileTypesId = CFBridgingRelease(kUTTypeData as CFTypeRef?) as String } } diff --git a/media/src/iosMain/kotlin/dev/icerock/moko/media/player/MediaPlayerController.kt b/media/src/iosMain/kotlin/dev/icerock/moko/media/player/MediaPlayerController.kt index 817cfc3..1f967a3 100755 --- a/media/src/iosMain/kotlin/dev/icerock/moko/media/player/MediaPlayerController.kt +++ b/media/src/iosMain/kotlin/dev/icerock/moko/media/player/MediaPlayerController.kt @@ -4,6 +4,7 @@ package dev.icerock.moko.media.player +import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.cValue import platform.AVFoundation.AVPlayer import platform.AVFoundation.AVPlayerItemDidPlayToEndTimeNotification @@ -17,8 +18,10 @@ import platform.Foundation.NSNotificationCenter import platform.Foundation.NSOperationQueue import platform.Foundation.NSURL import platform.darwin.NSObjectProtocol +import kotlin.experimental.ExperimentalNativeApi import kotlin.native.ref.WeakReference +@OptIn(ExperimentalNativeApi::class) actual class MediaPlayerController { private var player: AVPlayer? = null @@ -72,12 +75,15 @@ actual class MediaPlayerController { player?.pause() } + @OptIn(ExperimentalForeignApi::class) actual fun stop() { player?.run { pause() - seekToTime(time = cValue { - value = 0 - }) + seekToTime( + time = cValue { + value = 0 + } + ) } } diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index c0a1a93..b2d810c 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { } android { + namespace = "com.icerockdev" buildFeatures.viewBinding = true defaultConfig { diff --git a/sample/android-app/src/main/AndroidManifest.xml b/sample/android-app/src/main/AndroidManifest.xml index d5d4985..4cc980a 100755 --- a/sample/android-app/src/main/AndroidManifest.xml +++ b/sample/android-app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" package="com.icerockdev"> + diff --git a/sample/ios-app/Podfile b/sample/ios-app/Podfile index 0aed8c9..cc40912 100644 --- a/sample/ios-app/Podfile +++ b/sample/ios-app/Podfile @@ -4,18 +4,12 @@ source 'https://cdn.cocoapods.org/' inhibit_all_warnings! use_frameworks! -platform :ios, '11.0' +platform :ios, '12.0' + # workaround for https://github.com/CocoaPods/CocoaPods/issues/8073 # need for correct invalidate of cache MultiPlatformLibrary.framework install! 'cocoapods', :disable_input_output_paths => true -pre_install do |installer| - puts "prebuild kotlin frameworks to correct integration by CocoaPods..." - puts "prebuild mpp-library..." - `cd .. && ./gradlew :sample:mpp-library:syncMultiPlatformLibraryDebugFrameworkIosX64` - puts "prebuild completed" -end - target 'TestProj' do # MultiPlatformLibrary # для корректной установки фреймворка нужно сначала скомпилировать котлин библиотеку - compile-kotlin-framework.sh (в корневой директории репозитория) diff --git a/sample/ios-app/Podfile.lock b/sample/ios-app/Podfile.lock index 674fac5..3b4e542 100644 --- a/sample/ios-app/Podfile.lock +++ b/sample/ios-app/Podfile.lock @@ -9,8 +9,8 @@ EXTERNAL SOURCES: :path: "../mpp-library" SPEC CHECKSUMS: - MultiPlatformLibrary: 176fb8ade516666cd47e93de1b71ba0441a541bb + MultiPlatformLibrary: e90154651f2068415822dc37193df246c92e7b2a -PODFILE CHECKSUM: 761f8eefdc76dfa723d36299aede21659ba80310 +PODFILE CHECKSUM: 3489a19ac13b026e40a17088bf5fc0f330626fb3 -COCOAPODS: 1.11.3 +COCOAPODS: 1.15.2 diff --git a/sample/mpp-library/MultiPlatformLibrary.podspec b/sample/mpp-library/MultiPlatformLibrary.podspec index f3870e5..9367fcb 100644 --- a/sample/mpp-library/MultiPlatformLibrary.podspec +++ b/sample/mpp-library/MultiPlatformLibrary.podspec @@ -11,12 +11,14 @@ Pod::Spec.new do |spec| spec.libraries = "c++" spec.module_name = "#{spec.name}_umbrella" + spec.ios.deployment_target = '12.0' + spec.osx.deployment_target = '10.6' + spec.pod_target_xcconfig = { - 'MPP_LIBRARY_NAME' => 'MultiPlatformLibrary', - 'GRADLE_TASK[sdk=iphonesimulator*][config=*ebug]' => 'syncMultiPlatformLibraryDebugFrameworkIosX64', - 'GRADLE_TASK[sdk=iphonesimulator*][config=*elease]' => 'syncMultiPlatformLibraryReleaseFrameworkIosX64', - 'GRADLE_TASK[sdk=iphoneos*][config=*ebug]' => 'syncMultiPlatformLibraryDebugFrameworkIosArm64', - 'GRADLE_TASK[sdk=iphoneos*][config=*elease]' => 'syncMultiPlatformLibraryReleaseFrameworkIosArm64' + 'KOTLIN_FRAMEWORK_BUILD_TYPE[config=*ebug]' => 'debug', + 'KOTLIN_FRAMEWORK_BUILD_TYPE[config=*elease]' => 'release', + 'CURENT_SDK[sdk=iphoneos*]' => 'iphoneos', + 'CURENT_SDK[sdk=iphonesimulator*]' => 'iphonesimulator', } spec.script_phases = [ @@ -24,15 +26,34 @@ Pod::Spec.new do |spec| :name => 'Compile Kotlin/Native', :execution_position => :before_compile, :shell_path => '/bin/sh', - #:output_files => ['$TARGET_BUILD_DIR/$PRODUCT_NAME.framework/$PRODUCT_NAME'], :script => <<-SCRIPT -MPP_PROJECT_ROOT="$SRCROOT/../../mpp-library" +if [ "$KOTLIN_FRAMEWORK_BUILD_TYPE" == "debug" ]; then + CONFIG="Debug" +else + CONFIG="Release" +fi -MPP_OUTPUT_DIR="$MPP_PROJECT_ROOT/build/cocoapods/framework" -MPP_OUTPUT_NAME="$MPP_OUTPUT_DIR/#{spec.name}.framework" +if [ "$CURENT_SDK" == "iphoneos" ]; then + TARGET="Ios" + ARCH="Arm64" +elif [ "$CURENT_SDK" == "iphonesimulator" ]; then + if [ "$ARCHS" == "arm64" ]; then + TARGET="IosSimulator" + ARCH="Arm64" + else + TARGET="Ios" + ARCH="X64" + fi +else + echo "unsupported $CURENT_SDK" + exit 1 +fi + +MPP_PROJECT_ROOT="$SRCROOT/../../mpp-library" +GRADLE_TASK="syncMultiPlatformLibrary${CONFIG}Framework${TARGET}${ARCH}" "$MPP_PROJECT_ROOT/../gradlew" -p "$MPP_PROJECT_ROOT" "$GRADLE_TASK" SCRIPT } ] -end +end \ No newline at end of file diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 87ebcb8..de6c394 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -8,6 +8,10 @@ plugins { id("dev.icerock.moko.gradle.detekt") } +android { + namespace = "com.icerockdev.library" +} + dependencies { commonMainApi(libs.coroutines) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9b971e9..64f05d8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,6 @@ * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. */ -enableFeaturePreview("VERSION_CATALOGS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") dependencyResolutionManagement { @@ -11,6 +10,7 @@ dependencyResolutionManagement { google() maven { url = uri("https://jitpack.io") } + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } }