From 47f8565ef22e6dd05a710c569509dad27e1082c2 Mon Sep 17 00:00:00 2001 From: Aleksey Mikhailov Date: Tue, 15 Oct 2019 10:28:58 +0700 Subject: [PATCH] initial commit --- .gitignore | 12 + CONTRIBUTING.md | 38 ++ LICENSE.md | 201 +++++++++++ README.md | 97 ++++++ build.gradle.kts | 23 ++ buildSrc/build.gradle.kts | 26 ++ buildSrc/src/main/kotlin/Deps.kt | 37 ++ buildSrc/src/main/kotlin/Versions.kt | 28 ++ gradle.properties | 9 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55616 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 188 ++++++++++ gradlew.bat | 100 ++++++ img/logo.png | Bin 0 -> 25407 bytes parcelize/build.gradle.kts | 42 +++ parcelize/src/androidMain/AndroidManifest.xml | 2 + .../dev/icerock/moko/parcelize/Parcelize.kt | 15 + .../dev/icerock/moko/parcelize/Parcelize.kt | 9 + parcelize/src/iosArm64Main | 1 + .../dev/icerock/moko/parcelize/Parcelize.kt | 11 + parcelize/src/iosX64Main | 1 + sample/android-app/build.gradle.kts | 56 +++ sample/android-app/proguard-rules.pro | 17 + .../android-app/src/main/AndroidManifest.xml | 20 ++ .../main/java/com/icerockdev/MainActivity.kt | 40 +++ .../src/main/res/layout/activity_main.xml | 8 + sample/gradlew | 1 + sample/ios-app/Podfile | 22 ++ sample/ios-app/Podfile.lock | 16 + .../TestProj.xcodeproj/project.pbxproj | 325 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata | 10 + sample/ios-app/src/AppDelegate.swift | 17 + .../AppIcon.appiconset/Contents.json | 58 ++++ .../ios-app/src/Assets.xcassets/Contents.json | 6 + sample/ios-app/src/Info.plist | 62 ++++ .../Base.lproj/LaunchScreen.storyboard | 43 +++ .../src/Resources/Base.lproj/Main.storyboard | 48 +++ sample/ios-app/src/TestViewController.swift | 18 + .../mpp-library/MultiPlatformLibrary.podspec | 38 ++ sample/mpp-library/build.gradle.kts | 26 ++ .../src/androidMain/AndroidManifest.xml | 2 + .../kotlin/com/icerockdev/library/User.kt | 16 + settings.gradle.kts | 24 ++ 44 files changed, 1725 insertions(+) create mode 100755 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100755 README.md create mode 100644 build.gradle.kts create mode 100644 buildSrc/build.gradle.kts create mode 100755 buildSrc/src/main/kotlin/Deps.kt create mode 100755 buildSrc/src/main/kotlin/Versions.kt create mode 100755 gradle.properties create mode 100755 gradle/wrapper/gradle-wrapper.jar create mode 100755 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100755 gradlew.bat create mode 100644 img/logo.png create mode 100644 parcelize/build.gradle.kts create mode 100755 parcelize/src/androidMain/AndroidManifest.xml create mode 100755 parcelize/src/androidMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt create mode 100755 parcelize/src/commonMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt create mode 120000 parcelize/src/iosArm64Main create mode 100755 parcelize/src/iosMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt create mode 120000 parcelize/src/iosX64Main create mode 100644 sample/android-app/build.gradle.kts create mode 100755 sample/android-app/proguard-rules.pro create mode 100755 sample/android-app/src/main/AndroidManifest.xml create mode 100755 sample/android-app/src/main/java/com/icerockdev/MainActivity.kt create mode 100755 sample/android-app/src/main/res/layout/activity_main.xml create mode 120000 sample/gradlew create mode 100644 sample/ios-app/Podfile create mode 100644 sample/ios-app/Podfile.lock create mode 100644 sample/ios-app/TestProj.xcodeproj/project.pbxproj create mode 100755 sample/ios-app/TestProj.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100755 sample/ios-app/TestProj.xcworkspace/contents.xcworkspacedata create mode 100755 sample/ios-app/src/AppDelegate.swift create mode 100755 sample/ios-app/src/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100755 sample/ios-app/src/Assets.xcassets/Contents.json create mode 100755 sample/ios-app/src/Info.plist create mode 100755 sample/ios-app/src/Resources/Base.lproj/LaunchScreen.storyboard create mode 100755 sample/ios-app/src/Resources/Base.lproj/Main.storyboard create mode 100755 sample/ios-app/src/TestViewController.swift create mode 100644 sample/mpp-library/MultiPlatformLibrary.podspec create mode 100644 sample/mpp-library/build.gradle.kts create mode 100755 sample/mpp-library/src/androidMain/AndroidManifest.xml create mode 100755 sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/User.kt create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..77fd544 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.gradle +.settings +.project +.classpath +.vscode +.idea +build +*.iml +Pods +xcuserdata +local.properties +local.gradle \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..85d4135 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Do’s and Don’ts + +* **Search tickets before you file a new one.** Add to tickets if you have new information about the issue. +* **Keep tickets short but sweet.** Make sure you include all the context needed to solve the issue. Don't overdo it. Great tickets allow us to focus on solving problems instead of discussing them. +* **Take care of your ticket.** When you spend time to report a ticket with care we'll enjoy fixing it for you. +* **Use [GitHub-flavored Markdown](https://help.github.com/articles/markdown-basics/).** Especially put code blocks and console outputs in backticks (```` ``` ````). That increases the readability. Bonus points for applying the appropriate syntax highlighting. + +## Bug Reports + +In short, since you are most likely a developer, provide a ticket that you _yourself_ would _like_ to receive. + +First check if you are using the latest library version and Kotlin version before filing a ticket. + +Please include steps to reproduce and _all_ other relevant information, including any other relevant dependency and version information. + +## Feature Requests + +Please try to be precise about the proposed outcome of the feature and how it +would related to existing features. + + +## Pull Requests + +We **love** pull requests! + +All contributions _will_ be licensed under the Apache 2 license. + +Code/comments should adhere to the following rules: + +* Names should be descriptive and concise. +* Use four spaces and no tabs. +* Remember that source code usually gets written once and read often: ensure + the reader doesn't have to make guesses. Make sure that the purpose and inner + logic are either obvious to a reasonably skilled professional, or add a + comment that explains it. +* Please add a detailed description. + +If you consistently contribute improvements and/or bug fixes, we're happy to make you a maintainer. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..9c8f3ea --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 0000000..5730871 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +![moko-parcelize](img/logo.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://api.bintray.com/packages/icerockdev/moko/moko-core/images/download.svg) ](https://bintray.com/icerockdev/moko/moko-core/_latestVersion) ![kotlin-version](https://img.shields.io/badge/kotlin-1.3.50-orange) + +# Mobile Kotlin parcelize +This is a Kotlin Multiplatform library that supports Parcelize in common code. + +## Table of Contents +- [Features](#features) +- [Requirements](#requirements) +- [Versions](#versions) +- [Installation](#installation) +- [Usage](#usage) +- [Samples](#samples) +- [Set Up Locally](#setup-locally) +- [Contributing](#contributing) +- [License](#license) + +## Features +- **Parcelize** in common code (specially for Android target). + +## Requirements +- Gradle version 5.4.1+ +- Android API 16+ +- iOS version 9.0+ + +## Versions +- kotlin 1.3.50 + - 0.1.0 + +## Installation +root build.gradle +```groovy +allprojects { + repositories { + maven { url = "https://dl.bintray.com/icerockdev/moko" } + } +} +``` + +project build.gradle +```groovy +dependencies { + commonMainApi("dev.icerock.moko:parcelize:0.1.0") +} +``` + +settings.gradle +```groovy +enableFeaturePreview("GRADLE_METADATA") +``` + +## Usage +### Parcelize +Enable [kotlin android extensions](https://kotlinlang.org/docs/tutorials/android-plugin.html): +```groovy +apply plugin: 'kotlin-android-extensions' +``` + +Mark common code classes with the annotation `@Parcelize` like in the Android code for automatically generated `Parcelable` implementation. +```kotlin +@Parcelize +data class User( + val firstName: String, + val lastName: String +) : Parcelable +``` + +## Samples +Please see more examples in the [sample directory](sample). + +## Set Up Locally +- The [parcelize directory](parcelize) contains the `parcelize` library; +- The [sample directory](sample) contains sample apps for Android and iOS; plus the mpp-library connected to the apps; +- For local testing use the `:parcelize:publishToMavenLocal` gradle task - so that sample apps use the locally published version. + +## Contributing +All development (both new features and bug fixes) is performed in the `develop` branch. This way `master` always contains the sources of the most recently released version. Please send PRs with bug fixes to the `develop` branch. Documentation fixes in the markdown files are an exception to this rule. They are updated directly in `master`. + +The `develop` branch is pushed to `master` on release. + +For more details on contributing please see the [contributing guide](CONTRIBUTING.md). + +## License + + Copyright 2019 IceRock MAG Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..8b21163 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,23 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +allprojects { + repositories { + mavenLocal() + + google() + jcenter() + + maven { url = uri("https://kotlin.bintray.com/kotlin") } + maven { url = uri("https://kotlin.bintray.com/kotlinx") } + maven { url = uri("https://dl.bintray.com/icerockdev/moko") } + } + + // workaround for https://youtrack.jetbrains.com/issue/KT-27170 + configurations.create("compileClasspath") +} + +tasks.register("clean", Delete::class).configure { + delete(rootProject.buildDir) +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..396e934 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,26 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + `kotlin-dsl` +} + +repositories { + mavenLocal() + + jcenter() + google() + + maven { url = uri("https://dl.bintray.com/icerockdev/plugins") } +} + +dependencies { + implementation("dev.icerock:mobile-multiplatform:0.3.0") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50") + implementation("com.android.tools.build:gradle:3.5.0") +} + +kotlinDslPluginOptions { + experimentalWarning.set(false) +} diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt new file mode 100755 index 0000000..076928f --- /dev/null +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +object Deps { + object Plugins { + const val androidExtensions = + "org.jetbrains.kotlin:kotlin-android-extensions:${Versions.Plugins.androidExtensions}" + } + + object Libs { + object Android { + val kotlinStdLib = AndroidLibrary( + name = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}" + ) + val appCompat = AndroidLibrary( + name = "androidx.appcompat:appcompat:${Versions.Libs.Android.appCompat}" + ) + } + + object MultiPlatform { + val kotlinStdLib = MultiPlatformLibrary( + android = Android.kotlinStdLib.name, + common = "org.jetbrains.kotlin:kotlin-stdlib-common:${Versions.kotlin}" + ) + val mokoParcelize = MultiPlatformLibrary( + common = "dev.icerock.moko:parcelize:${Versions.Libs.MultiPlatform.mokoParcelize}", + iosX64 = "dev.icerock.moko:parcelize-iosx64:${Versions.Libs.MultiPlatform.mokoParcelize}", + iosArm64 = "dev.icerock.moko:parcelize-iosarm64:${Versions.Libs.MultiPlatform.mokoParcelize}" + ) + } + } + + val plugins: Map = mapOf( + "kotlin-android-extensions" to Plugins.androidExtensions + ) +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt new file mode 100755 index 0000000..048914a --- /dev/null +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +object Versions { + object Android { + const val compileSdk = 28 + const val targetSdk = 28 + const val minSdk = 16 + } + + const val kotlin = "1.3.50" + + object Plugins { + const val kotlin = Versions.kotlin + const val androidExtensions = Versions.kotlin + } + + object Libs { + object Android { + const val appCompat = "1.0.2" + } + + object MultiPlatform { + const val mokoParcelize: String = "0.1.0" + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100755 index 0000000..bcbe8df --- /dev/null +++ b/gradle.properties @@ -0,0 +1,9 @@ +org.gradle.jvmargs=-Xmx4096m +org.gradle.configureondemand=false +org.gradle.parallel=true + +kotlin.code.style=official + +android.useAndroidX=true +android.enableJetifier=true +android.databinding.enableV2=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100755 index 0000000000000000000000000000000000000000..5c2d1cf016b3885f6930543d57b744ea8c220a1a GIT binary patch literal 55616 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000..9618d8d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/img/logo.png b/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d193c210af76efae5b9c75631a10cee882f22118 GIT binary patch literal 25407 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 literal 0 HcmV?d00001 diff --git a/parcelize/build.gradle.kts b/parcelize/build.gradle.kts new file mode 100644 index 0000000..cf8db50 --- /dev/null +++ b/parcelize/build.gradle.kts @@ -0,0 +1,42 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.multiplatform") + id("kotlin-android-extensions") + id("dev.icerock.mobile.multiplatform") + id("maven-publish") +} + +group = "dev.icerock.moko" +version = Versions.Libs.MultiPlatform.mokoParcelize + +android { + compileSdkVersion(Versions.Android.compileSdk) + + defaultConfig { + minSdkVersion(Versions.Android.minSdk) + targetSdkVersion(Versions.Android.targetSdk) + } +} + +androidExtensions { + isExperimental = true +} + +dependencies { + mppLibrary(Deps.Libs.MultiPlatform.kotlinStdLib) +} + +publishing { + repositories.maven("https://api.bintray.com/maven/icerockdev/moko/moko-parcelize/;publish=1") { + name = "bintray" + + credentials { + username = System.getProperty("BINTRAY_USER") + password = System.getProperty("BINTRAY_KEY") + } + } +} diff --git a/parcelize/src/androidMain/AndroidManifest.xml b/parcelize/src/androidMain/AndroidManifest.xml new file mode 100755 index 0000000..52437a5 --- /dev/null +++ b/parcelize/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/parcelize/src/androidMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt b/parcelize/src/androidMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt new file mode 100755 index 0000000..23d170c --- /dev/null +++ b/parcelize/src/androidMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt @@ -0,0 +1,15 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.parcelize + +import android.os.Parcelable +import kotlinx.android.parcel.IgnoredOnParcel +import kotlinx.android.parcel.Parcelize + +actual typealias Parcelize = Parcelize + +actual typealias Parcelable = Parcelable + +actual typealias IgnoredOnParcel = IgnoredOnParcel \ No newline at end of file diff --git a/parcelize/src/commonMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt b/parcelize/src/commonMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt new file mode 100755 index 0000000..bc5a4a0 --- /dev/null +++ b/parcelize/src/commonMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt @@ -0,0 +1,9 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.parcelize + +expect annotation class Parcelize() +expect interface Parcelable +expect annotation class IgnoredOnParcel() \ No newline at end of file diff --git a/parcelize/src/iosArm64Main b/parcelize/src/iosArm64Main new file mode 120000 index 0000000..93d7d74 --- /dev/null +++ b/parcelize/src/iosArm64Main @@ -0,0 +1 @@ +iosMain \ No newline at end of file diff --git a/parcelize/src/iosMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt b/parcelize/src/iosMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt new file mode 100755 index 0000000..6c211af --- /dev/null +++ b/parcelize/src/iosMain/kotlin/dev/icerock/moko/parcelize/Parcelize.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package dev.icerock.moko.parcelize + +actual annotation class Parcelize + +actual interface Parcelable + +actual annotation class IgnoredOnParcel \ No newline at end of file diff --git a/parcelize/src/iosX64Main b/parcelize/src/iosX64Main new file mode 120000 index 0000000..93d7d74 --- /dev/null +++ b/parcelize/src/iosX64Main @@ -0,0 +1 @@ +iosMain \ No newline at end of file diff --git a/sample/android-app/build.gradle.kts b/sample/android-app/build.gradle.kts new file mode 100644 index 0000000..c057191 --- /dev/null +++ b/sample/android-app/build.gradle.kts @@ -0,0 +1,56 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") +} + +android { + compileSdkVersion(Versions.Android.compileSdk) + + dataBinding { + isEnabled = true + } + + dexOptions { + javaMaxHeapSize = "2g" + } + + defaultConfig { + minSdkVersion(Versions.Android.minSdk) + targetSdkVersion(Versions.Android.targetSdk) + + applicationId = "dev.icerock.moko.samples.parcelize" + + versionCode = 1 + versionName = "0.1.0" + + vectorDrawables.useSupportLibrary = true + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") + } + getByName("debug") { + isDebuggable = true + applicationIdSuffix = ".debug" + } + } + + packagingOptions { + exclude("META-INF/*.kotlin_module") + } +} + +dependencies { + implementation(Deps.Libs.Android.kotlinStdLib.name) + + implementation(Deps.Libs.Android.appCompat.name) + + implementation(project(":sample:mpp-library")) +} diff --git a/sample/android-app/proguard-rules.pro b/sample/android-app/proguard-rules.pro new file mode 100755 index 0000000..1ecf581 --- /dev/null +++ b/sample/android-app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /opt/android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/sample/android-app/src/main/AndroidManifest.xml b/sample/android-app/src/main/AndroidManifest.xml new file mode 100755 index 0000000..29ce9ad --- /dev/null +++ b/sample/android-app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt b/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt new file mode 100755 index 0000000..6e7e55e --- /dev/null +++ b/sample/android-app/src/main/java/com/icerockdev/MainActivity.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package com.icerockdev + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import com.icerockdev.library.User + +class MainActivity : AppCompatActivity() { + + private val userInstanceKey = "user" + private var user: User = User( + firstName = "Aleksey", + lastName = "Mikhailov", + phone = "+79000000000", + age = 26 + ) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContentView(R.layout.activity_main) + } + + override fun onSaveInstanceState(outState: Bundle?) { + super.onSaveInstanceState(outState) + + outState?.putParcelable(userInstanceKey, user) + } + + override fun onRestoreInstanceState(savedInstanceState: Bundle?) { + super.onRestoreInstanceState(savedInstanceState) + + savedInstanceState?.getParcelable(userInstanceKey)?.let { + this.user = it + } + } +} diff --git a/sample/android-app/src/main/res/layout/activity_main.xml b/sample/android-app/src/main/res/layout/activity_main.xml new file mode 100755 index 0000000..b5be961 --- /dev/null +++ b/sample/android-app/src/main/res/layout/activity_main.xml @@ -0,0 +1,8 @@ + + + diff --git a/sample/gradlew b/sample/gradlew new file mode 120000 index 0000000..502f5a2 --- /dev/null +++ b/sample/gradlew @@ -0,0 +1 @@ +../gradlew \ No newline at end of file diff --git a/sample/ios-app/Podfile b/sample/ios-app/Podfile new file mode 100644 index 0000000..a57cc39 --- /dev/null +++ b/sample/ios-app/Podfile @@ -0,0 +1,22 @@ +source 'https://github.com/CocoaPods/Specs.git' + +# ignore all warnings from all pods +inhibit_all_warnings! + +use_frameworks! +platform :ios, '11.0' + +pre_install do |installer| + # We represent a Kotlin/Native module to CocoaPods as a vendored framework. + # CocoaPods needs access to such frameworks during installation process to obtain + # their type (static or dynamic) and configure the Xcode project accordingly. + # Build MultiPlatformLibrary framework to correct install Pod + puts "prepare MultiPlatformLibrary.framework (require some time...)" + `cd .. && ./gradlew :sample:mpp-library:syncMultiPlatformLibraryDebugFrameworkIosX64` + puts "preparing MultiPlatformLibrary.framework complete" +end + +target 'TestProj' do + # MultiPlatformLibrary + pod 'MultiPlatformLibrary', :path => '../mpp-library' +end diff --git a/sample/ios-app/Podfile.lock b/sample/ios-app/Podfile.lock new file mode 100644 index 0000000..847f78a --- /dev/null +++ b/sample/ios-app/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - MultiPlatformLibrary (0.1.0) + +DEPENDENCIES: + - MultiPlatformLibrary (from `../mpp-library`) + +EXTERNAL SOURCES: + MultiPlatformLibrary: + :path: "../mpp-library" + +SPEC CHECKSUMS: + MultiPlatformLibrary: cd722dcacda18e0f3b888e477d2bf1743af85ee1 + +PODFILE CHECKSUM: 4fe4be1b815729054ce80d124b3c324811469f77 + +COCOAPODS: 1.8.3 diff --git a/sample/ios-app/TestProj.xcodeproj/project.pbxproj b/sample/ios-app/TestProj.xcodeproj/project.pbxproj new file mode 100644 index 0000000..04030ae --- /dev/null +++ b/sample/ios-app/TestProj.xcodeproj/project.pbxproj @@ -0,0 +1,325 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 2B70A10DE02726CA8E6981EB /* Pods_TestProj.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E8D683A7C91DCD56058C7435 /* Pods_TestProj.framework */; }; + 45D74FCC22BFDDFD00CAB0C8 /* TestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45D74FCB22BFDDFD00CAB0C8 /* TestViewController.swift */; }; + 45F4791D219463C7003D25FA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45F47912219463C7003D25FA /* LaunchScreen.storyboard */; }; + 45F4791E219463C7003D25FA /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 45F47914219463C7003D25FA /* Main.storyboard */; }; + 45F47921219463C7003D25FA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 45F4791A219463C7003D25FA /* Assets.xcassets */; }; + 45F47922219463C7003D25FA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F4791B219463C7003D25FA /* AppDelegate.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 287627FF1F319065007FA12B /* mokoSampleParcelize.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mokoSampleParcelize.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 45964D362282A1FD00C16658 /* mpp-library */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "mpp-library"; path = "../mpp-library"; sourceTree = ""; }; + 45D74FCB22BFDDFD00CAB0C8 /* TestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestViewController.swift; sourceTree = ""; }; + 45F47913219463C7003D25FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 45F47915219463C7003D25FA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 45F4791A219463C7003D25FA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 45F4791B219463C7003D25FA /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 45F4791C219463C7003D25FA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A644D2F1C5377C40A53FCD6A /* Pods-TestProj.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TestProj.release.xcconfig"; path = "Pods/Target Support Files/Pods-TestProj/Pods-TestProj.release.xcconfig"; sourceTree = ""; }; + DFBDF7D3559D080FDCA444A6 /* Pods-TestProj.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TestProj.debug.xcconfig"; path = "Pods/Target Support Files/Pods-TestProj/Pods-TestProj.debug.xcconfig"; sourceTree = ""; }; + E8D683A7C91DCD56058C7435 /* Pods_TestProj.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TestProj.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 287627FC1F319065007FA12B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B70A10DE02726CA8E6981EB /* Pods_TestProj.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0C46713DE6750675C174D0A7 /* Pods */ = { + isa = PBXGroup; + children = ( + DFBDF7D3559D080FDCA444A6 /* Pods-TestProj.debug.xcconfig */, + A644D2F1C5377C40A53FCD6A /* Pods-TestProj.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 287627F61F319065007FA12B = { + isa = PBXGroup; + children = ( + 45964D362282A1FD00C16658 /* mpp-library */, + 45F47910219463C7003D25FA /* src */, + 287628001F319065007FA12B /* Products */, + EE1ABB3E79CE541540D3155F /* Frameworks */, + 0C46713DE6750675C174D0A7 /* Pods */, + ); + indentWidth = 4; + sourceTree = ""; + tabWidth = 4; + usesTabs = 0; + }; + 287628001F319065007FA12B /* Products */ = { + isa = PBXGroup; + children = ( + 287627FF1F319065007FA12B /* mokoSampleParcelize.app */, + ); + name = Products; + sourceTree = ""; + }; + 45F47910219463C7003D25FA /* src */ = { + isa = PBXGroup; + children = ( + 45F47911219463C7003D25FA /* Resources */, + 45F4791A219463C7003D25FA /* Assets.xcassets */, + 45F4791B219463C7003D25FA /* AppDelegate.swift */, + 45F4791C219463C7003D25FA /* Info.plist */, + 45D74FCB22BFDDFD00CAB0C8 /* TestViewController.swift */, + ); + path = src; + sourceTree = ""; + }; + 45F47911219463C7003D25FA /* Resources */ = { + isa = PBXGroup; + children = ( + 45F47912219463C7003D25FA /* LaunchScreen.storyboard */, + 45F47914219463C7003D25FA /* Main.storyboard */, + ); + path = Resources; + sourceTree = ""; + }; + EE1ABB3E79CE541540D3155F /* Frameworks */ = { + isa = PBXGroup; + children = ( + E8D683A7C91DCD56058C7435 /* Pods_TestProj.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 287627FE1F319065007FA12B /* TestProj */ = { + isa = PBXNativeTarget; + buildConfigurationList = 287628111F319065007FA12B /* Build configuration list for PBXNativeTarget "TestProj" */; + buildPhases = ( + DDE4C06D580BF457BEDF8D0A /* [CP] Check Pods Manifest.lock */, + 287627FB1F319065007FA12B /* Sources */, + 287627FC1F319065007FA12B /* Frameworks */, + 287627FD1F319065007FA12B /* Resources */, + A46F90AE236066C789309780 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TestProj; + productName = TestProj; + productReference = 287627FF1F319065007FA12B /* mokoSampleParcelize.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 287627F71F319065007FA12B /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = "IceRock Development"; + TargetAttributes = { + 287627FE1F319065007FA12B = { + CreatedOnToolsVersion = 8.3.3; + LastSwiftMigration = 0940; + }; + }; + }; + buildConfigurationList = 287627FA1F319065007FA12B /* Build configuration list for PBXProject "TestProj" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + Base, + ); + mainGroup = 287627F61F319065007FA12B; + productRefGroup = 287628001F319065007FA12B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 287627FE1F319065007FA12B /* TestProj */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 287627FD1F319065007FA12B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 45F4791E219463C7003D25FA /* Main.storyboard in Resources */, + 45F4791D219463C7003D25FA /* LaunchScreen.storyboard in Resources */, + 45F47921219463C7003D25FA /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + A46F90AE236066C789309780 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TestProj/Pods-TestProj-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-TestProj/Pods-TestProj-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-TestProj/Pods-TestProj-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + DDE4C06D580BF457BEDF8D0A /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-TestProj-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 287627FB1F319065007FA12B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 45D74FCC22BFDDFD00CAB0C8 /* TestViewController.swift in Sources */, + 45F47922219463C7003D25FA /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 45F47912219463C7003D25FA /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 45F47913219463C7003D25FA /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 45F47914219463C7003D25FA /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 45F47915219463C7003D25FA /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2876280F1F319065007FA12B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 0; + DEFINES_MODULE = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 287628101F319065007FA12B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = 0; + DEFINES_MODULE = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + 287628121F319065007FA12B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DFBDF7D3559D080FDCA444A6 /* Pods-TestProj.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = src/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = dev.icerock.moko.sample.parcelize; + PRODUCT_NAME = mokoSampleParcelize; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + }; + name = Debug; + }; + 287628131F319065007FA12B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A644D2F1C5377C40A53FCD6A /* Pods-TestProj.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = src/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = dev.icerock.moko.sample.parcelize; + PRODUCT_NAME = mokoSampleParcelize; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 287627FA1F319065007FA12B /* Build configuration list for PBXProject "TestProj" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2876280F1F319065007FA12B /* Debug */, + 287628101F319065007FA12B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 287628111F319065007FA12B /* Build configuration list for PBXNativeTarget "TestProj" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 287628121F319065007FA12B /* Debug */, + 287628131F319065007FA12B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 287627F71F319065007FA12B /* Project object */; +} diff --git a/sample/ios-app/TestProj.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/sample/ios-app/TestProj.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..8294ef0 --- /dev/null +++ b/sample/ios-app/TestProj.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/sample/ios-app/TestProj.xcworkspace/contents.xcworkspacedata b/sample/ios-app/TestProj.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..f706927 --- /dev/null +++ b/sample/ios-app/TestProj.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/sample/ios-app/src/AppDelegate.swift b/sample/ios-app/src/AppDelegate.swift new file mode 100755 index 0000000..3274ae7 --- /dev/null +++ b/sample/ios-app/src/AppDelegate.swift @@ -0,0 +1,17 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import MultiPlatformLibrary +import UIKit + +@UIApplicationMain +class AppDelegate: NSObject, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + + return true + } +} diff --git a/sample/ios-app/src/Assets.xcassets/AppIcon.appiconset/Contents.json b/sample/ios-app/src/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..1040d84 --- /dev/null +++ b/sample/ios-app/src/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/sample/ios-app/src/Assets.xcassets/Contents.json b/sample/ios-app/src/Assets.xcassets/Contents.json new file mode 100755 index 0000000..2d92bd5 --- /dev/null +++ b/sample/ios-app/src/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/sample/ios-app/src/Info.plist b/sample/ios-app/src/Info.plist new file mode 100755 index 0000000..e75e308 --- /dev/null +++ b/sample/ios-app/src/Info.plist @@ -0,0 +1,62 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + moko-parcelize + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(BUNDLE_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.1.0 + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.developer-tools + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + NSMainStoryboardFile + Main + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UIStatusBarHidden + + UIStatusBarHidden~ipad + + UIStatusBarStyle + UIStatusBarStyleLightContent + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/sample/ios-app/src/Resources/Base.lproj/LaunchScreen.storyboard b/sample/ios-app/src/Resources/Base.lproj/LaunchScreen.storyboard new file mode 100755 index 0000000..f1cb568 --- /dev/null +++ b/sample/ios-app/src/Resources/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/ios-app/src/Resources/Base.lproj/Main.storyboard b/sample/ios-app/src/Resources/Base.lproj/Main.storyboard new file mode 100755 index 0000000..d1a2f50 --- /dev/null +++ b/sample/ios-app/src/Resources/Base.lproj/Main.storyboard @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/ios-app/src/TestViewController.swift b/sample/ios-app/src/TestViewController.swift new file mode 100755 index 0000000..3b36a0c --- /dev/null +++ b/sample/ios-app/src/TestViewController.swift @@ -0,0 +1,18 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +import UIKit +import MultiPlatformLibrary + +class TestViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + let _ = User(firstName: "Aleksey", + lastName: "Mikhailov", + phone: "+79000000000", + age: 26) + } +} diff --git a/sample/mpp-library/MultiPlatformLibrary.podspec b/sample/mpp-library/MultiPlatformLibrary.podspec new file mode 100644 index 0000000..15ea36c --- /dev/null +++ b/sample/mpp-library/MultiPlatformLibrary.podspec @@ -0,0 +1,38 @@ +Pod::Spec.new do |spec| + spec.name = 'MultiPlatformLibrary' + spec.version = '0.1.0' + spec.homepage = 'Link to a Kotlin/Native module homepage' + spec.source = { :git => "Not Published", :tag => "Cocoapods/#{spec.name}/#{spec.version}" } + spec.authors = 'IceRock Development' + spec.license = '' + spec.summary = 'Shared code between iOS and Android' + + spec.vendored_frameworks = "build/cocoapods/framework/#{spec.name}.framework" + spec.libraries = "c++" + spec.module_name = "#{spec.name}_umbrella" + + 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' + } + + spec.script_phases = [ + { + :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" + +MPP_OUTPUT_DIR="$MPP_PROJECT_ROOT/build/cocoapods/framework" +MPP_OUTPUT_NAME="$MPP_OUTPUT_DIR/#{spec.name}.framework" + +"$MPP_PROJECT_ROOT/../gradlew" --configure-on-demand -p "$MPP_PROJECT_ROOT" "$GRADLE_TASK" + SCRIPT + } + ] +end diff --git a/sample/mpp-library/build.gradle.kts b/sample/mpp-library/build.gradle.kts new file mode 100644 index 0000000..5887fd1 --- /dev/null +++ b/sample/mpp-library/build.gradle.kts @@ -0,0 +1,26 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +plugins { + id("com.android.library") + id("org.jetbrains.kotlin.multiplatform") + id("dev.icerock.mobile.multiplatform") + id("kotlin-android-extensions") +} + +android { + compileSdkVersion(Versions.Android.compileSdk) + + defaultConfig { + minSdkVersion(Versions.Android.minSdk) + targetSdkVersion(Versions.Android.targetSdk) + } +} + +setupFramework(exports = emptyList()) + +dependencies { + mppLibrary(Deps.Libs.MultiPlatform.kotlinStdLib) + mppLibrary(Deps.Libs.MultiPlatform.mokoParcelize) +} diff --git a/sample/mpp-library/src/androidMain/AndroidManifest.xml b/sample/mpp-library/src/androidMain/AndroidManifest.xml new file mode 100755 index 0000000..8f69414 --- /dev/null +++ b/sample/mpp-library/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/User.kt b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/User.kt new file mode 100755 index 0000000..f1c41d2 --- /dev/null +++ b/sample/mpp-library/src/commonMain/kotlin/com/icerockdev/library/User.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +package com.icerockdev.library + +import dev.icerock.moko.parcelize.Parcelable +import dev.icerock.moko.parcelize.Parcelize + +@Parcelize +data class User( + val firstName: String, + val lastName: String, + val phone: String, + val age: Int +): Parcelable diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..315f29d --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,24 @@ +/* + * Copyright 2019 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license. + */ + +pluginManagement { + repositories { + jcenter() + google() + + maven { url = uri("https://dl.bintray.com/kotlin/kotlin") } + maven { url = uri("https://kotlin.bintray.com/kotlinx") } + } + resolutionStrategy.eachPlugin { + val module = Deps.plugins[requested.id.id] ?: return@eachPlugin + + useModule(module) + } +} + +enableFeaturePreview("GRADLE_METADATA") + +include(":parcelize") +include(":sample:android-app") +include(":sample:mpp-library")