Skip to content

Commit 7fe5358

Browse files
authored
Merge pull request #34 from icerockdev/develop
Release 0.7.0
2 parents de2b67b + 1f9db6c commit 7fe5358

34 files changed

Lines changed: 725 additions & 174 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Unit tests of Android Sample
2+
3+
on:
4+
pull_request:
5+
branches:
6+
- master
7+
- develop
8+
9+
jobs:
10+
test:
11+
runs-on: macOS-latest
12+
steps:
13+
- name: Checkout
14+
uses: actions/checkout@v2
15+
- name: Build and publish local
16+
run: ./gradlew -PlibraryPublish :gradle-plugin:publishPluginPublicationToMavenLocal :resources:publishToMavenLocal
17+
- name: Sample unit-tests
18+
uses: reactivecircus/android-emulator-runner@v2
19+
with:
20+
api-level: 29
21+
script: ./gradlew connectedAndroidTest

README.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ This is a Kotlin MultiPlatform library that provides access to the resources on
3636
- 0.6.0
3737
- 0.6.1
3838
- 0.6.2
39+
- 0.7.0
3940

4041
## Installation
4142
root build.gradle
@@ -46,7 +47,7 @@ buildscript {
4647
}
4748
4849
dependencies {
49-
classpath "dev.icerock.moko:resources-generator:0.6.2"
50+
classpath "dev.icerock.moko:resources-generator:0.7.0"
5051
}
5152
}
5253
@@ -63,7 +64,7 @@ project build.gradle
6364
apply plugin: "dev.icerock.mobile.multiplatform-resources"
6465
6566
dependencies {
66-
commonMainApi("dev.icerock.moko:resources:0.6.2")
67+
commonMainApi("dev.icerock.moko:resources:0.7.0")
6768
}
6869
6970
multiplatformResources {
@@ -251,6 +252,23 @@ We got autogenerated `MR.images.home_black_18` `ImageResource` in code, that we
251252
- Android: `imageView.setImageResource(image.drawableResId)`
252253
- iOS: `imageView.image = image.toUIImage()`
253254

255+
### Example 7 - pass font
256+
Fonts resources directory is `commonMain/resources/MR/fonts`.
257+
Font name should be this pattern: `<fontFamily>-<fontStyle>` like:
258+
- `Raleway-Bold.ttf`
259+
- `Raleway-Regular.ttf`
260+
- `Raleway-Italic.ttf`
261+
Supported only `ttf` resources for now.
262+
263+
If we add to `commonMain/resources/MR/images` files:
264+
- `Raleway-Bold.ttf`
265+
- `Raleway-Regular.ttf`
266+
- `Raleway-Italic.ttf`
267+
268+
We got autogenerated `MR.fonts.Raleway.italic`, `MR.fonts.Raleway.regular`, `MR.fonts.Raleway.bold` `FontResource` in code, that we can use:
269+
- Android: `textView.typeface = font.getTypeface(context = this)`
270+
- iOS: `textView.font = font.uiFont(withSize: 14.0)`
271+
254272
## Samples
255273
Please see more examples in the [sample directory](sample).
256274

buildSrc/src/main/kotlin/Deps.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ object Deps {
2020
val appCompat = AndroidLibrary(
2121
name = "androidx.appcompat:appcompat:${Versions.Libs.Android.appCompat}"
2222
)
23+
24+
object AndroidTest {
25+
val espressoCore = AndroidLibrary(
26+
name = "androidx.test.espresso:espresso-core:${Versions.Libs.Android.AndroidTest.espressoCore}"
27+
)
28+
val testRunner = AndroidLibrary(
29+
name = "androidx.test:runner:${Versions.Libs.Android.AndroidTest.testRunner}"
30+
)
31+
val testRules = AndroidLibrary(
32+
name = "androidx.test:rules:${Versions.Libs.Android.AndroidTest.testRunner}"
33+
)
34+
val testExtJunit = AndroidLibrary(
35+
name = "androidx.test.ext:junit:${Versions.Libs.Android.AndroidTest.testExtJunit}"
36+
)
37+
}
2338
}
2439

2540
object MultiPlatform {

buildSrc/src/main/kotlin/Versions.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ object Versions {
1111

1212
const val kotlin = "1.3.61"
1313

14-
private const val mokoResources = "0.6.2"
14+
private const val mokoResources = "0.7.0"
1515

1616
object Plugins {
1717
const val android = "3.5.2"
@@ -23,6 +23,12 @@ object Versions {
2323
object Libs {
2424
object Android {
2525
const val appCompat = "1.1.0"
26+
27+
object AndroidTest {
28+
const val espressoCore = "3.2.0"
29+
const val testRunner = "1.2.0"
30+
const val testExtJunit = "1.1.1"
31+
}
2632
}
2733

2834
object MultiPlatform {

gradle-plugin/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt

Lines changed: 42 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,11 @@
55
package dev.icerock.gradle
66

77
import com.android.build.gradle.LibraryExtension
8-
import dev.icerock.gradle.generator.AndroidMRGenerator
9-
import dev.icerock.gradle.generator.CommonMRGenerator
10-
import dev.icerock.gradle.generator.IosMRGenerator
11-
import dev.icerock.gradle.generator.MRGenerator
12-
import dev.icerock.gradle.generator.image.AndroidImagesGenerator
13-
import dev.icerock.gradle.generator.image.CommonImagesGenerator
14-
import dev.icerock.gradle.generator.image.IosImagesGenerator
15-
import dev.icerock.gradle.generator.plurals.AndroidPluralsGenerator
16-
import dev.icerock.gradle.generator.plurals.CommonPluralsGenerator
17-
import dev.icerock.gradle.generator.plurals.IosPluralsGenerator
18-
import dev.icerock.gradle.generator.strings.AndroidStringsGenerator
19-
import dev.icerock.gradle.generator.strings.CommonStringsGenerator
20-
import dev.icerock.gradle.generator.strings.IosStringsGenerator
8+
import dev.icerock.gradle.generator.*
9+
import dev.icerock.gradle.generator.fonts.FontsGeneratorFeature
10+
import dev.icerock.gradle.generator.image.ImagesGeneratorFeature
11+
import dev.icerock.gradle.generator.plurals.PluralsGeneratorFeature
12+
import dev.icerock.gradle.generator.strings.StringsGeneratorFeature
2113
import org.gradle.api.Plugin
2214
import org.gradle.api.Project
2315
import org.gradle.api.file.FileTree
@@ -57,16 +49,6 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
5749
sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
5850
val commonResources = commonSourceSet.resources
5951

60-
val strings = commonResources.matching {
61-
include("MR/**/strings.xml")
62-
}
63-
val plurals = commonResources.matching {
64-
include("MR/**/plurals.xml")
65-
}
66-
val images = commonResources.matching {
67-
include("MR/images/**/*.png", "MR/images/**/*.jpg")
68-
}
69-
7052
val androidExtension = target.extensions.getByType(LibraryExtension::class)
7153
val mainAndroidSet = androidExtension.sourceSets.getByName("main")
7254
val manifestFile = mainAndroidSet.manifest.srcFile
@@ -75,9 +57,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
7557

7658
generateMultiplatformResources(
7759
project = target,
78-
stringsFileTree = strings,
79-
pluralsFileTree = plurals,
80-
imagesFileTree = images,
60+
commonResources = commonResources,
8161
sourceSets = sourceSets.filter { it.name.endsWith("Main") },
8262
extension = mrExtension,
8363
multiplatformExtension = multiplatformExtension,
@@ -99,9 +79,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
9979

10080
private fun generateMultiplatformResources(
10181
project: Project,
102-
stringsFileTree: FileTree,
103-
pluralsFileTree: FileTree,
104-
imagesFileTree: FileTree,
82+
commonResources: FileTree,
10583
sourceSets: List<KotlinSourceSet>,
10684
extension: MultiplatformResourcesPluginExtension,
10785
multiplatformExtension: KotlinMultiplatformExtension,
@@ -110,15 +88,23 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
11088
val generatedDir = File(project.buildDir, "generated/moko")
11189

11290
sourceSets.forEach { sourceSet ->
91+
val sourceInfo = SourceInfo(
92+
generatedDir,
93+
sourceSet,
94+
commonResources,
95+
extension.multiplatformResourcesPackage!!,
96+
androidPackage
97+
)
98+
val features = listOf(
99+
StringsGeneratorFeature(sourceInfo),
100+
PluralsGeneratorFeature(sourceInfo),
101+
ImagesGeneratorFeature(sourceInfo),
102+
FontsGeneratorFeature(sourceInfo)
103+
)
113104
val generator = createGenerator(
114105
multiplatformExtension = multiplatformExtension,
115-
generatedDir = generatedDir,
116-
sourceSet = sourceSet,
117-
stringsFileTree = stringsFileTree,
118-
pluralsFileTree = pluralsFileTree,
119-
imagesFileTree = imagesFileTree,
120-
mrClassPackage = extension.multiplatformResourcesPackage!!,
121-
androidRClassPackage = androidPackage
106+
info = sourceInfo,
107+
features = features
122108
) ?: return@forEach
123109

124110
generator.apply(project = project)
@@ -127,52 +113,40 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
127113

128114
private fun createGenerator(
129115
multiplatformExtension: KotlinMultiplatformExtension,
130-
generatedDir: File,
131-
sourceSet: KotlinSourceSet,
132-
stringsFileTree: FileTree,
133-
pluralsFileTree: FileTree,
134-
imagesFileTree: FileTree,
135-
mrClassPackage: String,
136-
androidRClassPackage: String
116+
info: SourceInfo,
117+
features: List<ResourceGeneratorFeature>
137118
): MRGenerator? {
138-
if (sourceSet.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
139-
return createCommonGenerator(
140-
generatedDir = generatedDir,
141-
sourceSet = sourceSet,
142-
stringsFileTree = stringsFileTree,
143-
pluralsFileTree = pluralsFileTree,
144-
imagesFileTree = imagesFileTree,
145-
mrClassPackage = mrClassPackage
119+
if (info.sourceSet.name == KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) {
120+
return CommonMRGenerator(
121+
info.generatedDir,
122+
info.sourceSet,
123+
info.mrClassPackage,
124+
generators = features.map { it.createCommonGenerator() }
146125
)
147126
}
148127

149128
val target = multiplatformExtension.targets.firstOrNull { target ->
150129
val sourceSets = target.compilations.flatMap { it.kotlinSourceSets }
151-
sourceSets.any { it == sourceSet }
130+
sourceSets.any { it == info.sourceSet }
152131
} ?: return null
153132

154133
return when (target) {
155134
is KotlinAndroidTarget -> {
156-
createAndroidGenerator(
157-
generatedDir = generatedDir,
158-
sourceSet = sourceSet,
159-
stringsFileTree = stringsFileTree,
160-
pluralsFileTree = pluralsFileTree,
161-
imagesFileTree = imagesFileTree,
162-
mrClassPackage = mrClassPackage,
163-
androidRClassPackage = androidRClassPackage
135+
AndroidMRGenerator(
136+
info.generatedDir,
137+
info.sourceSet,
138+
info.mrClassPackage,
139+
generators = features.map{ it.createAndroidGenerator() }
164140
)
165141
}
166142
is KotlinNativeTarget -> {
167143
val family = target.konanTarget.family
168144
if (family == Family.IOS) {
169-
createIosGenerator(
170-
generatedDir = generatedDir,
171-
sourceSet = sourceSet,
172-
stringsFileTree = stringsFileTree,
173-
pluralsFileTree = pluralsFileTree,
174-
imagesFileTree = imagesFileTree,
175-
mrClassPackage = mrClassPackage
145+
IosMRGenerator(
146+
info.generatedDir,
147+
info.sourceSet,
148+
info.mrClassPackage,
149+
generators = features.map{ it.createiOSGenerator() }
176150
)
177151
} else {
178152
println("unsupported native family $family")
@@ -185,95 +159,5 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
185159
}
186160
}
187161
}
188-
189-
private fun createCommonGenerator(
190-
generatedDir: File,
191-
sourceSet: KotlinSourceSet,
192-
stringsFileTree: FileTree,
193-
imagesFileTree: FileTree,
194-
pluralsFileTree: FileTree,
195-
mrClassPackage: String
196-
): MRGenerator {
197-
return CommonMRGenerator(
198-
generatedDir = generatedDir,
199-
sourceSet = sourceSet,
200-
mrClassPackage = mrClassPackage,
201-
generators = listOf(
202-
CommonStringsGenerator(
203-
sourceSet = sourceSet,
204-
stringsFileTree = stringsFileTree
205-
),
206-
CommonPluralsGenerator(
207-
sourceSet = sourceSet,
208-
pluralsFileTree = pluralsFileTree
209-
),
210-
CommonImagesGenerator(
211-
sourceSet = sourceSet,
212-
inputFileTree = imagesFileTree
213-
)
214-
)
215-
)
216-
}
217-
218-
private fun createAndroidGenerator(
219-
generatedDir: File,
220-
sourceSet: KotlinSourceSet,
221-
stringsFileTree: FileTree,
222-
pluralsFileTree: FileTree,
223-
imagesFileTree: FileTree,
224-
mrClassPackage: String,
225-
androidRClassPackage: String
226-
): MRGenerator {
227-
return AndroidMRGenerator(
228-
generatedDir = generatedDir,
229-
sourceSet = sourceSet,
230-
mrClassPackage = mrClassPackage,
231-
generators = listOf(
232-
AndroidStringsGenerator(
233-
sourceSet = sourceSet,
234-
stringsFileTree = stringsFileTree,
235-
androidRClassPackage = androidRClassPackage
236-
),
237-
AndroidPluralsGenerator(
238-
sourceSet = sourceSet,
239-
pluralsFileTree = pluralsFileTree,
240-
androidRClassPackage = androidRClassPackage
241-
),
242-
AndroidImagesGenerator(
243-
sourceSet = sourceSet,
244-
inputFileTree = imagesFileTree,
245-
androidRClassPackage = androidRClassPackage
246-
)
247-
)
248-
)
249-
}
250-
251-
private fun createIosGenerator(
252-
generatedDir: File,
253-
sourceSet: KotlinSourceSet,
254-
stringsFileTree: FileTree,
255-
pluralsFileTree: FileTree,
256-
imagesFileTree: FileTree,
257-
mrClassPackage: String
258-
): MRGenerator {
259-
return IosMRGenerator(
260-
generatedDir = generatedDir,
261-
sourceSet = sourceSet,
262-
mrClassPackage = mrClassPackage,
263-
generators = listOf(
264-
IosStringsGenerator(
265-
sourceSet = sourceSet,
266-
stringsFileTree = stringsFileTree
267-
),
268-
IosPluralsGenerator(
269-
sourceSet = sourceSet,
270-
pluralsFileTree = pluralsFileTree
271-
),
272-
IosImagesGenerator(
273-
sourceSet = sourceSet,
274-
inputFileTree = imagesFileTree
275-
)
276-
)
277-
)
278-
}
279162
}
163+

0 commit comments

Comments
 (0)