diff --git a/buildSrc/src/main/kotlin/custom/CustomApp.kt b/buildSrc/src/main/kotlin/custom/CustomApp.kt index 8146610d6..cb125b0a6 100644 --- a/buildSrc/src/main/kotlin/custom/CustomApp.kt +++ b/buildSrc/src/main/kotlin/custom/CustomApp.kt @@ -18,32 +18,55 @@ package custom +import org.json.simple.JSONObject import java.text.ParseException import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +const val dateFormat = "YYYY-MM" + data class CustomApp( val name: String, val url: String, val enforcedLanguage: String, val displayName: String, - val versionName: String = parseVersionNameFromUrlOrUsePattern(url, "YYYY-MM") + val versionName: String, + val disableSideBar: Boolean = false, + val disableTabs: Boolean = false, + val disableReadAloud: Boolean = false ) { - val versionCode: Int = formatDate("YYDDD0").toInt() + constructor(name: String, parsedJson: JSONObject) : this( + name, + parsedJson.getAndCast("zim_url"), + parsedJson.getAndCast("enforced_lang"), + parsedJson.getAndCast("app_name"), + readVersionOrInfer(parsedJson), + parsedJson.getAndCast("disable_sidebar") ?: false, + parsedJson.getAndCast("disable_tabs") ?: false, + parsedJson.getAndCast("disable_read_aloud") ?: false + ) + + val versionCode: Int = formatCurrentDate("YYDDD0").toInt() + + companion object { + private fun readVersionOrInfer(parsedJson: JSONObject) = + (parsedJson.getAndCast("version_name") + ?: versionNameFromUrl(parsedJson.getAndCast("zim_url"))) + ?: formatCurrentDate() + } } -private fun parseVersionNameFromUrlOrUsePattern(url: String, pattern: String) = +private fun versionNameFromUrl(url: String) = url.substringAfterLast("_") .substringBeforeLast(".") .takeIf { try { - SimpleDateFormat(pattern, Locale.ROOT).parse(it) != null + SimpleDateFormat(dateFormat, Locale.ROOT).parse(it) != null } catch (parseException: ParseException) { false } } - ?: formatDate(pattern) -private fun formatDate(pattern: String) = +private fun formatCurrentDate(pattern: String = dateFormat) = Date().let(SimpleDateFormat(pattern, Locale.ROOT)::format) diff --git a/buildSrc/src/main/kotlin/custom/CustomApps.kt b/buildSrc/src/main/kotlin/custom/CustomApps.kt index 6f165054a..31c7351b9 100644 --- a/buildSrc/src/main/kotlin/custom/CustomApps.kt +++ b/buildSrc/src/main/kotlin/custom/CustomApps.kt @@ -24,202 +24,39 @@ import org.json.simple.JSONObject import org.json.simple.parser.JSONParser import java.io.File +typealias ProductFlavors = NamedDomainObjectContainer + object CustomApps { - private val example = CustomApp( - name = "customexample", - url = "http://download.kiwix.org/zim/wikipedia_fr_test.zim", - enforcedLanguage = "en", - displayName = "Test Custom App" - ) - private val phet = CustomApp( - name = "phet", - url = "http://download.kiwix.org/zim/phet/phet_mul_2018-09.zim", - enforcedLanguage = "en", - displayName = "PhET" - ) - private val tunisie = CustomApp( - name = "tunisie", - url = "http://download.kiwix.org/zim/wikipedia_fr_tunisie_novid.zim", - enforcedLanguage = "fr", - versionName = "2018-07", - displayName = "Encyclopédie de la Tunisie" - ) - private val venezuela = CustomApp( - name = "venezuela", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_es_venezuela_2018-07.zim", - enforcedLanguage = "es", - displayName = "Enciclopedia de Venezuela" - ) - private val wikimed = CustomApp( - name = "wikimed", - url = "http://download.kiwix.org/zim/wikipedia_en_medicine_novid.zim", - enforcedLanguage = "en", - versionName = "2018-08", - displayName = "Medical Wikipedia" - ) - private val wikimedar = CustomApp( - name = "wikimedar", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_ar_medicine_novid_2018-08.zim", - enforcedLanguage = "ar", - displayName = "وِيكيبيديا الطبية (بلا اتصال بالانترنت)" - ) - private val wikimedde = CustomApp( - name = "wikimedde", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_de_medicine_novid_2018-10.zim", - enforcedLanguage = "de", - displayName = "Wikipedia Medizin (Offline)" - ) - private val wikimedes = CustomApp( - name = "wikimedes", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_es_medicine_novid_2018-10.zim", - enforcedLanguage = "es", - displayName = "Wikipedia Médica (Offline)" - ) - private val wikimedfa = CustomApp( - name = "wikimedfa", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_fa_medicine_novid_2018-07.zim", - enforcedLanguage = "fa", - displayName = "ویکی‌پدیای پزشکی (آفلاین)" - ) - private val wikimedfr = CustomApp( - name = "wikimedfr", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_fr_medicine_novid_2018-07.zim", - enforcedLanguage = "fr", - displayName = "Wikipédia médicale" - ) - private val wikimedja = CustomApp( - name = "wikimedja", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_ja_medicine_novid_2018-07.zim", - enforcedLanguage = "ja", - displayName = "医療ウィキペディア(オフライン)" - ) - private val wikimedmini = CustomApp( - name = "wikimedmini", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_en_medicine_nodet_2018-07.zim", - enforcedLanguage = "en", - displayName = "Offline WikiMed mini" - ) - private val wikimedor = CustomApp( - name = "wikimedor", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_or_medicine_novid_2018-07.zim", - enforcedLanguage = "or", - displayName = "ମେଡିକାଲ ଉଇକିପିଡିଆ (ଅଫଲାଇନ)" - ) - private val wikimedpt = CustomApp( - name = "wikimedpt", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_pt_medicine_2018-10.zim", - enforcedLanguage = "pt", - displayName = "Wikipédia Médica (Offline)" - ) - private val wikimedzh = CustomApp( - name = "wikimedzh", - url = "http://download.kiwix.org/zim/wikipedia/wikipedia_zh_medicine_novid_2018-07.zim", - enforcedLanguage = "zh", - displayName = "醫學維基百科(離線版)" - ) - private val wikispecies = CustomApp( - name = "wikispecies", - url = "http://download.kiwix.org/zim/wikispecies/wikispecies_en_all_novid_2018-08.zim", - enforcedLanguage = "en", - displayName = "WikiSpecies" - ) - private val wikivoyage = CustomApp( - name = "wikivoyage", - url = "http://download.kiwix.org/zim/wikivoyage/wikivoyage_en_all_novid_2018-10.zim", - enforcedLanguage = "en", - displayName = "Wikivoyage" - ) - private val wikivoyageeurope = CustomApp( - name = "wikivoyageeurope", - url = "http://download.kiwix.org/zim/wikivoyage/wikivoyage_en_europe_novid_2018-10.zim", - enforcedLanguage = "en", - displayName = "Wikivoyage European Travels" - ) - private val wikivoyagede = CustomApp( - name = "wikivoyagede", - url = "http://download.kiwix.org/zim/wikivoyage/wikivoyage_de_all_novid_2018-10.zim", - enforcedLanguage = "de", - displayName = "Wikivoyage auf Deutsch" - ) - private val all = listOf( - example, - phet, - tunisie, - venezuela, - wikimed, - wikimedar, - wikimedde, - wikimedes, - wikimedfa, - wikimedfr, - wikimedja, - wikimedmini, - wikimedor, - wikimedpt, - wikimedzh, - wikispecies, - wikivoyage, - wikivoyageeurope, - wikivoyagede - ) - fun createStatically(productFlavors: NamedDomainObjectContainer) { - productFlavors.create(all) + fun createDynamically(srcFolder: File, productFlavors: ProductFlavors) { + productFlavors.create(customApps(srcFolder)) } - fun createDynamically( - srcFolder: File, - productFlavors: NamedDomainObjectContainer - ) { - productFlavors.create( - srcFolder.walk() - .filter { it.name == "info.json" } - .map { - val parsedJson = JSONParser().parse(it.readText()) as JSONObject - createCustomAppFromJson( - it.parentFile.name, - parsedJson.getAndCast("zim_url"), - parsedJson.getAndCast("enforced_lang"), - parsedJson.getAndCast("app_name"), - parsedJson.getAndCast("version_name") - ) - }.toList() - ) + private fun customApps(srcFolder: File) = srcFolder.walk() + .filter { it.name == "info.json" } + .map { CustomApp(it.parentFile.name, JSONParser().parse(it.readText()) as JSONObject) } + .toList() +} + +fun ProductFlavors.create(customApps: List) { + customApps.forEach { customApp -> + this.create(customApp.name) { + versionName = customApp.versionName + versionCode = customApp.versionCode + applicationIdSuffix = ".kiwixcustom${customApp.name}" + buildConfigField("String", "ZIM_URL", "\"${customApp.url}\"") + buildConfigField("String", "ENFORCED_LANG", "\"${customApp.enforcedLanguage}\"") + buildConfigField("Boolean", "DISABLE_SIDEBAR", "${customApp.disableSideBar}") + buildConfigField("Boolean", "DISABLE_TABS", "${customApp.disableTabs}") + buildConfigField("Boolean", "DISABLE_READ_ALOUD", "${customApp.disableReadAloud}") + configureStrings(customApp.displayName) + } } } -fun NamedDomainObjectContainer.create(customApps: List) { - customApps.forEach(this::create) -} - -private fun createCustomAppFromJson( - name: String, - url: String, - enforcedLanguage: String, - displayName: String, - versionName: String? -) = if (versionName == null) CustomApp(name, url, enforcedLanguage, displayName) -else CustomApp(name, url, enforcedLanguage, displayName, versionName) - fun JSONObject.getAndCast(columnName: String): T = getOrDefault(columnName, null) as T -private fun NamedDomainObjectContainer.create( - customApp: CustomApp -) { - create(customApp.name) { - versionName = customApp.versionName - versionCode = customApp.versionCode - applicationIdSuffix = ".kiwixcustom${customApp.name}" - buildConfigField("String", "ZIM_URL", "\"${customApp.url}\"") - buildConfigField("String", "ENFORCED_LANG", "\"${customApp.enforcedLanguage}\"") - buildConfigField("Boolean", "DISABLE_SIDEBAR", "false") - buildConfigField("Boolean", "DISABLE_READ_ALOUD", "false") - buildConfigField("Boolean", "DISABLE_TABS", "false") - configureStrings(customApp.displayName) - } -} - fun ProductFlavor.configureStrings(appName: String) { resValue("string", "app_name", appName) resValue("string", "app_search_string", "Search $appName") diff --git a/custom/build.gradle.kts b/custom/build.gradle.kts index acb1cb61e..d30e8f6ae 100644 --- a/custom/build.gradle.kts +++ b/custom/build.gradle.kts @@ -21,9 +21,6 @@ android { flavorDimensions("default") productFlavors { - - // Uncomment for static productFlavors - // CustomApps.createStatically(this) CustomApps.createDynamically(project.file("src"), this) all { File("$projectDir/src", "$name/$name.zim").let { diff --git a/custom/src/customexample/info.json b/custom/src/customexample/info.json index 661d4fd4a..495a11431 100644 --- a/custom/src/customexample/info.json +++ b/custom/src/customexample/info.json @@ -1,6 +1,9 @@ { "app_name": "Test Custom App", "zim_url": "http://download.kiwix.org/zim/wikipedia_fr_test.zim", - "enforced_lang": "en" + "enforced_lang": "en", + "disable_sidebar": false, + "disable_tabs": false, + "disable_read_aloud": false }