diff --git a/README.md b/README.md index 13673f82..ff05f636 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ![moko-widgets](https://user-images.githubusercontent.com/5010169/70204294-93a45900-1752-11ea-9bb6-820d514ceef9.png) -[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/moko-widgets) ](https://repo1.maven.org/maven2/dev/icerock/moko/moko-widgets) ![kotlin-version](https://kotlin-version.aws.icerock.dev/kotlin-version?group=dev.icerock.moko&name=widgets) +[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/widgets) ](https://repo1.maven.org/maven2/dev/icerock/moko/widgets/) ![kotlin-version](https://kotlin-version.aws.icerock.dev/kotlin-version?group=dev.icerock.moko&name=widgets) # Mobile Kotlin widgets This is a Kotlin MultiPlatform library that provides declarative UI and application screens management diff --git a/build.gradle.kts b/build.gradle.kts index 59654a6a..199cf76a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,13 +4,13 @@ buildscript { repositories { + gradlePluginPortal() mavenCentral() google() - gradlePluginPortal() jcenter() } dependencies { - classpath("dev.icerock.moko:resources-generator:0.16.2") + classpath("dev.icerock.moko:resources-generator:0.21.2") classpath("dev.icerock.moko.widgets:gradle-plugin") classpath(":widgets-build-logic") @@ -18,7 +18,6 @@ buildscript { } allprojects { - plugins.withId("org.gradle.maven-publish") { group = "dev.icerock.moko" version = libs.versions.mokoWidgetsVersion.get() diff --git a/gradle.properties b/gradle.properties index 7f3f000d..373bb175 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,11 @@ org.gradle.configureondemand=false org.gradle.parallel=true kotlin.code.style=official - -kotlin.native.enableDependencyPropagation=false -kotlin.mpp.enableGranularSourceSetsMetadata=true -kotlin.mpp.enableCompatibilityMetadataVariant=true +kotlin.mpp.androidSourceSetLayoutVersion=2 +kotlin.mpp.enableCInteropCommonization=true android.useAndroidX=true mobile.multiplatform.useIosShortcut=false mobile.multiplatform.iosTargetWarning=false -mobile.multiplatform.podsProject=sample/ios-app/Pods/Pods.xcodeproj \ No newline at end of file +mobile.multiplatform.podsProject=sample/ios-app/Pods/Pods.xcodeproj diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e391679..b1b30bf3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,28 +1,30 @@ [versions] -kotlinVersion = "1.5.20" -mokoWidgetsVersion = "0.1.0" -mokoResourcesVersion = "0.16.2" -appCompatVersion = "1.3.1" -fragmentVersion = "1.3.6" +kotlinVersion = "1.8.10" + +mokoWidgetsVersion = "0.2.0" +mokoResourcesVersion = "0.21.2" +mokoMvvmVersion = "0.16.0" +mokoFieldsVersion = "0.12.0" +mokoUnitsVersion = "0.8.0" +mokoMediaVersion = "0.11.0" +mokoPermissionsVersion = "0.16.0" +mokoGraphicsVersion = "0.9.0" +mokoParcelizeVersion = "0.8.0" + +appCompatVersion = "1.6.1" +fragmentVersion = "1.5.6" swipeRefreshLayoutVersion = "1.1.0" -materialVersion = "1.4.0" -constraintLayoutVersion = "2.0.4" -lifecycleVersion = "2.3.1" -recyclerViewVersion = "1.2.1" +materialVersion = "1.8.0" +constraintLayoutVersion = "2.1.4" +lifecycleVersion = "2.6.1" +recyclerViewVersion = "1.3.0" inputMaskVersion = "6.0.0" -glideVersion = "4.12.0" +glideVersion = "4.14.2" roundedImageViewVersion = "2.3.0" -playServiceAuthVersion = "19.2.0" -playServiceAuthSmsVersion = "17.5.1" -coroutinesVersion = "1.5.1-native-mt" -mokoMvvmVersion = "0.11.0" -mokoFieldsVersion = "0.8.0" -mokoUnitsVersion = "0.6.2" -mokoMediaVersion = "0.9.0" -mokoPermissionsVersion = "0.10.1" -mokoGraphicsVersion = "0.8.0" -mokoParcelizeVersion = "0.7.1" -klockVersion = "2.3.1" +playServiceAuthVersion = "20.5.0" +playServiceAuthSmsVersion = "18.0.1" +coroutinesVersion = "1.6.4" +klockVersion = "3.4.0" autoServiceVersion = "1.0-rc6" [libraries] @@ -38,17 +40,19 @@ glide = { module = "com.github.bumptech.glide:glide", version.ref = "glideVersio roundedImageView = { module = "com.makeramen:roundedimageview", version.ref = "roundedImageViewVersion" } playServiceAuth = { module = "com.google.android.gms:play-services-auth", version.ref = "playServiceAuthVersion" } playServiceAuthSms = { module = "com.google.android.gms:play-services-auth-api-phone", version.ref = "playServiceAuthSmsVersion" } + mokoResources = { module = "dev.icerock.moko:resources", version.ref = "mokoResourcesVersion" } mokoMvvmCore = { module = "dev.icerock.moko:mvvm-core", version.ref = "mokoMvvmVersion" } mokoMvvmState = { module = "dev.icerock.moko:mvvm-state", version.ref = "mokoMvvmVersion" } mokoMvvmLivedata = { module = "dev.icerock.moko:mvvm-livedata", version.ref = "mokoMvvmVersion" } mokoMvvmDataBinding = { module = "dev.icerock.moko:mvvm-databinding", version.ref = "mokoMvvmVersion" } -mokoFields = { module = "dev.icerock.moko:fields", version.ref = "mokoFieldsVersion" } +mokoFields = { module = "dev.icerock.moko:fields-livedata", version.ref = "mokoFieldsVersion" } mokoUnits = { module = "dev.icerock.moko:units", version.ref = "mokoUnitsVersion" } mokoMedia = { module = "dev.icerock.moko:media", version.ref = "mokoMediaVersion" } mokoPermissions = { module = "dev.icerock.moko:permissions", version.ref = "mokoPermissionsVersion" } mokoGraphics = { module = "dev.icerock.moko:graphics", version.ref = "mokoGraphicsVersion" } mokoParcelize = { module = "dev.icerock.moko:parcelize", version.ref = "mokoParcelizeVersion" } + coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutinesVersion" } klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klockVersion" } autoService = { module = "com.google.auto.service:auto-service", version.ref = "autoServiceVersion" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 05679dc3..774fae87 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.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradlePlugin.kt b/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradlePlugin.kt index d8bbc814..b464364e 100644 --- a/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradlePlugin.kt +++ b/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradlePlugin.kt @@ -4,23 +4,53 @@ package dev.icerock.moko.widgets +import dev.icerock.moko.widgets.gradle_plugin.BuildConfig import org.gradle.api.Project +import org.gradle.api.internal.provider.DefaultProvider +import org.gradle.api.provider.Provider import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact +import org.jetbrains.kotlin.gradle.plugin.SubpluginOption import java.io.File -open class WidgetsGeneratorGradlePlugin : org.gradle.api.Plugin { - override fun apply(project: Project) { - project.plugins.withType { - project.configure { - val path = getGenerationDir(project).path +open class WidgetsGeneratorGradlePlugin : KotlinCompilerPluginSupportPlugin { + override fun apply(target: Project) { + target.plugins.withType { + target.configure { + val path = getGenerationDir(target).path sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME).kotlin.srcDir(path) } } } + + override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider> { + return DefaultProvider { + listOf( + SubpluginOption( + key = "generationDir", + value = getGenerationDir(kotlinCompilation.target.project).path + ) + ) + } + } + + override fun getCompilerPluginId(): String = "widgets-generator" + + override fun getPluginArtifact(): SubpluginArtifact = SubpluginArtifact( + groupId = "dev.icerock.moko.widgets", + artifactId = "kotlin-plugin", + version = BuildConfig.compilerPluginVersion + ) + + override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean { + return true + } } fun getGenerationDir(project: Project): File { diff --git a/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradleSubplugin.kt b/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradleSubplugin.kt deleted file mode 100644 index 5d08d665..00000000 --- a/plugin/gradle-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorGradleSubplugin.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets - -import dev.icerock.moko.widgets.gradle_plugin.BuildConfig -import com.google.auto.service.AutoService -import org.gradle.api.Project -import org.gradle.api.tasks.compile.AbstractCompile -import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation -import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin -import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact -import org.jetbrains.kotlin.gradle.plugin.SubpluginOption - -@AutoService(KotlinGradleSubplugin::class) -class WidgetsGeneratorGradleSubplugin : KotlinGradleSubplugin { - override fun apply( - project: Project, - kotlinCompile: AbstractCompile, - javaCompile: AbstractCompile?, - variantData: Any?, - androidProjectHandler: Any?, - kotlinCompilation: KotlinCompilation? - ): List { - return listOf( - SubpluginOption("generationDir", getGenerationDir(project).path) - ) - } - - override fun isApplicable(project: Project, task: AbstractCompile): Boolean { - return project.plugins.hasPlugin(WidgetsGeneratorGradlePlugin::class.java) - } - - override fun getCompilerPluginId(): String = "widgets-generator" - - override fun getPluginArtifact(): SubpluginArtifact = SubpluginArtifact( - groupId = "dev.icerock.moko.widgets", - artifactId = "kotlin-plugin", - version = BuildConfig.compilerPluginVersion - ) - - override fun getNativeCompilerPluginArtifact(): SubpluginArtifact? = SubpluginArtifact( - groupId = "dev.icerock.moko.widgets", - artifactId = "kotlin-native-plugin", - version = BuildConfig.compilerPluginVersion - ) -} diff --git a/plugin/kotlin-common-plugin/build.gradle.kts b/plugin/kotlin-common-plugin/build.gradle.kts deleted file mode 100644 index 9b7ae0f4..00000000 --- a/plugin/kotlin-common-plugin/build.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -plugins { - id("org.jetbrains.kotlin.jvm") -} - -dependencies { - compileOnly("org.jetbrains.kotlin:kotlin-script-runtime") - compileOnly("org.jetbrains.kotlin:kotlin-reflect") - compileOnly("org.jetbrains.intellij.deps:trove4j:1.0.20181211") -} diff --git a/plugin/kotlin-native-plugin/build.gradle.kts b/plugin/kotlin-native-plugin/build.gradle.kts deleted file mode 100644 index 6a1e3133..00000000 --- a/plugin/kotlin-native-plugin/build.gradle.kts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -plugins { - id("org.jetbrains.kotlin.jvm") - id("kotlin-kapt") - id("embed-configuration-convention") - id("publication-convention") - id("detekt-convention") -} - -dependencies { - "embedImplementation"(projects.kotlinCommonPlugin) - - compileOnly("org.jetbrains.kotlin:kotlin-compiler") - - compileOnly(libs.autoService) - kapt(libs.autoService) -} - -publishing { - publications { - register("pluginMaven", MavenPublication::class) { - from(components["java"]) - } - } -} diff --git a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/GenerateSourcesExtension.kt b/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/GenerateSourcesExtension.kt deleted file mode 100644 index 9dcdb976..00000000 --- a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/GenerateSourcesExtension.kt +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets - -import com.intellij.openapi.project.Project -import com.intellij.openapi.vfs.StandardFileSystems -import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.psi.PsiManager -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtTypeReference -import org.jetbrains.kotlin.psi.KtValueArgument -import org.jetbrains.kotlin.psi.stubs.KotlinAnnotationEntryStub -import org.jetbrains.kotlin.psi.stubs.KotlinClassStub -import org.jetbrains.kotlin.psi.stubs.KotlinFileStub -import org.jetbrains.kotlin.psi.stubs.KotlinImportDirectiveStub -import org.jetbrains.kotlin.psi.stubs.KotlinModifierListStub -import org.jetbrains.kotlin.psi.stubs.KotlinParameterStub -import org.jetbrains.kotlin.psi.stubs.KotlinPlaceHolderStub -import org.jetbrains.kotlin.psi.stubs.KotlinTypeParameterStub -import org.jetbrains.kotlin.psi.stubs.KotlinValueArgumentStub -import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes -import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance -import java.io.File - -class GenerateSourcesExtension(private val messageCollector: MessageCollector) : CollectAdditionalSourcesExtension { - - inner class Generator(project: Project) : CommonGenerator() { - private val psiManager = PsiManager.getInstance(project) - private val localFileSystem = VirtualFileManager.getInstance().getFileSystem(StandardFileSystems.FILE_PROTOCOL) - - override fun getStub(file: KtFile): KotlinFileStub? { - val stubTree = file.calcStubTree() - return stubTree.root as? KotlinFileStub - } - - override fun getGeneratorInput(ktFileStub: KotlinFileStub): List { - val importList = ktFileStub.childrenStubs.firstOrNull { it.stubType == KtStubElementTypes.IMPORT_LIST } - val imports = importList?.childrenStubs - .orEmpty() - .filterIsInstance() - .mapNotNull { import -> - val str = import.getImportedFqName()?.toString() ?: return@mapNotNull null - if(import.isAllUnder()) "$str.*" - else str - } - - return ktFileStub.childrenStubs.filterIsInstance().mapNotNull { classStub -> - val modifiersList = - classStub.childrenStubs.filterIsInstance().firstOrNull() - ?: return@mapNotNull null - val annotations = modifiersList.childrenStubs.filterIsInstance() - val widgetDefAnnotation = annotations - .firstOrNull { it.getShortName() == "WidgetDef" } ?: return@mapNotNull null - - val factoryClass = widgetDefAnnotation.childrenStubs - .firstOrNull { it.stubType == KtStubElementTypes.VALUE_ARGUMENT_LIST } - ?.childrenStubs.orEmpty() - .firstIsInstance>() - .psi.text.replace("::class", "") - - val typeParams = - classStub.childrenStubs.firstOrNull { it.stubType == KtStubElementTypes.TYPE_PARAMETER_LIST } - val genericTypes = typeParams?.childrenStubs - ?.filterIsInstance() - ?.mapNotNull { it.name } - .orEmpty() - - val constructor = - classStub.childrenStubs.firstOrNull { it.stubType == KtStubElementTypes.PRIMARY_CONSTRUCTOR } - ?: return@mapNotNull null - val constructorParameters = - constructor.childrenStubs.firstOrNull { it.stubType == KtStubElementTypes.VALUE_PARAMETER_LIST } - ?: return@mapNotNull null - - val params = constructorParameters - .childrenStubs - .filterIsInstance() - .associate { parameterStub -> - val parameterName = parameterStub.name - val value = parameterStub.psi.defaultValue?.text - - val type = parameterStub.childrenStubs - .mapNotNull { it as? KotlinPlaceHolderStub } - .mapNotNull { typeReferenceStub -> - val parameterType = typeReferenceStub.psi.text - parameterType - }.first() - - parameterName!! to GeneratorInput.ArgInfo( - type = type, - defaultValue = value - ) - } - - GeneratorInput( - packageName = ktFileStub.getPackageFqName().asString(), - className = classStub.name!!, - imports = imports, - arguments = params, - factoryClass = factoryClass, - genericTypes = genericTypes - ) - } - } - - override fun getKtFileFromFile(file: File): KtFile { - val virtualFile = localFileSystem.findFileByPath(file.path)!! - return psiManager.findFile(virtualFile) as KtFile - } - - override fun log(string: String) { - messageCollector.report(CompilerMessageSeverity.INFO, string) - } - } - - override fun collectAdditionalSourcesAndUpdateConfiguration( - knownSources: Collection, - configuration: CompilerConfiguration, - project: Project - ): Collection { - val generator = Generator(project) - return generator.collectAdditionalSourcesAndUpdateConfiguration(knownSources, configuration[GenerationDir]!!) - } -} diff --git a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt b/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt deleted file mode 100644 index 3b5898bd..00000000 --- a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets - -import com.google.auto.service.AutoService -import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption -import org.jetbrains.kotlin.compiler.plugin.CliOption -import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.CompilerConfigurationKey - -object GenerationDir : CompilerConfigurationKey("generationDir") - -@AutoService(CommandLineProcessor::class) -class WidgetsGeneratorCommandLineProcessor : CommandLineProcessor { - override val pluginId = CommonCommandLineProcessor.pluginId - override val pluginOptions = listOf( - CliOption( - optionName = CommonCommandLineProcessor.generationDirOptionName, - description = "directory of generation sources", - valueDescription = "absolute path to directory" - ) - ) - - override fun processOption(option: AbstractCliOption, value: String, configuration: CompilerConfiguration) { - when (option.optionName) { - CommonCommandLineProcessor.generationDirOptionName -> configuration.put(GenerationDir, value) - } - } -} diff --git a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt b/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt deleted file mode 100644 index a3cbf0dc..00000000 --- a/plugin/kotlin-native-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets - -import com.google.auto.service.AutoService -import com.intellij.mock.MockProject -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension - -@AutoService(ComponentRegistrar::class) -open class WidgetsGeneratorComponentRegistrar : ComponentRegistrar { - - override fun registerProjectComponents( - project: MockProject, - configuration: CompilerConfiguration - ) { - val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) - - CollectAdditionalSourcesExtension.registerExtension( - project, - GenerateSourcesExtension(messageCollector) - ) - } -} diff --git a/plugin/kotlin-plugin/build.gradle.kts b/plugin/kotlin-plugin/build.gradle.kts index 44afa75f..92c97d38 100644 --- a/plugin/kotlin-plugin/build.gradle.kts +++ b/plugin/kotlin-plugin/build.gradle.kts @@ -5,16 +5,17 @@ plugins { id("org.jetbrains.kotlin.jvm") id("kotlin-kapt") - id("embed-configuration-convention") id("publication-convention") id("detekt-convention") } dependencies { - "embedImplementation"(projects.kotlinCommonPlugin) - compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable") + compileOnly("org.jetbrains.kotlin:kotlin-script-runtime") + compileOnly("org.jetbrains.kotlin:kotlin-reflect") + compileOnly("org.jetbrains.intellij.deps:trove4j:1.0.20181211") + compileOnly(libs.autoService) kapt(libs.autoService) } diff --git a/plugin/kotlin-common-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonCommandLineProcessor.kt b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonCommandLineProcessor.kt similarity index 100% rename from plugin/kotlin-common-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonCommandLineProcessor.kt rename to plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonCommandLineProcessor.kt diff --git a/plugin/kotlin-common-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonGenerator.kt b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonGenerator.kt similarity index 100% rename from plugin/kotlin-common-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonGenerator.kt rename to plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/CommonGenerator.kt diff --git a/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt index 3b5898bd..93723190 100644 --- a/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt +++ b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorCommandLineProcessor.kt @@ -8,11 +8,13 @@ import com.google.auto.service.AutoService import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor +import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey object GenerationDir : CompilerConfigurationKey("generationDir") +@OptIn(ExperimentalCompilerApi::class) @AutoService(CommandLineProcessor::class) class WidgetsGeneratorCommandLineProcessor : CommandLineProcessor { override val pluginId = CommonCommandLineProcessor.pluginId diff --git a/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt index 2627ed59..e83879fc 100644 --- a/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt +++ b/plugin/kotlin-plugin/src/main/kotlin/dev/icerock/moko/widgets/WidgetsGeneratorComponentRegistrar.kt @@ -9,9 +9,11 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.com.intellij.mock.MockProject import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension +@OptIn(ExperimentalCompilerApi::class) @AutoService(ComponentRegistrar::class) open class WidgetsGeneratorComponentRegistrar : ComponentRegistrar { diff --git a/plugin/settings.gradle.kts b/plugin/settings.gradle.kts index ec09f5a8..f237ba19 100644 --- a/plugin/settings.gradle.kts +++ b/plugin/settings.gradle.kts @@ -36,7 +36,5 @@ dependencyResolutionManagement { includeBuild("../widgets-build-logic") -include(":kotlin-common-plugin") include(":kotlin-plugin") -include(":kotlin-native-plugin") -include(":gradle-plugin") \ No newline at end of file +include(":gradle-plugin") diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts index d0a8a6b0..800550df 100644 --- a/sample/android-app/build.gradle.kts +++ b/sample/android-app/build.gradle.kts @@ -5,17 +5,16 @@ plugins { id("android-app-convention") id("detekt-convention") - id("kotlin-kapt") } android { - buildFeatures.dataBinding = true - defaultConfig { applicationId = "dev.icerock.moko.samples.widgets" versionCode = 1 versionName = "0.1.0" + + multiDexEnabled = true } compileOptions { diff --git a/sample/android-app/src/main/AndroidManifest.xml b/sample/android-app/src/main/AndroidManifest.xml index d0f554e4..eae64e18 100755 --- a/sample/android-app/src/main/AndroidManifest.xml +++ b/sample/android-app/src/main/AndroidManifest.xml @@ -3,16 +3,23 @@ xmlns:tools="http://schemas.android.com/tools" package="com.icerockdev"> + + + - + diff --git a/sample/ios-app/Podfile.lock b/sample/ios-app/Podfile.lock index 7a112d82..e6e08332 100644 --- a/sample/ios-app/Podfile.lock +++ b/sample/ios-app/Podfile.lock @@ -52,4 +52,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: dd6f9b7e6c038aff8581037bf3a09cf3c1c947f9 -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.3 diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts index 9c1380fc..9bcb6355 100644 --- a/sample/mpp-library/build.gradle.kts +++ b/sample/mpp-library/build.gradle.kts @@ -4,8 +4,6 @@ plugins { id("multiplatform-library-convention") - id("detekt-convention") - id("kotlin-kapt") id("kotlin-parcelize") id("dev.icerock.mobile.multiplatform-resources") id("dev.icerock.mobile.multiplatform.ios-framework") diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/CryptoProfileSample.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/CryptoProfileSample.kt index 0b8d45ab..be10d028 100644 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/CryptoProfileSample.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/CryptoProfileSample.kt @@ -4,9 +4,9 @@ package com.icerockdev.library.sample -import dev.icerock.moko.fields.FormField -import dev.icerock.moko.fields.liveBlock -import dev.icerock.moko.fields.validate +import dev.icerock.moko.fields.core.validate +import dev.icerock.moko.fields.livedata.FormField +import dev.icerock.moko.fields.livedata.liveBlock import dev.icerock.moko.mvvm.livedata.mergeWith import dev.icerock.moko.mvvm.viewmodel.ViewModel import dev.icerock.moko.resources.desc.StringDesc diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/McommerceProfileSample.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/McommerceProfileSample.kt index bc555569..010bf81f 100644 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/McommerceProfileSample.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/McommerceProfileSample.kt @@ -4,9 +4,9 @@ package com.icerockdev.library.sample -import dev.icerock.moko.fields.FormField -import dev.icerock.moko.fields.liveBlock -import dev.icerock.moko.fields.validate +import dev.icerock.moko.fields.core.validate +import dev.icerock.moko.fields.livedata.FormField +import dev.icerock.moko.fields.livedata.liveBlock import dev.icerock.moko.mvvm.viewmodel.ViewModel import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.resources.desc.desc diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/SocialProfileSample.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/SocialProfileSample.kt index e154fd14..7dca9e24 100644 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/SocialProfileSample.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/sample/SocialProfileSample.kt @@ -4,9 +4,9 @@ package com.icerockdev.library.sample -import dev.icerock.moko.fields.FormField -import dev.icerock.moko.fields.liveBlock -import dev.icerock.moko.fields.validate +import dev.icerock.moko.fields.core.validate +import dev.icerock.moko.fields.livedata.FormField +import dev.icerock.moko.fields.livedata.liveBlock import dev.icerock.moko.mvvm.livedata.LiveData import dev.icerock.moko.mvvm.livedata.MutableLiveData import dev.icerock.moko.mvvm.livedata.map diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/universal/LoginScreen.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/universal/LoginScreen.kt index 9a1b3c65..6e98e784 100644 --- a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/universal/LoginScreen.kt +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/universal/LoginScreen.kt @@ -4,8 +4,8 @@ package com.icerockdev.library.universal -import dev.icerock.moko.fields.FormField -import dev.icerock.moko.fields.liveBlock +import dev.icerock.moko.fields.livedata.FormField +import dev.icerock.moko.fields.livedata.liveBlock import dev.icerock.moko.mvvm.dispatcher.EventsDispatcher import dev.icerock.moko.mvvm.dispatcher.EventsDispatcherOwner import dev.icerock.moko.mvvm.viewmodel.ViewModel diff --git a/sample/mpp-library/src/commonMain/kotlin/dev/icerock/moko/widgets/sample/InputWidgetGalleryScreen.kt b/sample/mpp-library/src/commonMain/kotlin/dev/icerock/moko/widgets/sample/InputWidgetGalleryScreen.kt index 2a5d5b04..11746d20 100644 --- a/sample/mpp-library/src/commonMain/kotlin/dev/icerock/moko/widgets/sample/InputWidgetGalleryScreen.kt +++ b/sample/mpp-library/src/commonMain/kotlin/dev/icerock/moko/widgets/sample/InputWidgetGalleryScreen.kt @@ -4,8 +4,8 @@ package dev.icerock.moko.widgets.sample -import dev.icerock.moko.fields.FormField -import dev.icerock.moko.fields.liveBlock +import dev.icerock.moko.fields.livedata.FormField +import dev.icerock.moko.fields.livedata.liveBlock import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.resources.desc.desc import dev.icerock.moko.widgets.core.widget.InputWidget diff --git a/settings.gradle.kts b/settings.gradle.kts index 4587ca63..34a009b9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,7 +18,6 @@ dependencyResolutionManagement { } maven { url = uri("https://jitpack.io") } - } } diff --git a/widgets-bottomsheet/src/iosArm64Main b/widgets-bottomsheet/src/iosArm64Main deleted file mode 120000 index 46be4b86..00000000 --- a/widgets-bottomsheet/src/iosArm64Main +++ /dev/null @@ -1 +0,0 @@ -iosX64Main \ No newline at end of file diff --git a/widgets-bottomsheet/src/iosMain/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt b/widgets-bottomsheet/src/iosMain/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt index eceb4ed7..a54fc49d 100644 --- a/widgets-bottomsheet/src/iosMain/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt +++ b/widgets-bottomsheet/src/iosMain/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt @@ -4,13 +4,26 @@ package dev.icerock.moko.widgets.bottomsheet +import cocoapods.mokoWidgetsBottomSheet.BottomSheetController import dev.icerock.moko.widgets.core.View import platform.UIKit.UIViewController -internal expect class BottomSheetHolder() : SelfDismisser { +internal class BottomSheetHolder : SelfDismisser { + private val bottomSheet = BottomSheetController() + fun show( viewController: UIViewController, view: View, onDismiss: (isSelfDismissed: Boolean) -> Unit - ) + ) { + bottomSheet.showOnViewController( + vc = viewController, + withContent = view, + onDismiss = onDismiss + ) + } + + override fun dismissSelf() { + bottomSheet.dismiss() + } } diff --git a/widgets-bottomsheet/src/iosX64Main/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt b/widgets-bottomsheet/src/iosX64Main/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt deleted file mode 100644 index 83cde770..00000000 --- a/widgets-bottomsheet/src/iosX64Main/kotlin/dev/icerock/moko/widgets/bottomsheet/BottomSheetHolder.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets.bottomsheet - -import cocoapods.mokoWidgetsBottomSheet.BottomSheetController -import dev.icerock.moko.widgets.core.View -import platform.UIKit.UIViewController - -internal actual class BottomSheetHolder : SelfDismisser { - private val bottomSheet = BottomSheetController() - - actual fun show( - viewController: UIViewController, - view: View, - onDismiss: (isSelfDismissed: Boolean) -> Unit - ) { - bottomSheet.showOnViewController( - vc = viewController, - withContent = view, - onDismiss = onDismiss - ) - } - - override fun dismissSelf() { - bottomSheet.dismiss() - } -} diff --git a/widgets-build-logic/build.gradle.kts b/widgets-build-logic/build.gradle.kts index b75ef997..917d8302 100644 --- a/widgets-build-logic/build.gradle.kts +++ b/widgets-build-logic/build.gradle.kts @@ -3,15 +3,15 @@ plugins { } repositories { + gradlePluginPortal() + mavenCentral() google() - - gradlePluginPortal() } dependencies { - api("dev.icerock:mobile-multiplatform:0.12.0") - api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21") - api("com.android.tools.build:gradle:4.2.1") - api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0") + api("dev.icerock:mobile-multiplatform:0.14.2") + api("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10") + api("com.android.tools.build:gradle:7.4.2") + api("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.22.0") } diff --git a/widgets-build-logic/src/main/kotlin/android-base-convention.gradle.kts b/widgets-build-logic/src/main/kotlin/android-base-convention.gradle.kts index bfd44d37..2d37a5b3 100644 --- a/widgets-build-logic/src/main/kotlin/android-base-convention.gradle.kts +++ b/widgets-build-logic/src/main/kotlin/android-base-convention.gradle.kts @@ -5,10 +5,10 @@ import com.android.build.gradle.BaseExtension configure { - compileSdkVersion(30) + compileSdkVersion(33) defaultConfig { - minSdkVersion(21) - targetSdkVersion(30) + minSdkVersion(19) + targetSdkVersion(33) } } diff --git a/widgets-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts b/widgets-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts index f2039347..eb66b14d 100644 --- a/widgets-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts +++ b/widgets-build-logic/src/main/kotlin/multiplatform-library-convention.gradle.kts @@ -14,4 +14,17 @@ kotlin { publishLibraryVariants("release", "debug") } ios() + iosSimulatorArm64() + + sourceSets { + val iosMain by getting + val iosTest by getting + + val iosSimulatorArm64Main by getting { + dependsOn(iosMain) + } + val iosSimulatorArm64Test by getting { + dependsOn(iosTest) + } + } } diff --git a/widgets-collection/src/iosArm64Main b/widgets-collection/src/iosArm64Main deleted file mode 120000 index 46be4b86..00000000 --- a/widgets-collection/src/iosArm64Main +++ /dev/null @@ -1 +0,0 @@ -iosX64Main \ No newline at end of file diff --git a/widgets-collection/src/iosMain/kotlin/dev/icerock/moko/widgets/collection/SimpleCollectionViewFactory.kt b/widgets-collection/src/iosMain/kotlin/dev/icerock/moko/widgets/collection/SimpleCollectionViewFactory.kt index f7f60f93..ba14472d 100644 --- a/widgets-collection/src/iosMain/kotlin/dev/icerock/moko/widgets/collection/SimpleCollectionViewFactory.kt +++ b/widgets-collection/src/iosMain/kotlin/dev/icerock/moko/widgets/collection/SimpleCollectionViewFactory.kt @@ -4,6 +4,7 @@ package dev.icerock.moko.widgets.collection +import cocoapods.mokoWidgetsCollection.ALCollectionFlowLayout import dev.icerock.moko.units.createUnitCollectionViewDataSource import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory @@ -30,7 +31,9 @@ import platform.UIKit.UIEdgeInsetsZero import platform.UIKit.backgroundColor import platform.UIKit.translatesAutoresizingMaskIntoConstraints -expect fun createCollectionFlowLayout(): UICollectionViewFlowLayout +fun createCollectionFlowLayout(): UICollectionViewFlowLayout { + return ALCollectionFlowLayout() +} actual class SimpleCollectionViewFactory actual constructor( private val orientation: Orientation, diff --git a/widgets-collection/src/iosX64Main/kotlin/dev/icerock/moko/widgets/collection/createCollectionFlowLayout.kt b/widgets-collection/src/iosX64Main/kotlin/dev/icerock/moko/widgets/collection/createCollectionFlowLayout.kt deleted file mode 100644 index eabf2a62..00000000 --- a/widgets-collection/src/iosX64Main/kotlin/dev/icerock/moko/widgets/collection/createCollectionFlowLayout.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets.collection - -import cocoapods.mokoWidgetsCollection.ALCollectionFlowLayout -import platform.UIKit.UICollectionViewFlowLayout - -actual fun createCollectionFlowLayout(): UICollectionViewFlowLayout { - return ALCollectionFlowLayout() -} diff --git a/widgets-datetime-picker/src/iosArm64Main b/widgets-datetime-picker/src/iosArm64Main deleted file mode 120000 index 46be4b86..00000000 --- a/widgets-datetime-picker/src/iosArm64Main +++ /dev/null @@ -1 +0,0 @@ -iosX64Main \ No newline at end of file diff --git a/widgets-datetime-picker/src/iosX64Main/kotlin/dev/icerock/moko/widgets/datetimepicker/ShowDatePickerExt.kt b/widgets-datetime-picker/src/iosMain/kotlin/dev/icerock/moko/widgets/datetimepicker/showDatePickerDialog.kt similarity index 100% rename from widgets-datetime-picker/src/iosX64Main/kotlin/dev/icerock/moko/widgets/datetimepicker/ShowDatePickerExt.kt rename to widgets-datetime-picker/src/iosMain/kotlin/dev/icerock/moko/widgets/datetimepicker/showDatePickerDialog.kt diff --git a/widgets-datetime-picker/src/iosX64Main/kotlin/dev/icerock/moko/widgets/datetimepicker/TimePickerDialogExt.kt b/widgets-datetime-picker/src/iosMain/kotlin/dev/icerock/moko/widgets/datetimepicker/showTimePickerDialog.kt similarity index 100% rename from widgets-datetime-picker/src/iosX64Main/kotlin/dev/icerock/moko/widgets/datetimepicker/TimePickerDialogExt.kt rename to widgets-datetime-picker/src/iosMain/kotlin/dev/icerock/moko/widgets/datetimepicker/showTimePickerDialog.kt diff --git a/widgets-image-network/src/iosArm64Main b/widgets-image-network/src/iosArm64Main deleted file mode 120000 index 46be4b86..00000000 --- a/widgets-image-network/src/iosArm64Main +++ /dev/null @@ -1 +0,0 @@ -iosX64Main \ No newline at end of file diff --git a/widgets-image-network/src/iosX64Main/kotlin/dev/icerock/moko/widgets/imagenetwork/ImageNetworkExt.kt b/widgets-image-network/src/iosMain/kotlin/dev/icerock/moko/widgets/imagenetwork/ImageNetworkExt.kt similarity index 100% rename from widgets-image-network/src/iosX64Main/kotlin/dev/icerock/moko/widgets/imagenetwork/ImageNetworkExt.kt rename to widgets-image-network/src/iosMain/kotlin/dev/icerock/moko/widgets/imagenetwork/ImageNetworkExt.kt diff --git a/widgets-media/src/iosMain/kotlin/dev/icerock/moko/widgets/media/MediaControllerExt.kt b/widgets-media/src/iosMain/kotlin/dev/icerock/moko/widgets/media/MediaControllerExt.kt index a3331925..a7ed42d2 100644 --- a/widgets-media/src/iosMain/kotlin/dev/icerock/moko/widgets/media/MediaControllerExt.kt +++ b/widgets-media/src/iosMain/kotlin/dev/icerock/moko/widgets/media/MediaControllerExt.kt @@ -16,6 +16,4 @@ actual fun Screen<*>.createMediaPickerController(permissionsController: Permissi ) } -actual fun MediaPickerController.bind(screen: Screen<*>) { - // nothing todo - bind only for android -} +actual fun MediaPickerController.bind(screen: Screen<*>) = Unit diff --git a/widgets/build.gradle.kts b/widgets/build.gradle.kts index 007f5e54..fe077a8c 100644 --- a/widgets/build.gradle.kts +++ b/widgets/build.gradle.kts @@ -21,8 +21,8 @@ dependencies { commonMainApi(libs.mokoUnits) commonMainApi(libs.mokoGraphics) commonMainApi(libs.mokoParcelize) - androidMainImplementation(libs.appCompat) - androidMainImplementation(libs.fragment) + androidMainApi(libs.appCompat) + androidMainApi(libs.fragment) androidMainImplementation(libs.recyclerView) androidMainImplementation(libs.material) androidMainImplementation(libs.swipeRefreshLayout) diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt index 10f17f53..5fee9d1f 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt @@ -18,7 +18,6 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import dev.icerock.moko.graphics.Color import dev.icerock.moko.widgets.core.R -import dev.icerock.moko.widgets.core.widget.InputWidget import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext @@ -39,6 +38,7 @@ import dev.icerock.moko.widgets.core.utils.androidId import dev.icerock.moko.widgets.core.utils.bind import dev.icerock.moko.widgets.core.utils.dp import dev.icerock.moko.widgets.core.utils.sp +import dev.icerock.moko.widgets.core.widget.InputWidget @Suppress("LongParameterList", "MagicNumber") actual class FloatingLabelInputViewFactory actual constructor( @@ -119,7 +119,7 @@ actual class FloatingLabelInputViewFactory actual constructor( override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s == null) return - widget.field.data.value = s.toString() + widget.field.setValue(s.toString()) } }) } @@ -144,12 +144,12 @@ actual class FloatingLabelInputViewFactory actual constructor( } } - widget.field.data.bind(lifecycleOwner) { data -> - if (editText.text?.toString() == data) return@bind + widget.field.observeData(lifecycleOwner) { data -> + if (editText.text?.toString() == data) return@observeData editText.setText(data) } - widget.field.error.bind(lifecycleOwner) { error -> + widget.field.observeError(lifecycleOwner) { error -> textInputLayout.error = error?.toString(context) textInputLayout.isErrorEnabled = error != null @@ -163,10 +163,10 @@ actual class FloatingLabelInputViewFactory actual constructor( widget.enabled?.bind(lifecycleOwner) { editText.isEnabled = it == true } widget.maxLines?.bind(lifecycleOwner) { maxLines -> when (maxLines) { - null -> editText.setSingleLine(false) - 1 -> editText.setSingleLine(true) + null -> editText.isSingleLine = false + 1 -> editText.isSingleLine = true else -> { - editText.setSingleLine(false) + editText.isSingleLine = false editText.maxLines = maxLines } } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt index 41dec60c..074b03d6 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt @@ -13,7 +13,6 @@ import android.widget.LinearLayout import androidx.core.view.MarginLayoutParamsCompat import dev.icerock.moko.graphics.Color import dev.icerock.moko.graphics.colorInt -import dev.icerock.moko.widgets.core.widget.InputWidget import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext @@ -31,6 +30,7 @@ import dev.icerock.moko.widgets.core.style.view.WidgetSize import dev.icerock.moko.widgets.core.utils.androidId import dev.icerock.moko.widgets.core.utils.bind import dev.icerock.moko.widgets.core.utils.dp +import dev.icerock.moko.widgets.core.widget.InputWidget actual class MultilineInputViewFactory actual constructor( private val background: Background?, @@ -97,7 +97,7 @@ actual class MultilineInputViewFactory actual constructor( override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s == null) return - widget.field.data.value = s.toString() + widget.field.setValue(s.toString()) } }) @@ -105,15 +105,15 @@ actual class MultilineInputViewFactory actual constructor( labelTextColor?.let { setHintTextColor(it.colorInt()) } } - widget.field.data.bind(lifecycleOwner) { data -> - if (editText.text?.toString() == data) return@bind + widget.field.observeData(lifecycleOwner) { data -> + if (editText.text?.toString() == data) return@observeData editText.setText(data) } widget.label.bind(lifecycleOwner) { editText.hint = it?.toString(context) } widget.enabled?.bind(lifecycleOwner) { editText.isEnabled = it == true } - editText.setSingleLine(false) + editText.isSingleLine = false return ViewBundle( view = editText, diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt index ad1cc354..37d2dd4b 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt @@ -34,6 +34,7 @@ actual class SystemImageViewFactory actual constructor( when (widget.scaleType) { ImageWidget.ScaleType.FILL -> imageView.scaleType = ImageView.ScaleType.CENTER_CROP ImageWidget.ScaleType.FIT -> imageView.scaleType = ImageView.ScaleType.CENTER_INSIDE + null -> Unit } @Suppress("ComplexCondition") if ((size is WidgetSize.Const<*, *> && diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt index 976d9e0a..ace33c52 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt @@ -13,7 +13,6 @@ import androidx.appcompat.widget.AppCompatEditText import androidx.core.view.MarginLayoutParamsCompat import dev.icerock.moko.graphics.Color import dev.icerock.moko.graphics.colorInt -import dev.icerock.moko.widgets.core.widget.InputWidget import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext @@ -33,6 +32,7 @@ import dev.icerock.moko.widgets.core.style.view.WidgetSize import dev.icerock.moko.widgets.core.utils.androidId import dev.icerock.moko.widgets.core.utils.bind import dev.icerock.moko.widgets.core.utils.dp +import dev.icerock.moko.widgets.core.widget.InputWidget @Suppress("LongParameterList") actual class SystemInputViewFactory actual constructor( @@ -102,7 +102,7 @@ actual class SystemInputViewFactory actual constructor( override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s == null) return - widget.field.data.value = s.toString() + widget.field.setValue(s.toString()) } }) @@ -110,8 +110,8 @@ actual class SystemInputViewFactory actual constructor( labelTextColor?.let { setHintTextColor(it.colorInt()) } } - widget.field.data.bind(lifecycleOwner) { data -> - if (editText.text?.toString() == data) return@bind + widget.field.observeData(lifecycleOwner) { data -> + if (editText.text?.toString() == data) return@observeData editText.setText(data) } @@ -120,10 +120,10 @@ actual class SystemInputViewFactory actual constructor( widget.enabled?.bind(lifecycleOwner) { editText.isEnabled = it == true } widget.maxLines?.bind(lifecycleOwner) { maxLines -> when (maxLines) { - null -> editText.setSingleLine(false) - 1 -> editText.setSingleLine(true) + null -> editText.isSingleLine = false + 1 -> editText.isSingleLine = true else -> { - editText.setSingleLine(false) + editText.isSingleLine = false editText.maxLines = maxLines } } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt index 54d24c2b..d5803c24 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt @@ -36,7 +36,7 @@ import dev.icerock.moko.widgets.core.utils.androidId import dev.icerock.moko.widgets.core.utils.bind import dev.icerock.moko.widgets.core.utils.dp -@Suppress("LongParameterList") +@Suppress("LongParameterList", "UnusedPrivateMember") actual class SystemSingleChoiceViewFactory actual constructor( private val textStyle: TextStyle?, private val labelTextStyle: TextStyle?, @@ -110,7 +110,7 @@ actual class SystemSingleChoiceViewFactory actual constructor( spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onNothingSelected(parent: AdapterView<*>?) { - widget.field.data.value = null + widget.field.setValue(null) widget.field.validate() } @@ -120,7 +120,7 @@ actual class SystemSingleChoiceViewFactory actual constructor( position: Int, id: Long ) { - widget.field.data.value = position + widget.field.setValue(position) widget.field.validate() } } @@ -139,7 +139,7 @@ actual class SystemSingleChoiceViewFactory actual constructor( editText.setText(string) } - widget.field.error.bind(lifecycleOwner) { error -> + widget.field.observeError(lifecycleOwner) { error -> textInputLayout.error = error?.toString(context) textInputLayout.isErrorEnabled = error != null } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt index c8325a8a..d0dacf96 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt @@ -16,6 +16,7 @@ import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager import com.google.android.material.tabs.TabLayout import dev.icerock.moko.graphics.Color +import dev.icerock.moko.mvvm.livedata.postValue import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/FragmentNavigation.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/FragmentNavigation.kt index fffdd2de..3a63e33f 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/FragmentNavigation.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/FragmentNavigation.kt @@ -22,6 +22,7 @@ internal class FragmentNavigation( val fm = fragment.childFragmentManager val backStackCount = fm.backStackEntryCount + @Suppress("UnusedPrivateMember") for (i in 0 until backStackCount) { fm.popBackStack() } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt index 5dc2cda9..45d1fe37 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt @@ -242,11 +242,9 @@ actual abstract class BottomNavigationScreen actual constructor( private fun updateTitleMode() { bottomNavigationView?.also { navView -> if (isTitleVisible) { - navView.labelVisibilityMode = - LabelVisibilityMode.LABEL_VISIBILITY_LABELED + navView.labelVisibilityMode = BottomNavigationView.LABEL_VISIBILITY_LABELED } else { - navView.labelVisibilityMode = - LabelVisibilityMode.LABEL_VISIBILITY_UNLABELED + navView.labelVisibilityMode = BottomNavigationView.LABEL_VISIBILITY_UNLABELED } } } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt index 1881c37e..06fa882d 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt @@ -53,38 +53,37 @@ actual abstract class NavigationScreen actual constructor( } childFragmentManager.registerFragmentLifecycleCallbacks( object : FragmentManager.FragmentLifecycleCallbacks() { - private val detachHandlers = mutableMapOf() - override fun onFragmentStarted(fm: FragmentManager, f: Fragment) { super.onFragmentStarted(fm, f) updateNavigation(f) } - override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) { - super.onFragmentAttached(fm, f, context) + override fun onFragmentAttached( + fm: FragmentManager, + f: Fragment, + context: Context + ) = Unit - if (f is Resultable<*> && f is Screen<*>) { - val resultTarget = f.screenId + override fun onFragmentDetached(fm: FragmentManager, f: Fragment) { + super.onFragmentDetached(fm, f) - if (resultTarget != null) { - val target = fm.getAllScreens() - .firstOrNull { it.resultCode == resultTarget } + if (f is Resultable<*> && f is Screen<*>) { + val resultTarget: Int = f.screenId + ?: return - detachHandlers[f] = Runnable { - val code = f.requestCode - val result = f.screenResult + val target: Screen<*>? = fm.getAllScreens() + .firstOrNull { it.resultCode == resultTarget } - target!!.routeHandlers[code]!!.invoke(result) - } - } - } - } + requireNotNull(target) { "can't route with result because target not found" } - override fun onFragmentDetached(fm: FragmentManager, f: Fragment) { - super.onFragmentDetached(fm, f) + val code: Int? = f.requestCode + val result: android.os.Parcelable? = f.screenResult - detachHandlers.remove(f)?.run() + val handler = target.routeHandlers[code] + requireNotNull(handler) { "can't call result because handler is null" } + handler.invoke(result) + } } }, false @@ -192,6 +191,7 @@ actual abstract class NavigationScreen actual constructor( NavigationBar.None -> { toolbar.visibility = View.GONE } + is NavigationBar.Normal -> { navBar.apply( toolbar = toolbar, @@ -199,6 +199,7 @@ actual abstract class NavigationScreen actual constructor( fragmentManager = childFragmentManager ) } + is NavigationBar.Search -> { navBar.apply( toolbar = toolbar, @@ -296,6 +297,7 @@ actual abstract class NavigationScreen actual constructor( return object : Route { override fun route(arg: Unit) { val fragmentManager = navigationScreen!!.getChildFragmentManager() + @Suppress("UnusedPrivateMember") for (i in 0 until fragmentManager.backStackEntryCount) { fragmentManager.popBackStack() } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/NavigationBarNormal.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/NavigationBarNormal.kt index b7846500..adfa6a6b 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/NavigationBarNormal.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/NavigationBarNormal.kt @@ -76,7 +76,7 @@ fun NavigationBar.Normal.apply( actions.forEach { barBtn -> val item = toolbar.menu.add("$barBtn") item.icon = ContextCompat.getDrawable(context, barBtn.icon.drawableResId) - DrawableCompat.setTint(item.icon, tintColor) + item.icon?.let { DrawableCompat.setTint(it, tintColor) } item.setOnMenuItemClickListener { barBtn.action() true diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/background/BackgroundExt.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/background/BackgroundExt.kt index 03a163fe..ae766ecf 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/background/BackgroundExt.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/background/BackgroundExt.kt @@ -52,6 +52,8 @@ fun Background.buildBackground(context: Context): Drawable { gradientDrawable.colors = fill.colors.map { it.argb.toInt() }.toIntArray() gradientDrawable.orientation = fill.direction.toPlatformOrientation() } + + null -> Unit } if (cornerRadius != null) { diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/ext/TextAlignmentExt.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/ext/TextAlignmentExt.kt index 7f815591..abd9f5b6 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/ext/TextAlignmentExt.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/style/ext/TextAlignmentExt.kt @@ -35,6 +35,7 @@ fun getGravityForTextAlignment( } else if (textVerticalAlignment != null) { textVerticalAlignment.getGravity() } else { + @Suppress("UseRequire") throw IllegalArgumentException("At least one argument must be nonnull.") } } diff --git a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/utils/IdExt.kt b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/utils/IdExt.kt index 83939148..5b781d20 100644 --- a/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/utils/IdExt.kt +++ b/widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/utils/IdExt.kt @@ -30,6 +30,7 @@ val > Theme.Id.androidId: Int val fullId = 0x7f081000 + id if (BuildConfig.DEBUG) { + @Suppress("ImplicitDefaultLocale") println(String.format("id %s transformed to 0x%X", idString, fullId)) } @@ -40,6 +41,7 @@ val > Theme.Id.androidId: Int .first() .javaClass.name + @Suppress("ImplicitDefaultLocale") val msg = String.format( "id 0x%X already used by %s, it conflict with %s", fullId, diff --git a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt index c122efd0..dc12ff9b 100644 --- a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt +++ b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt @@ -16,6 +16,7 @@ import dev.icerock.moko.widgets.core.style.background.Background import dev.icerock.moko.widgets.core.style.background.Fill import dev.icerock.moko.widgets.core.style.view.TextStyle +@Suppress("UnnecessaryAbstractClass") expect abstract class NavigationScreen( initialScreen: TypedScreenDesc, router: Router diff --git a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/InputWidget.kt b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/InputWidget.kt index 4c386c2a..ed7e1b4f 100644 --- a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/InputWidget.kt +++ b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/InputWidget.kt @@ -4,7 +4,7 @@ package dev.icerock.moko.widgets.core.widget -import dev.icerock.moko.fields.FormField +import dev.icerock.moko.fields.livedata.FormField import dev.icerock.moko.mvvm.livedata.LiveData import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.widgets.core.RequireId diff --git a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/SingleChoiceWidget.kt b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/SingleChoiceWidget.kt index 3c1ee952..da9ba2e5 100644 --- a/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/SingleChoiceWidget.kt +++ b/widgets/src/commonMain/kotlin/dev/icerock/moko/widgets/core/widget/SingleChoiceWidget.kt @@ -4,7 +4,7 @@ package dev.icerock.moko.widgets.core.widget -import dev.icerock.moko.fields.FormField +import dev.icerock.moko.fields.livedata.FormField import dev.icerock.moko.mvvm.livedata.LiveData import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.widgets.core.RequireId diff --git a/widgets/src/iosArm64Main b/widgets/src/iosArm64Main deleted file mode 120000 index 46be4b86..00000000 --- a/widgets/src/iosArm64Main +++ /dev/null @@ -1 +0,0 @@ -iosX64Main \ No newline at end of file diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/BaseInputViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/BaseInputViewFactory.kt index d042b7b3..20f3286c 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/BaseInputViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/BaseInputViewFactory.kt @@ -4,15 +4,15 @@ package dev.icerock.moko.widgets.core.factory -import dev.icerock.moko.fields.FormField +import dev.icerock.moko.fields.livedata.FormField import dev.icerock.moko.mvvm.livedata.LiveData +import dev.icerock.moko.mvvm.utils.bind import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext import dev.icerock.moko.widgets.core.style.view.MarginValues import dev.icerock.moko.widgets.core.style.view.WidgetSize -import dev.icerock.moko.widgets.core.utils.bind import dev.icerock.moko.widgets.core.utils.setEventHandler import dev.icerock.moko.widgets.core.widget.InputWidget import platform.Foundation.NSMakeRange @@ -50,7 +50,8 @@ abstract class BaseInputViewFactory : ViewFactory : ViewFactory : ViewFactory - val currentText = textField.text.orEmpty() - val shouldApplyChange = textField.delegate?.run { + textField.bind(field.data) { newValue -> + val currentText = this.text.orEmpty() + val shouldApplyChange = this.delegate?.run { textField( - textField, + this@bind, NSMakeRange(0.toULong(), currentText.length.toULong()), newValue ) } ?: true if (shouldApplyChange) { - textField.text = newValue + this.text = newValue } } textField.setEventHandler(UIControlEventEditingChanged) { - val currentValue = field.data.value - val newValue = textField.text + val currentValue: String = field.value() + val newValue: String? = textField.text if (currentValue != newValue) { - field.data.value = newValue.orEmpty() + field.setValue(newValue.orEmpty()) } } } diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ButtonWithIconViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ButtonWithIconViewFactory.kt index 781c7d75..070f6a5b 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ButtonWithIconViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/ButtonWithIconViewFactory.kt @@ -39,6 +39,8 @@ import platform.UIKit.UISemanticContentAttribute import platform.UIKit.UISemanticContentAttributeForceLeftToRight import platform.UIKit.UISemanticContentAttributeForceRightToLeft import platform.UIKit.bringSubviewToFront +import platform.UIKit.contentEdgeInsets +import platform.UIKit.titleEdgeInsets import platform.UIKit.translatesAutoresizingMaskIntoConstraints @Suppress("LongParameterList") diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt index 6250c34d..ef18cbf9 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/FloatingLabelInputViewFactory.kt @@ -4,7 +4,7 @@ package dev.icerock.moko.widgets.core.factory -import dev.icerock.moko.fields.FormField +import dev.icerock.moko.fields.livedata.FormField import dev.icerock.moko.graphics.Color import dev.icerock.moko.graphics.toUIColor import dev.icerock.moko.mvvm.livedata.LiveData @@ -111,8 +111,12 @@ actual class FloatingLabelInputViewFactory actual constructor( return inputView to inputView.textField } - override fun bindLabel(label: LiveData, rootView: InputWidgetView, textField: UITextField) { - label.bind(rootView) { placeholder = it.localized() } + override fun bindLabel( + label: LiveData, + rootView: InputWidgetView, + textField: UITextField + ) { + rootView.bind(label) { placeholder = it.localized() } } override fun bindFieldToTextField( @@ -121,12 +125,15 @@ actual class FloatingLabelInputViewFactory actual constructor( textField: UITextField ) { super.bindFieldToTextField(field, rootView, textField) - field.data.bind(rootView) { - if (!textField.isEditing()) { + + textField.bind(field.data) { + if (!isEditing()) { rootView.layoutPlaceholder() } } - field.error.bind(rootView) { error = it?.localized() } + rootView.bind(field.error) { + this.error = it?.localized() + } } class InputWidgetView( @@ -153,7 +160,9 @@ actual class FloatingLabelInputViewFactory actual constructor( field = value when (value) { TextHorizontalAlignment.LEFT -> textField.textAlignment = NSTextAlignmentLeft - TextHorizontalAlignment.CENTER -> textField.textAlignment = NSTextAlignmentCenter + TextHorizontalAlignment.CENTER -> textField.textAlignment = + NSTextAlignmentCenter + TextHorizontalAlignment.RIGHT -> textField.textAlignment = NSTextAlignmentRight } } diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/LinearViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/LinearViewFactory.kt index 7b629c46..07c95d0b 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/LinearViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/LinearViewFactory.kt @@ -90,6 +90,9 @@ actual class LinearViewFactory actual constructor( result = WidgetSize.Const(size.width, SizeSpec.WrapContent) } } + + is WidgetSize.AspectByHeight<*> -> Unit + is WidgetSize.AspectByWidth<*> -> Unit } return result } diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt index 9939db95..b8b121e5 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/MultilineInputViewFactory.kt @@ -6,6 +6,7 @@ package dev.icerock.moko.widgets.core.factory import dev.icerock.moko.graphics.Color import dev.icerock.moko.graphics.toUIColor +import dev.icerock.moko.mvvm.utils.bind import dev.icerock.moko.resources.desc.StringDesc import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory @@ -91,18 +92,20 @@ actual class MultilineInputViewFactory actual constructor( } } - widget.enabled?.bind { textView.editable = it } - widget.field.data.bind { textView.text = it } + widget.enabled?.let { enabled -> + textView.bind(enabled) { this.editable = it } + } + textView.bind(widget.field.data) { this.text = it } val nc = NSNotificationCenter.defaultCenter val observer = TextViewObserver( textView = textView, - isPlaceholderShow = widget.field.data.value.isEmpty(), + isPlaceholderShow = widget.field.value().isEmpty(), textChangedHandler = { newValue -> - val currentValue = widget.field.data.value + val currentValue = widget.field.value() if (currentValue != newValue) { - widget.field.data.value = newValue + widget.field.setValue(newValue) } }, placeholderText = widget.label.value, @@ -129,7 +132,7 @@ actual class MultilineInputViewFactory actual constructor( ) if (widget.label.value.localized().isNotEmpty()) { - if (widget.field.data.value.isEmpty()) { + if (widget.field.value().isEmpty()) { textView.text = widget.label.value.localized() textView.textColor = labelTextColor?.toUIColor() ?: UIColor.grayColor } diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemButtonViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemButtonViewFactory.kt index 2af48c1a..80f336ae 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemButtonViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemButtonViewFactory.kt @@ -27,6 +27,7 @@ import platform.UIKit.UIButtonTypeSystem import platform.UIKit.UIControlEventTouchUpInside import platform.UIKit.UIControlStateNormal import platform.UIKit.UIEdgeInsetsMake +import platform.UIKit.contentEdgeInsets import platform.UIKit.translatesAutoresizingMaskIntoConstraints actual class SystemButtonViewFactory actual constructor( diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt index 317cd4a6..a9a9ab7a 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemImageViewFactory.kt @@ -38,8 +38,11 @@ actual class SystemImageViewFactory actual constructor( when (widget.scaleType) { ImageWidget.ScaleType.FILL -> this.contentMode = UIViewContentMode.UIViewContentModeScaleAspectFill + ImageWidget.ScaleType.FIT -> this.contentMode = UIViewContentMode.UIViewContentModeScaleAspectFit + + null -> Unit } layer.cornerRadius = cornerRadius?.toDouble() ?: 0.0 diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt index 0a31905b..5fd7705a 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemInputViewFactory.kt @@ -35,7 +35,7 @@ import platform.UIKit.UITextField import platform.UIKit.clipsToBounds import platform.UIKit.translatesAutoresizingMaskIntoConstraints -@Suppress("LongParameterList") +@Suppress("LongParameterList", "UnusedPrivateMember") actual open class SystemInputViewFactory actual constructor( private val background: Background?, override val margins: MarginValues?, diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemListViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemListViewFactory.kt index c4dda6b6..c71f676d 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemListViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemListViewFactory.kt @@ -38,6 +38,7 @@ import platform.UIKit.UITableViewStyle import platform.UIKit.layoutMargins import platform.UIKit.translatesAutoresizingMaskIntoConstraints +@Suppress("UnusedPrivateMember") actual class SystemListViewFactory actual constructor( private val background: Background?, private val dividerEnabled: Boolean?, diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt index 132d9f5c..53e6a4b4 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemSingleChoiceViewFactory.kt @@ -17,7 +17,7 @@ import dev.icerock.moko.widgets.core.style.view.WidgetSize import dev.icerock.moko.widgets.core.widget.SingleChoiceWidget import platform.UIKit.UIView -@Suppress("LongParameterList") +@Suppress("LongParameterList", "UnusedPrivateMember") actual class SystemSingleChoiceViewFactory actual constructor( private val textStyle: TextStyle?, private val labelTextStyle: TextStyle?, diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt index f95fce39..9f0f1e3c 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/factory/SystemTabsViewFactory.kt @@ -6,6 +6,7 @@ package dev.icerock.moko.widgets.core.factory import dev.icerock.moko.graphics.Color import dev.icerock.moko.graphics.toUIColor +import dev.icerock.moko.mvvm.livedata.postValue import dev.icerock.moko.widgets.core.ViewBundle import dev.icerock.moko.widgets.core.ViewFactory import dev.icerock.moko.widgets.core.ViewFactoryContext diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt index f9053858..341cf814 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/BottomNavigationScreen.kt @@ -40,7 +40,6 @@ actual abstract class BottomNavigationScreen actual constructor( BottomNavigationItem.Builder().apply(builder).build() actual var selectedItemId: Int - @ExperimentalUnsignedTypes get() = tabBarController?.selectedIndex?.let { items[it.toInt()].id } ?: -1 diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/BackgroundExt.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/BackgroundExt.kt index 4bc0b3a5..ca317114 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/BackgroundExt.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/BackgroundExt.kt @@ -21,6 +21,8 @@ import platform.QuartzCore.CATransaction import platform.UIKit.UIButton import platform.UIKit.UIColor import platform.UIKit.UIView +import platform.UIKit.adjustsImageWhenDisabled +import platform.UIKit.adjustsImageWhenHighlighted import platform.UIKit.backgroundColor import platform.UIKit.window diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/NativeUtils.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/NativeUtils.kt deleted file mode 100644 index 361a3074..00000000 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/NativeUtils.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets.core.utils - -@Suppress("FunctionParameterNaming") -expect fun getAssociatedObject(`object`: kotlin.Any?): kotlin.Any? - -@Suppress("FunctionParameterNaming") -expect fun setAssociatedObject(`object`: kotlin.Any?, value: kotlin.Any?) - -expect fun cgColors(uiColors: kotlin.collections.List<*>?): kotlin.collections.List<*>? diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/UIControlExt.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/UIControlExt.kt index ed539a54..aa8ee137 100644 --- a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/UIControlExt.kt +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/UIControlExt.kt @@ -70,6 +70,7 @@ class LambdaTarget(val lambda: () -> Unit) : NSObject() { } @ObjCAction + @Suppress("UnusedPrivateMember") fun displayLink(link: CADisplayLink) { lambda() } diff --git a/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt new file mode 100644 index 00000000..5aaae014 --- /dev/null +++ b/widgets/src/iosMain/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.widgets.core.utils + +fun setAssociatedObject(obj: Any?, value: Any?) { + dev.icerock.moko.widgets.objc.setAssociatedObject(obj, value) +} + +fun getAssociatedObject(obj: Any?): Any? { + return dev.icerock.moko.widgets.objc.getAssociatedObject(obj) +} + +fun cgColors(uiColors: List<*>?): List<*>? { + return dev.icerock.moko.widgets.objc.cgColors(uiColors) +} diff --git a/widgets/src/iosX64Main/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt b/widgets/src/iosX64Main/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt deleted file mode 100644 index c29eb57b..00000000 --- a/widgets/src/iosX64Main/kotlin/dev/icerock/moko/widgets/core/utils/setAssociatedObject.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2021 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. - */ - -package dev.icerock.moko.widgets.core.utils - -actual fun setAssociatedObject(`object`: Any?, value: Any?) { - dev.icerock.moko.widgets.objc.setAssociatedObject(`object`, value) -} - -actual fun getAssociatedObject(`object`: Any?): Any? { - return dev.icerock.moko.widgets.objc.getAssociatedObject(`object`) -} - -actual fun cgColors(uiColors: List<*>?): List<*>? { - return dev.icerock.moko.widgets.objc.cgColors(uiColors) -}