Add a different ribbon to each of your Android app variants using this gradle plugin. Of course, configure it as you will

Overview

Easylauncher gradle plugin for Android

Modify the launcher icon of each of your app-variants using simple gradle rules. Add ribbons of any color, overlay your own images, change the colors of the icon, ...

Usage

Basic usage

// in build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.akaita.android:easylauncher:1.3.1'
    }
}
// in app/build.gradle
apply plugin: 'com.akaita.android.easylauncher'

Adaptive launcher icons (Android 8.0+)

Additionally to the set up from Basic usage, you need to tell the plugin what the name of the foreground layer is:

// in app/build.gradle
easylauncher {
    foregroundIconNames "@mipmap/ic_launcher_foreground" // Foreground of adaptive launcher icon
}

Warning: please not that easylauncher doesn't yet support vector drawables. Please feel free to contribute a PR solving the issue https://github.com/akaita/easylauncher-gradle-plugin/issues/9

Advanced usage

You can customize the filters applied to each type, flavor and variant of your app.

Imagin these are the type and flavors of your app:

// in app/build.gradle
android {
    buildTypes {
        debug {
            //Debuggable, will get a default ribbon in the launcher icon
        }
        beta {
            //Debuggable, will get a default ribbon in the launcher icon
            debuggable true
        }
        canary {
            //Non-debuggable, will not get any default ribbon
            debuggable false
        }
        release {
            //Non-debuggable, will not get any default ribbon
        }
    }
    productFlavors {
        local {}
        qa {}
        staging {}
        production {}
    }
}

You could customize the plugin's behaviour like this:

easylauncher {
    // "manifest application[android:icon]" is automatically added to the list
    iconNames "@mipmap/ic_launcher_foreground" // Traditional launcher icon
    foregroundIconNames "@mipmap/ic_launcher_foreground" // Foreground of adaptive launcher icon
    
    defaultFlavorNaming = true // Use flavor name for default ribbon, instead of the type name
    
    productFlavors {
        local {}
        qa {
            // Add one more filter to all `qa` variants
            filters = redRibbonFilter()
        }
        staging {}
        production {}
    }
    
    buildTypes {
        beta {
            // Add two more filters to all `beta` variants
            filters = [
                    customColorRibbonFilter("#0000FF"),
                    overlayFilter(new File("example-custom/launcherOverlay/beta.png"))
            ]
        }
        canary {
            // Remove ALL filters to `canary` variants
            enable false
        }
        release {}
    }
    
    variants {
        productionDebug {
            // OVERRIDE all previous filters defined for `productionDebug` variant
            filters = orangeRibbonFilter("custom")
        }
    }
}

Available filters

Grayscale filter

Command Result
grayscaleFilter()

Overlay filter

Command Result
overlayFilter(new File("example-custom/launcherOverlay/beta.png"))

Ribbon filters

Filter Command Result
Gray ribbon grayRibbonFilter()
Green ribbon greenRibbonFilter()
Yellow ribbon yellowRibbonFilter()
Orange ribbon orangeRibbonFilter()
Red ribbon redRibbonFilter()
Blue ribbon blueRibbonFilter()

Advanced Ribbon filter

Description Command Result
Custom background color customColorRibbonFilter("#6600CC")
Custom label customColorRibbonFilter("label", "#DCDCDC")
Custom text color customColorRibbonFilter("label", "#DCDCDC", "#000000")
Custom gravity - Top customColorRibbonFilter("custom", "#556600CC", "#FFFFFF", "top")
Custom gravity - Bottom customColorRibbonFilter("custom", "#556600CC", "#FFFFFF", "bottom")
Custom gravity - TopLeft customColorRibbonFilter("custom", "#556600CC", "#FFFFFF", "topLeft")
Custom gravity - TopRight customColorRibbonFilter("custom", "#556600CC", "#FFFFFF", "topRight")
Custom text size (relative to the icon size) customColorRibbonFilter("custom", "#556600CC", "#FFFFFF", "bottom", 0.2)

Available options

  • iconNames: list of icons to modify (already includes "manifest application[android:icon]")
  • foregroundIconNames: list of adaptive icons to modify
  • defaultFlavorNaming: use flavor name in default ribbons, instead of using buildType
  • enable: enable/disable all filters for a flavor/type/variant
  • productFlavors: define filters for flavors (will be added to filters defined for types)
  • buildTypes: define filters for types (will be added to filter defined for flavors)
  • variants: define filters for variants (will override any other filters)

Project Structure

plugin/          - Gradle plugin
example-simple/  - Example Android application using easylauncher with the default behaviour
example-custom/  - Example Android application using easylauncher with the custom configuration
buildSrc/        - Helper module to use this plugin in example modules
icons/           - Examples of icons generated by this plugin

Contributing

You can already see my plans for the plugin in the project's Issues section.

Still, I'm open to feature-requests and suggestions.
Of course, a PR is the best way to get something you want into the plugin ;)

Credits

Easylauncher started as an extension of Fuji Goro's ribbonizer plugin. As it evolved, I decided it changed enough to be worth releasing as a separate plugin.

Comments
  • Gradle ignores customizations

    Gradle ignores customizations

    I've used this config, and plugin still generates only default green ribbon.

    apply plugin: 'com.akaita.android.easylauncher'
    
    ...
    
    easylauncher {
        iconNames "@ mipmap/ic_launcher"  // there is no space after @
        foregroundIconNames "@ mipmap/ic_launcher_foreground" 
        productFlavors {
            useTest {
                filters = orangeRibbonFilter()
            }
    
            useProd {
                filters = redRibbonFilter()
            }
    
            withoutAppsee {
    
            }
    
            withAppsee {
                filters = overlayFilter(new File("app/launcherOverlay/appsee.png"))
            }
        }
    }
    
    opened by przemek-baranowski 10
  • Android 8.0.0

    Android 8.0.0

    I really like the plugin but I can't make it work on Android 8.0.0 I have zero problems on previous versions. It compiles perfectly but the icon doesn't change.

    Thank you

    opened by varo610 7
  • Duplicate Resources

    Duplicate Resources

    Seems that the generated icons conflict with the original icons: I get the following error:

    [mipmap-mdpi-v4/ic_launcher] /Users/adrian/Repos/client/app/src/appMobileDebug/res/mipmap-mdpi/ic_launcher.png        [mipmap-mdpi-v4/ic_launcher] /Users/adrian/Repos/client/app/build/generated/ribbonizer/res/appMobileDebug/mipmap-mdpi/ic_launcher.png: Error: Duplicate resources
    
    invalid 
    opened by adrianrdzv 6
  • Ribbon is not added to API 26 adaptive-icon

    Ribbon is not added to API 26 adaptive-icon

    Hi! I tried out the plugin and it works great on devices with Nougat or lower, but it doesn't work with adaptive icons on Oreo. I only have debug and release build types, and I added this block in app/build.gradle right below the android block:

    easylauncher {
        iconNames "@mipmap/ic_launcher_foreground" 
        foregroundIconNames "@mipmap/ic_launcher_foreground" 
    }
    

    Is the plugin meant to support adaptive icons? Cheers!

    opened by eduardb 6
  • Could not find method grayscaleFilter()

    Could not find method grayscaleFilter()

    I am unable to sync the gradle , keep getting this error "Could not find method grayscaleFilter() for arguments [] on BuildType_Decorated{name=debug, debuggable=true, testCoverageEnabled=false, jniDebuggable=false, pseudoLocalesEnabled=false, renderscriptDebuggable=false, ....".

    My configuration:

    easylauncher {
            iconNames "@mipmap/ic_launcher_foreground" // Traditional launcher icon
            foregroundIconNames "@mipmap/ic_launcher_foreground" // Foreground of adaptive launcher icon
            defaultFlavorNaming = true // Use flavor name for default ribbon, instead of the type name
    
            buildTypes {
                debug {
                    filters = grayscaleFilter()
                }
                staging {
                    filters = [
                            customColorRibbonFilter("Staging", "#E65100")
                    ]
                }
            }
        }
    
    opened by vipulasri 5
  • Minor issues

    Minor issues

    Hi,

    there were some typos and bugs in your code. I took the liberty to fix them for you. 😉

    Well, actually, Feram did it. It’s a tool that we developed to fix our own code. If you want to use it as well, it’s really simple to integrate: feram.io/help/getting-started

    Hope you like it! 😁

    opened by adius 5
  • Use flavor name instead of build type for ribbon text

    Use flavor name instead of build type for ribbon text

    In our project, the build type doesn't really matter because the only debuggable builds are of the debug build type. However, we have a number of flavors used just for development and that's where the real value of easylauncher is for us. Can there be an option to show the flavor instead of build type?

    opened by gpeal 4
  • Updated to support Top and Bottom layout gravities.

    Updated to support Top and Bottom layout gravities.

    You can now make the banner display on the top and bottom and by default will remain at the top left corner as it has been. README.md has been updated with example details.

    Please review A.S.A.P. Thanks.

    opened by ka05 3
  • Apply ribbon to build type that not is in your list of build types

    Apply ribbon to build type that not is in your list of build types

    Hi,

    I have debug, qa and release build types. For "debug" build type is work perfectly but for "qa" no ((

    I have multi flavored app and each flavor is another application version. I cannot use "qa" as flavor because every flavored application need to have debug, qa and release versions.

    Thanks!

    opened by ghost 3
  • Can't use any filter, but works when default

    Can't use any filter, but works when default

    Android Studio 3.2 Canary 3 Build #AI-173.4595177, built on February 9, 2018 JRE: 1.8.0_152-release-1024-b02 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0

    Plugin works without any costomizations. When Just add dependencies and apply plugin it works as expected. But when I try to use:

    productFlavors {
      dev {
                filters = grayscaleFilter()
    }}
    

    We use for API 26+ adaptive icons, but not SVG.

    or any other color filter it crash while gradle sync or clean project on:

    PS D:\Projects\BudgetBakers\wallet-android> ./gradlew clean --stacktrace
    Parallel execution with configuration on demand is an incubating feature.
    
    > Configure project :mobile 
    WARNING: Configuration 'debugCompile' is obsolete and has been replaced with 'debugImplementation'.
    It will be removed at the end of 2018
    WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation'.
    It will be removed at the end of 2018
    
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Build file 'D:\Projects\BudgetBakers\wallet-android\mobile\build.gradle' line: 116
    
    * What went wrong:
    A problem occurred evaluating project ':mobile'.
    > Could not find method grayscaleFilter() for arguments [] on ProductFlavor_Decorated{name=dev, dimension=buildInfra, minSdkVersion=null, targetSdkVersion=null, renderscriptTargetApi=null, renderscriptSupportMod
    eEnabled=null, renderscriptSupportModeBlasEnabled=null, renderscriptNdkModeEnabled=null, versionCode=null, versionName=null, applicationId=null, testApplicationId=null, testInstrumentationRunner=null, testInstru
    mentationRunnerArguments={}, testHandleProfiling=null, testFunctionalTest=null, signingConfig=null, resConfig=[cs, ar, en], mBuildConfigFields={}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mMa
    nifestPlaceholders={}, mWearAppUnbundled=null} of type com.android.build.gradle.internal.dsl.ProductFlavor.
    
    * Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.GradleScriptException: A problem occurred evaluating project ':mobile'.
            at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:92)
            at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl$2.run(DefaultScriptPluginFactory.java:204)
            at org.gradle.configuration.ProjectScriptTarget.addConfiguration(ProjectScriptTarget.java:77)
            at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:209)
            at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:61)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
            at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:58)
            at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:41)
            at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:26)
            at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:34)
            at org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure(LifecycleProjectEvaluator.java:64)
            at org.gradle.configuration.project.LifecycleProjectEvaluator.access$100(LifecycleProjectEvaluator.java:34)
            at org.gradle.configuration.project.LifecycleProjectEvaluator$ConfigureProject.run(LifecycleProjectEvaluator.java:110)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
            at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:50)
            at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:667)
            at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:136)
            at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
            at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
            at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:100)
            at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:81)
            at org.gradle.execution.commandline.CommandLineTaskParser.parseTasks(CommandLineTaskParser.java:42)
            at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:44)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
            at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
            at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
            at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36)
            at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraph.run(DefaultGradleLauncher.java:268)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
            at org.gradle.initialization.DefaultGradleLauncher.constructTaskGraph(DefaultGradleLauncher.java:175)
            at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:130)
            at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:109)
            at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78)
            at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75)
            at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
            at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100)
            at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75)
            at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
            at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
            at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
            at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
            at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:49)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:32)
            at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
            at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
            at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
            at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
            at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:57)
            at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
            at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
            at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
            at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
            at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64)
            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29)
            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:45)
            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
            at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
            at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
            at org.gradle.util.Swapper.swap(Swapper.java:38)
            at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
            at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
            at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
            at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
            at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
            at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    Caused by: org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException: Could not find method grayscaleFilter() for arguments [] on ProductFlavor_Decorated{name=dev, dimension=buildI
    nfra, minSdkVersion=null, targetSdkVersion=null, renderscriptTargetApi=null, renderscriptSupportModeEnabled=null, renderscriptSupportModeBlasEnabled=null, renderscriptNdkModeEnabled=null, versionCode=null, versi
    onName=null, applicationId=null, testApplicationId=null, testInstrumentationRunner=null, testInstrumentationRunnerArguments={}, testHandleProfiling=null, testFunctionalTest=null, signingConfig=null, resConfig=[c
    s, ar, en], mBuildConfigFields={}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mManifestPlaceholders={}, mWearAppUnbundled=null} of type com.android.build.gradle.internal.dsl.ProductFlavor.
            at org.gradle.internal.metaobject.AbstractDynamicObject.methodMissingException(AbstractDynamicObject.java:179)
            at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:87)
            at build_aw1vchsx871ya8c8fw045t7rl$_run_closure3$_closure9$_closure17.doCall(D:\Projects\BudgetBakers\wallet-android\mobile\build.gradle:116)
            at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
            at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
            at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
            at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
            at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:69)
            at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:62)
            at org.gradle.api.internal.NamedDomainObjectContainerConfigureDelegate._configure(NamedDomainObjectContainerConfigureDelegate.java:39)
            at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:66)
            at build_aw1vchsx871ya8c8fw045t7rl$_run_closure3$_closure9.doCall(D:\Projects\BudgetBakers\wallet-android\mobile\build.gradle:108)
            at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
            at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
            at org.gradle.util.ConfigureUtil.configureSelf(ConfigureUtil.java:148)
            at org.gradle.api.internal.AbstractNamedDomainObjectContainer.configure(AbstractNamedDomainObjectContainer.java:79)
            at org.gradle.api.internal.AbstractNamedDomainObjectContainer.configure(AbstractNamedDomainObjectContainer.java:34)
            at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:104)
            at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
            at com.android.build.gradle.BaseExtension.productFlavors(BaseExtension.java:397)
            at com.android.build.gradle.AppExtension_Decorated.productFlavors(Unknown Source)
            at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:479)
            at org.gradle.internal.metaobject.BeanDynamicObject.tryInvokeMethod(BeanDynamicObject.java:191)
            at org.gradle.internal.metaobject.CompositeDynamicObject.tryInvokeMethod(CompositeDynamicObject.java:98)
            at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.tryInvokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
            at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:57)
            at build_aw1vchsx871ya8c8fw045t7rl$_run_closure3.doCall(D:\Projects\BudgetBakers\wallet-android\mobile\build.gradle:100)
            at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
            at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
            at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
            at org.gradle.util.ConfigureUtil$1.execute(ConfigureUtil.java:123)
            at org.gradle.api.internal.plugins.ExtensionsStorage$ExtensionHolder.configure(ExtensionsStorage.java:183)
            at org.gradle.api.internal.plugins.ExtensionsStorage.configureExtension(ExtensionsStorage.java:67)
            at org.gradle.api.internal.plugins.DefaultConvention.configureExtension(DefaultConvention.java:399)
            at org.gradle.api.internal.plugins.DefaultConvention.access$500(DefaultConvention.java:45)
            at org.gradle.api.internal.plugins.DefaultConvention$ExtensionsDynamicObject.tryInvokeMethod(DefaultConvention.java:336)
            at org.gradle.internal.metaobject.CompositeDynamicObject.tryInvokeMethod(CompositeDynamicObject.java:98)
            at org.gradle.internal.metaobject.MixInClosurePropertiesAsMethodsDynamicObject.tryInvokeMethod(MixInClosurePropertiesAsMethodsDynamicObject.java:30)
            at org.gradle.groovy.scripts.BasicScript$ScriptDynamicObject.tryInvokeMethod(BasicScript.java:134)
            at org.gradle.internal.metaobject.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:160)
            at org.gradle.groovy.scripts.BasicScript.invokeMethod(BasicScript.java:83)
            at build_aw1vchsx871ya8c8fw045t7rl.run(D:\Projects\BudgetBakers\wallet-android\mobile\build.gradle:68)
            at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:90)
            ... 106 more
    
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 1s
    PS D:\Projects\BudgetBakers\wallet-android>
    
    opened by mtrakal 3
  • Support gradle up to date

    Support gradle up to date

    #Note: This is based on the dependency update PR (#47). So please merge that first. And if you start to review this before that PR is merged please ignore all gradle changes.

    #Changes:

    • Annotate task input params and output params to tell Gradle when it is cachable
    • Make small changes to be able to serialize the task params

    #Fix first:

    • [ ] I should use a relative path instead of the absolute - otherwise remote cache will not work
    opened by emartynov 2
  • Upcoming incompatibility with Gradle 7

    Upcoming incompatibility with Gradle 7

    I was just running a build with full warning output and got this warnings:

    > Task :app:easylauncherGoogleBetaRelease
    Property 'androidManifestFiles' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'filters' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'foregroundIconNames' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'iconNames' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'launcherIconNames' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'outputDir' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    Property 'variant' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
    
    opened by WarrenFaith 7
  • Wrong label position in flavor with custom icon

    Wrong label position in flavor with custom icon

    Hi,

    There is an issue when there is a flavor that not use the app's default icon. The position of the labels are wrong.

    In my app I have two labels, one top and one bottom. Using the icon as app's default (main folder). Everything works ok:

    image

    But if the flavor's icon is custom, different from the default one, the label's positions change:

    image

    Both cases using the same image resources.

    This is the configuration

    myFlavor { filters = customColorRibbonFilter("GE", "#00cc00", "#FFFFFF", "top", 0.20) filters = customColorRibbonFilter("QA-WHI", "#00cc00", "#FFFFFF", "bottom", 0.20) }

    opened by chinbri 0
  • Request to add support for banner icon

    Request to add support for banner icon

    First , I am so glad that you build this plugin , and it makes it easy to build different flavor whit different icon.

    I'm working on to make my app run on TV, so it need to setup the banner icon (ic_launcher_banner 16 : 9), but the plugin does't support to modify the banner icon.

    So it may be better to support that.

    opened by peerless2012 0
Releases(v1.3.1)
Owner
Mikel
Mikel
gradle-android-scala-plugin adds scala language support to official gradle android plugin

gradle-android-scala-plugin gradle-android-scala-plugin adds scala language support to official gradle android plugin. See also sample projects at htt

saturday06 345 Dec 10, 2022
Ownership-gradle-plugin - Gradle code ownership verification plugin

Gradle code ownership verification plugin A gradle plugin that will verify owner

null 4 Dec 15, 2022
Helper to upload Gradle Android Artifacts, Gradle Java Artifacts and Gradle Kotlin Artifacts to Maven repositories (JCenter, Maven Central, Corporate staging/snapshot servers and local Maven repositories).

GradleMavenPush Helper to upload Gradle Android Artifacts, Gradle Java Artifacts and Gradle Kotlin Artifacts to Maven repositories (JCenter, Maven Cen

 Vorlonsoft LLC 21 Oct 3, 2022
A powerful Gradle Plugin to help you demonstrate your android app

English | 简体中文 sample-gradle-plugin ?? A powerful Gradle Plugin to help you demonstrate your android app. We often write demo applications that contai

Yoo Zhou 12 Nov 5, 2022
Gradle plugin which helps you analyze the size of your Android apps.

Ruler Ruler is a Gradle plugin which helps you analyze the size of your Android apps. Motivation App size is an important metric which directly correl

Spotify 913 Dec 28, 2022
Gradle plugin which validates the licenses of your dependency graph match what you expect

Licensee ?? ?? A Gradle plugin which validates the licenses of your dependency graph match what you expect, or it fails your build! Jump to: Introduct

Cash App 506 Jan 8, 2023
A Gradle plugin for providing your secrets to your Android project.

Secrets Gradle Plugin for Android A Gradle plugin for providing your secrets securely to your Android project. This Gradle plugin reads secrets from a

Google 560 Jan 8, 2023
GPP is Android's unofficial release automation Gradle Plugin. It can do anything from building, uploading, and then promoting your App Bundle or APK to publishing app listings and other metadata.

Gradle Play Publisher Gradle Play Publisher is Android's unofficial release automation Gradle Plugin. It can do anything from building, uploading, and

null 3.9k Dec 30, 2022
Gradle plugin which downloads and manages your Android SDK.

DEPRECATED This plugin is deprecated and is no longer being developed. Tools and dependencies are automatically downloaded using version 2.2.0 of the

Jake Wharton 1.4k Dec 29, 2022
A Gradle plugin to report the number of method references in your APK on every build.

Dexcount Gradle Plugin A Gradle plugin to report the number of method references in your APK, AAR, or java module. This helps you keep tabs on the gro

Keepsafe 3k Dec 29, 2022
Lightweight plugin to add ambient shooting stars into the night sky.

AmbientStars Lightweight plugin to add ambient shooting stars into the night sky. About This plugin adds little shooting stars to the night sky. Only

TheLeCrafter 1 Dec 14, 2022
K6-intellij-plugin - IntelliJ-based Plugin to run k6 tests locally or in the k6 Cloud from your IntelliJ IDE

IntelliJ-based Plugin to run k6 tests locally or in the k6 Cloud from your Intel

Mikhail Bolotov 8 Jan 2, 2023
This is an android studio plugin that allows you to creates new color in hex format based on a percentage (0-100) and a base color you specify.

alpha-color Description This is an android studio plugin that allows you to creates new color in hex format based on a percentage (0-100) and a base c

null 1 Nov 12, 2021
A Gradle plugin to support the Groovy language for building Android apps

Groovy language support for Android Deprecated: This plugin has been deprecated in favor of Kotlin which has the full support of JetBrains and Google.

Groovy programming language 853 Dec 21, 2022
A Gradle Plugin that removes unused resources in Android projects.

#Lint Cleaner Plugin Removes unused resources reported by Android lint including strings, colors and dimensions. Depracated As of Android Studio 2.0+

Marco RS 705 Nov 25, 2022
Gradle plugin for Google Protocol Buffers

Gradle Protobuf Plugin Author: Andrew Kroh Download: See maven central License: Apache License, Version 2.0 Requirements: Java 1.5+ Google Protocol Bu

Andrew Kroh 36 May 29, 2022
IntelliJ plugin that provides some useful utilities to support the daily work with Gradle.

IntelliJ Gradle Utilities Plugin This IntelliJ plugin provides some useful utilities to support the daily work with Gradle. It's available on the offi

Marcel Kliemannel 6 Jul 29, 2022
Gradle plugin to use git tags as project version names

Version Name Gradle Plugin This plugin adds a kotlin extension function that provides a version name based on the latest git tag. How to use it ?? App

Doist 3 Mar 9, 2022