Skip to content

Commit

Permalink
Merge pull request #66 from icerockdev/#44-file-resource
Browse files Browse the repository at this point in the history
FileResource implementation
  • Loading branch information
Alex009 committed May 5, 2020
2 parents fbaf28f + d037e85 commit 116cd45
Show file tree
Hide file tree
Showing 25 changed files with 399 additions and 32 deletions.
6 changes: 4 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ buildscript {
maven { url = uri("https://dl.bintray.com/icerockdev/plugins") }
}
dependencies {
val libraryPublish: Boolean = properties.containsKey("libraryPublish")

with(Deps.Plugins) {
listOf(
listOfNotNull(
androidApplication,
androidLibrary,
kotlinMultiplatform,
kotlinKapt,
kotlinAndroid,
mokoResources
if(!libraryPublish) mokoResources else null
)
}.let { plugins(it) }
}
Expand Down
4 changes: 2 additions & 2 deletions buildSrc/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ object Versions {
const val minSdk = 16
}

const val kotlin = "1.3.71"
const val kotlin = "1.3.72"

private const val mokoResources = "0.9.1"
private const val mokoResources = "0.10.0"

object Plugins {
const val android = "3.6.2"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package dev.icerock.gradle
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.LibraryPlugin
import com.android.build.gradle.api.AndroidSourceSet
import dev.icerock.gradle.generator.FilesGenerator
import dev.icerock.gradle.generator.FontsGenerator
import dev.icerock.gradle.generator.GenerateMultiplatformResourcesTask
import dev.icerock.gradle.generator.ImagesGenerator
Expand Down Expand Up @@ -85,7 +86,8 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
StringsGenerator.Feature(sourceInfo, iosLocalizationRegion),
PluralsGenerator.Feature(sourceInfo, iosLocalizationRegion),
ImagesGenerator.Feature(sourceInfo),
FontsGenerator.Feature(sourceInfo)
FontsGenerator.Feature(sourceInfo),
FilesGenerator.Feature(sourceInfo)
)
val targets: List<KotlinTarget> = multiplatformExtension.targets.toList()

Expand All @@ -103,7 +105,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
commonSourceSet: KotlinSourceSet,
generatedDir: File,
mrClassPackage: String,
features: List<ResourceGeneratorFeature>,
features: List<ResourceGeneratorFeature<out MRGenerator.Generator>>,
target: Project
) {
val commonGeneratorSourceSet: MRGenerator.SourceSet = createSourceSet(commonSourceSet)
Expand All @@ -121,7 +123,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
androidMainSourceSet: AndroidSourceSet,
generatedDir: File,
mrClassPackage: String,
features: List<ResourceGeneratorFeature>,
features: List<ResourceGeneratorFeature<out MRGenerator.Generator>>,
target: Project
) {
val kotlinSourceSets: List<KotlinSourceSet> = targets
Expand All @@ -144,7 +146,7 @@ class MultiplatformResourcesPlugin : Plugin<Project> {
targets: List<KotlinTarget>,
generatedDir: File,
mrClassPackage: String,
features: List<ResourceGeneratorFeature>,
features: List<ResourceGeneratorFeature<out MRGenerator.Generator>>,
target: Project,
iosLocalizationRegion: String
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.generator

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeSpec
import dev.icerock.gradle.generator.android.AndroidFilesGenerator
import dev.icerock.gradle.generator.common.CommonFilesGenerator
import dev.icerock.gradle.generator.ios.IosFilesGenerator
import org.gradle.api.file.FileTree
import java.io.File

abstract class FilesGenerator(
private val inputFileTree: FileTree
) : MRGenerator.Generator {

private val resourceClass = ClassName("dev.icerock.moko.resources", "FileResource")

override fun generate(resourcesGenerationDir: File): TypeSpec {
val fileSpecs = inputFileTree.map { file ->
FileSpec(
key = processKey(file.nameWithoutExtension),
file = file
)
}.sortedBy { it.key }
val typeSpec = createTypeSpec(fileSpecs)
generateResources(resourcesGenerationDir, fileSpecs)
return typeSpec
}

private fun createTypeSpec(keys: List<FileSpec>): TypeSpec {
val classBuilder = TypeSpec.objectBuilder("files")
@Suppress("SpreadOperator")
classBuilder.addModifiers(*getClassModifiers())

keys.forEach { classBuilder.addProperty(generateFileProperty(it)) }
return classBuilder.build()
}

override fun getImports(): List<ClassName> = emptyList()

private fun generateFileProperty(
fileSpec: FileSpec
): PropertySpec {
@Suppress("SpreadOperator")
return PropertySpec.builder(fileSpec.key, resourceClass)
.addModifiers(*getPropertyModifiers())
.apply {
getPropertyInitializer(fileSpec)?.let { initializer(it) }
}
.build()
}

protected open fun generateResources(
resourcesGenerationDir: File,
files: List<FileSpec>
) {
}

protected fun processKey(key: String): String {
return key.replace("-", "_")
}

abstract fun getClassModifiers(): Array<KModifier>

abstract fun getPropertyModifiers(): Array<KModifier>

abstract fun getPropertyInitializer(fileSpec: FileSpec): CodeBlock?

data class FileSpec(
val key: String,
val file: File
)

class Feature(private val info: SourceInfo) : ResourceGeneratorFeature<FilesGenerator> {
private val fileTree = info.commonResources.matching {
include("MR/files/**")
}

override fun createCommonGenerator(): FilesGenerator {
return CommonFilesGenerator(fileTree)
}

override fun createIosGenerator(): FilesGenerator {
return IosFilesGenerator(fileTree)
}

override fun createAndroidGenerator(): FilesGenerator {
return AndroidFilesGenerator(
fileTree,
info.androidRClassPackage
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,20 +104,20 @@ abstract class FontsGenerator(
val file: File
)

class Feature(private val info: SourceInfo) : ResourceGeneratorFeature {
class Feature(private val info: SourceInfo) : ResourceGeneratorFeature<FontsGenerator> {
private val stringsFileTree = info.commonResources.matching {
include("MR/fonts/**.ttf")
}

override fun createCommonGenerator(): MRGenerator.Generator {
override fun createCommonGenerator(): FontsGenerator {
return CommonFontsGenerator(stringsFileTree)
}

override fun createIosGenerator(): MRGenerator.Generator {
override fun createIosGenerator(): FontsGenerator {
return IosFontsGenerator(stringsFileTree)
}

override fun createAndroidGenerator(): MRGenerator.Generator {
override fun createAndroidGenerator(): FontsGenerator {
return AndroidFontsGenerator(
stringsFileTree,
info.androidRClassPackage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,20 +63,20 @@ abstract class ImagesGenerator(

abstract fun getPropertyInitializer(key: String): CodeBlock?

class Feature(private val info: SourceInfo) : ResourceGeneratorFeature {
class Feature(private val info: SourceInfo) : ResourceGeneratorFeature<ImagesGenerator> {
private val stringsFileTree = info.commonResources.matching {
include("MR/images/**/*.png", "MR/images/**/*.jpg")
}

override fun createCommonGenerator(): MRGenerator.Generator {
override fun createCommonGenerator(): ImagesGenerator {
return CommonImagesGenerator(stringsFileTree)
}

override fun createIosGenerator(): MRGenerator.Generator {
override fun createIosGenerator(): ImagesGenerator {
return IosImagesGenerator(stringsFileTree)
}

override fun createAndroidGenerator(): MRGenerator.Generator {
override fun createAndroidGenerator(): ImagesGenerator {
return AndroidImagesGenerator(
stringsFileTree,
info.androidRClassPackage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,20 +80,20 @@ abstract class PluralsGenerator(
class Feature(
private val info: SourceInfo,
private val iosBaseLocalizationRegion: String
) : ResourceGeneratorFeature {
) : ResourceGeneratorFeature<PluralsGenerator> {
private val stringsFileTree = info.commonResources.matching { include("MR/**/plurals*.xml") }
override fun createCommonGenerator(): MRGenerator.Generator {
override fun createCommonGenerator(): PluralsGenerator {
return CommonPluralsGenerator(stringsFileTree)
}

override fun createIosGenerator(): MRGenerator.Generator {
override fun createIosGenerator(): PluralsGenerator {
return IosPluralsGenerator(
stringsFileTree,
iosBaseLocalizationRegion
)
}

override fun createAndroidGenerator(): MRGenerator.Generator {
override fun createAndroidGenerator(): PluralsGenerator {
return AndroidPluralsGenerator(
stringsFileTree,
info.androidRClassPackage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

package dev.icerock.gradle.generator

interface ResourceGeneratorFeature {
fun createCommonGenerator(): MRGenerator.Generator
fun createIosGenerator(): MRGenerator.Generator
fun createAndroidGenerator(): MRGenerator.Generator
interface ResourceGeneratorFeature<T : MRGenerator.Generator> {
fun createCommonGenerator(): T
fun createIosGenerator(): T
fun createAndroidGenerator(): T
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,20 +75,20 @@ abstract class StringsGenerator(
class Feature(
private val info: SourceInfo,
private val iosBaseLocalizationRegion: String
) : ResourceGeneratorFeature {
) : ResourceGeneratorFeature<StringsGenerator> {
private val stringsFileTree = info.commonResources.matching { include("MR/**/strings*.xml") }
override fun createCommonGenerator(): MRGenerator.Generator {
override fun createCommonGenerator(): StringsGenerator {
return CommonStringsGenerator(stringsFileTree)
}

override fun createIosGenerator(): MRGenerator.Generator {
override fun createIosGenerator(): StringsGenerator {
return IosStringsGenerator(
stringsFileTree,
iosBaseLocalizationRegion
)
}

override fun createAndroidGenerator(): MRGenerator.Generator {
override fun createAndroidGenerator(): StringsGenerator {
return AndroidStringsGenerator(
stringsFileTree,
info.androidRClassPackage
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.generator.android

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.KModifier
import dev.icerock.gradle.generator.FilesGenerator
import org.gradle.api.file.FileTree
import java.io.File
import java.util.Locale

class AndroidFilesGenerator(
inputFileTree: FileTree,
private val androidRClassPackage: String
) : FilesGenerator(
inputFileTree = inputFileTree
) {
override fun getClassModifiers(): Array<KModifier> = arrayOf(KModifier.ACTUAL)

override fun getPropertyModifiers(): Array<KModifier> = arrayOf(KModifier.ACTUAL)

override fun getPropertyInitializer(fileSpec: FileSpec): CodeBlock? {
return CodeBlock.of("FileResource(rawResId = R.raw.%L)", keyToResourceId(fileSpec.key))
}

override fun getImports(): List<ClassName> = listOf(
ClassName(androidRClassPackage, "R")
)

override fun generateResources(
resourcesGenerationDir: File,
files: List<FileSpec>
) {
val targetDir = File(resourcesGenerationDir, "raw")
targetDir.mkdirs()

files.forEach { (key, file) ->
val fileName = keyToResourceId(key) + "." + file.extension
file.copyTo(File(targetDir, fileName))
}
}

private fun keyToResourceId(key: String): String {
return key.toLowerCase(Locale.ROOT)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.generator.common

import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.KModifier
import dev.icerock.gradle.generator.FilesGenerator
import org.gradle.api.file.FileTree

class CommonFilesGenerator(
inputFileTree: FileTree
) : FilesGenerator(
inputFileTree = inputFileTree
) {
override fun getClassModifiers(): Array<KModifier> = emptyArray()

override fun getPropertyModifiers(): Array<KModifier> = emptyArray()

override fun getPropertyInitializer(fileSpec: FileSpec): CodeBlock? = null
}
Loading

0 comments on commit 116cd45

Please sign in to comment.