All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.ubique.gradle.ubdiag.IconOverlayTask.groovy Maven / Gradle / Ivy

package ch.ubique.gradle.ubdiag

import com.android.build.api.dsl.AndroidSourceSet
import com.android.build.gradle.AppExtension
import com.android.build.gradle.BaseExtension
import com.android.build.gradle.api.ApplicationVariant
import com.android.builder.model.ProductFlavor
import groovy.io.FileType
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.ProjectDependency

import java.nio.file.Files
import java.nio.file.StandardCopyOption

class IconOverlayTask {

	static Task create(Project project, AppExtension android, ApplicationVariant variant, File targetWebIcon) {

		String taskName = "overlayIcon${variant.name.capitalize()}"

		return project.task(taskName).doFirst {
			File moduleDir = new File(project.rootDir, project.name)

			long gradleLastModified = Math.max(
					new File(moduleDir, "build.gradle").lastModified(),
					new File(project.rootDir, "build.gradle").lastModified()
			)

			File generatedResDir = new File("${project.buildDir}/generated/res/launcher-icon/")

			// get banner label
			ProductFlavor flavor = variant.productFlavors[0]
			Boolean defaultLabelEnabled = android.defaultConfig.launcherIconLabelEnabled
			Boolean flavorLabelEnabled = flavor.launcherIconLabelEnabled
			String bannerLabel
			if (flavorLabelEnabled
					|| flavorLabelEnabled == null && defaultLabelEnabled
					|| flavorLabelEnabled == null && defaultLabelEnabled == null && !flavor.name.startsWith("prod")
			) {
				if (flavor.launcherIconLabel != null) {
					bannerLabel = flavor.launcherIconLabel
				} else {
					bannerLabel = variant.flavorName
				}
			} else {
				bannerLabel = null
			}

			File manifestFile = ManifestUtils.getMergedManifestFile(project, variant)

			List androidModules = project.configurations*.dependencies
					*.findAll { it instanceof ProjectDependency }
					.flatten()
					.collect { it.dependencyProject }
					.unique()
					.collect { it.extensions.findByType(BaseExtension) }
					.findAll { it != null }

			List resDirs = androidModules
					.collect { [it.sourceSets.findByName(variant.flavorName), it.sourceSets.findByName("main")] }
					.flatten()
					.findAll { it != null }
					.collect { AndroidSourceSet ass -> ass.res.srcDirs }
					.flatten()
					.findAll { File file -> !file.path.contains("generated") }

			println("$taskName: resource directories: " + resDirs)

			List allIcons = IconUtils.findIcons(resDirs, manifestFile)

			if (targetWebIcon != null) {
				targetWebIcon.delete()

				// search for web icon source
				File webIconSource = ((new File(moduleDir, "src/${variant.flavorName}").listFiles() ?: new File[0]) +
						(new File(moduleDir, "src/main").listFiles() ?: new File[0]) +
						(moduleDir.listFiles() ?: new File[0])).find {
					it.name.matches(".*(web|playstore|512)\\.(png|webp)")
				}

				if (webIconSource == null) {
					// set fallbackWebIcon
					webIconSource = IconUtils.findLargestIcon(allIcons)
				}

				if (webIconSource == null) {
					println("$taskName: web icon source not found")
				} else if (bannerLabel == null || bannerLabel.empty) {
					// no label so we only copy the sourceIcon and use this
					println("$taskName: web icon: $webIconSource")
					Files.copy(webIconSource.toPath(), targetWebIcon.toPath())
				} else {
					println("$taskName: web icon: $webIconSource")
					IconUtils.drawLabel(webIconSource, targetWebIcon, bannerLabel, false)
				}
			}

			if (bannerLabel == null || bannerLabel.empty) {
				// no label
				println("$taskName: skipped icon labelling")
				return
			}

			allIcons.each { File original ->
				String resTypeName = original.parentFile.name
				String originalBaseName = original.name.takeBefore(".")
				File targetDir = new File("${generatedResDir.toString()}/${variant.flavorName}/${variant.buildType.name}/$resTypeName")
				File modified = targetDir.listFiles({ File file -> file.name.matches("${originalBaseName}\\.[^.]+") } as FileFilter)?.find() as File
				if (modified != null && original.lastModified() <= modified.lastModified() && gradleLastModified <= modified.lastModified()) return
				println("$taskName: found modified launcher icon: " + original.absolutePath)
				File target = new File(targetDir, original.name)
				targetDir.mkdirs()
				Files.copy(original.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING)
				IconUtils.createLayeredLabel(target, bannerLabel, originalBaseName.endsWith("_foreground"))
			}
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy