diff --git a/.github/workflows/assemble.yml b/.github/workflows/assemble.yml index 63dfb7a..b5b0077 100644 --- a/.github/workflows/assemble.yml +++ b/.github/workflows/assemble.yml @@ -14,13 +14,12 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 + - name: Check out code + uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '17' - - name: Grant execute permission for gradlew - run: chmod +x gradlew + distribution: adopt + java-version: '21' - name: Build with Gradle - run: ./gradlew assemble + run: ./gradlew assembleRelease diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3278f1a..2c3e30e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,8 +1,7 @@ name: Publish on: - release: - types: [released] + workflow_dispatch: jobs: publish: @@ -10,20 +9,19 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code - uses: actions/checkout@v3.1.0 - - name: Set up JDK 17 - uses: actions/setup-java@v3.5.1 + uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: distribution: adopt - java-version: 17 + java-version: '21' - name: Release build - run: ./gradlew assembleRelease --scan + run: ./gradlew :loading-button-android:assembleRelease - name: Publish to MavenCentral - run: ./gradlew publishReleasePublicationToSonatypeRepository --max-workers 1 --scan + run: ./gradlew publishAllPublicationsToMavenCentralRepository --no-configuration-cache env: - SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - SONATYPE_NEXUS_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} - SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }} - SIGNING_KEY: ${{ secrets.SIGNING_KEY }} - SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.NEW_SONATYPE_NEXUS_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.NEW_SONATYPE_NEXUS_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.NEW_SIGNING_KEY_ID }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.NEW_SIGNING_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.NEW_SIGNING_KEY }} \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index ab63cf6..0000000 --- a/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.9.23' - repositories { - maven { url "https://plugins.gradle.org/m2/" } - google() - mavenLocal() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.3.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'org.jmailen.gradle:kotlinter-gradle:4.3.0' - classpath 'io.github.gradle-nexus:publish-plugin:2.0.0-rc-2' - classpath("org.jetbrains.dokka:dokka-gradle-plugin:1.9.20") - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply plugin: 'io.github.gradle-nexus.publish-plugin' -apply from: "${rootDir}/scripts/publish-root.gradle" - -allprojects { - repositories { - maven { url "https://plugins.gradle.org/m2/" } - google() - mavenLocal() - mavenCentral() - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..1f6d905 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,10 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + alias(libs.plugins.application) apply false + alias(libs.plugins.androidLibrary) apply false + alias(libs.plugins.kotlinAndroid) apply false + alias(libs.plugins.sonatype.publish) apply false + alias(libs.plugins.kotlin.compose) apply false +} + +extra["libraryVersion"] = "0.7.0" diff --git a/gradle.properties b/gradle.properties index 77e5cad..7ad13be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,27 +1,28 @@ # Project-wide Gradle settings. - # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. - # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html - # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M" -XX\:+UseParallelGC -XX\:MaxMetaspaceSize\=512m -XX\:+HeapDumpOnOutOfMemoryError -Dfile.encoding\=UTF-8 -android.enableJetifier=true -android.useAndroidX=true -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false -kotlin.code.style=official -kotlin.incremental=true -org.gradle.caching=true - +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true +android.defaults.buildfeatures.buildconfig=true +android.nonFinalResIds=false +org.jetbrains.compose.experimental.uikit.enabled=true +org.jetbrains.compose.experimental.jscanvas.enabled=true + diff --git a/gradle/buildWithTravis.sh b/gradle/buildWithTravis.sh deleted file mode 100644 index b89a49e..0000000 --- a/gradle/buildWithTravis.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -if [ "$TRAVIS_TAG" == "" ]; then - echo -e 'Build Branch' - ./gradlew build -elif [ "$TRAVIS_TAG" != "" ]; then - echo -e 'Build Branch for tag: Tag ['$TRAVIS_TAG']' - ./gradlew -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" build bintrayUpload -else - echo -e 'WARN: Should not be here ./gradlew clean' -fi diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..7a9fb84 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,48 @@ +[versions] +activityCompose = "1.10.0" +agp = "8.8.0" +appcompat = "1.7.0" +composeBom = "2025.02.00" +constraintlayout = "2.2.0" +core = "1.6.1" +coreKtx = "1.15.0" +espressoCore = "3.6.1" +junit = "4.13.2" +junitVersion = "1.2.1" +kotlin = "2.1.10" +lifecycleRuntimeKtx = "2.8.7" +material = "1.12.0" +mockitoCore = "5.15.2" +mockitoKotlin = "2.2.0" +publish = "0.30.0" +robolectric = "4.14.1" + +[libraries] +androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activityCompose" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" } +androidx-core = { module = "androidx.test:core", version.ref = "core" } +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" } +androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCore" } +androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junitVersion" } +androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-material3 = { module = "androidx.compose.material3:material3" } +androidx-ui = { module = "androidx.compose.ui:ui" } +androidx-ui-graphics = { module = "androidx.compose.ui:ui-graphics" } +androidx-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } +androidx-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } +androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } +androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } +junit = { module = "junit:junit", version.ref = "junit" } +material = { module = "com.google.android.material:material", version.ref = "material" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } +mockito-kotlin = { module = "com.nhaarman.mockitokotlin2:mockito-kotlin", version.ref = "mockitoKotlin" } +robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } + +[plugins] +application = { id = "com.android.application", version.ref = "agp" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +sonatype-publish = { id = "com.vanniktech.maven.publish", version.ref = "publish" } +kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae4cfac..b656dc2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Mar 06 10:41:53 EST 2024 +#Fri Apr 14 15:25:27 CEST 2023 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/loading-button-android/build.gradle.kts b/loading-button-android/build.gradle.kts index 1ba0b33..534bbc7 100644 --- a/loading-button-android/build.gradle.kts +++ b/loading-button-android/build.gradle.kts @@ -1,13 +1,58 @@ +import com.vanniktech.maven.publish.SonatypeHost + +val libraryVersion: String by rootProject.extra + plugins { - id("com.android.library") - kotlin("android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.kotlinAndroid) + alias(libs.plugins.sonatype.publish) +} + + +mavenPublishing { + val artifactId = "loading-button" + + coordinates( + groupId = "io.writeopia", + artifactId = artifactId, + version = libraryVersion + ) + + pom { + name = artifactId + description = "Core module of Writeopia" + url = "https://github.com/leandroBorgesFerreira/LoadingButtonAndroid" + + developers { + developer { + id = "leandroBorgesFerreira" + name = "Leandro Borges Ferreira" + url = "https://github.com/leandroBorgesFerreira" + } + } + + licenses { + license { + name = "The Apache Software License, Version 2.0" + url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + + scm { + connection = "scm:git@github.com:leandroBorgesFerreira/LoadingButtonAndroid.git" + developerConnection = "scm:git:ssh://github.com/leandroBorgesFerreira/LoadingButtonAndroid.git" + url = "https://github.com/leandroBorgesFerreira/LoadingButtonAndroid" + } + } + + signAllPublications() + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL, automaticRelease = false) } -apply(from = "${rootDir}/scripts/publish-module.gradle") android { - namespace = "com.github.leandroborgesferreira.loadingbutton" - compileSdk = 34 + namespace = "io.writeopia.loadingbutton" + compileSdk = 35 defaultConfig { minSdk = 21 @@ -35,12 +80,12 @@ android { } dependencies { - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.appcompat:appcompat:1.6.1") - - testImplementation("org.mockito:mockito-core:5.3.1") - testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0") - testImplementation("org.robolectric:robolectric:4.10") - testImplementation("androidx.test:core:1.5.0") - testImplementation("junit:junit:4.13.2") + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + + testImplementation(libs.mockito.core) + testImplementation(libs.mockito.kotlin) + testImplementation(libs.robolectric) + testImplementation(libs.androidx.core) + testImplementation(libs.junit) } diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/ProgressType.kt b/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/ProgressType.kt deleted file mode 100644 index 46631ac..0000000 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/ProgressType.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.leandroborgesferreira.loadingbutton.animatedDrawables - -enum class ProgressType { - DETERMINATE, INDETERMINATE -} diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/Extensions.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/Extensions.kt similarity index 89% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/Extensions.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/Extensions.kt index 5fe4eba..6153d6f 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/Extensions.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/Extensions.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton +package io.writeopia.loadingbutton import android.animation.Animator import android.view.View diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt similarity index 96% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt index d38ca6e..19ffab2 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawable.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.animatedDrawables +package io.writeopia.loadingbutton.animatedDrawables import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -14,8 +14,8 @@ import android.graphics.drawable.Animatable import android.graphics.drawable.Drawable import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.LinearInterpolator -import com.github.leandroborgesferreira.loadingbutton.customViews.ProgressButton -import com.github.leandroborgesferreira.loadingbutton.disposeAnimator +import io.writeopia.loadingbutton.customViews.ProgressButton +import io.writeopia.loadingbutton.disposeAnimator const val MIN_PROGRESS = 0F const val MAX_PROGRESS = 100F diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt similarity index 94% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt index 6fad5ca..0cb63a3 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawable.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.animatedDrawables +package io.writeopia.loadingbutton.animatedDrawables import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -14,8 +14,8 @@ import android.graphics.PixelFormat import android.graphics.drawable.Animatable import android.graphics.drawable.Drawable import android.view.animation.DecelerateInterpolator -import com.github.leandroborgesferreira.loadingbutton.customViews.ProgressButton -import com.github.leandroborgesferreira.loadingbutton.disposeAnimator +import io.writeopia.loadingbutton.customViews.ProgressButton +import io.writeopia.loadingbutton.disposeAnimator private const val REVEAL_DURATION = 120L private const val ALPHA_ANIMATION_DURATION = 80L diff --git a/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/ProgressType.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/ProgressType.kt new file mode 100644 index 0000000..98c5154 --- /dev/null +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/animatedDrawables/ProgressType.kt @@ -0,0 +1,5 @@ +package io.writeopia.loadingbutton.animatedDrawables + +enum class ProgressType { + DETERMINATE, INDETERMINATE +} diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressButton.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressButton.kt similarity index 90% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressButton.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressButton.kt index 6fc5c72..0a2cc2a 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressButton.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressButton.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.customViews +package io.writeopia.loadingbutton.customViews import android.animation.AnimatorSet import android.content.Context @@ -11,12 +11,12 @@ import androidx.appcompat.widget.AppCompatButton import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.OnLifecycleEvent -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.ProgressType -import com.github.leandroborgesferreira.loadingbutton.disposeAnimator -import com.github.leandroborgesferreira.loadingbutton.presentation.ProgressButtonPresenter -import com.github.leandroborgesferreira.loadingbutton.presentation.State +import io.writeopia.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.ProgressType +import io.writeopia.loadingbutton.disposeAnimator +import io.writeopia.loadingbutton.presentation.ProgressButtonPresenter +import io.writeopia.loadingbutton.presentation.State open class CircularProgressButton : AppCompatButton, ProgressButton { diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressImageButton.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressImageButton.kt similarity index 87% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressImageButton.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressImageButton.kt index 5e25bb2..67df545 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/CircularProgressImageButton.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/CircularProgressImageButton.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.customViews +package io.writeopia.loadingbutton.customViews import android.animation.AnimatorSet import android.content.Context @@ -11,14 +11,15 @@ import androidx.appcompat.widget.AppCompatImageButton import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.OnLifecycleEvent -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.ProgressType -import com.github.leandroborgesferreira.loadingbutton.disposeAnimator -import com.github.leandroborgesferreira.loadingbutton.presentation.ProgressButtonPresenter -import com.github.leandroborgesferreira.loadingbutton.presentation.State +import io.writeopia.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.ProgressType +import io.writeopia.loadingbutton.disposeAnimator +import io.writeopia.loadingbutton.presentation.ProgressButtonPresenter +import io.writeopia.loadingbutton.presentation.State +import kotlin.math.abs -open class CircularProgressImageButton : AppCompatImageButton, ProgressButton { +class CircularProgressImageButton : AppCompatImageButton, ProgressButton { constructor(context: Context) : super(context) { init() @@ -47,7 +48,7 @@ open class CircularProgressImageButton : AppCompatImageButton, ProgressButton { override val finalWidth: Int by lazy { val padding = Rect() drawableBackground.getPadding(padding) - finalHeight - (Math.abs(padding.top - padding.left) * 2) + finalHeight - (abs(padding.top - padding.left) * 2) } override var progressType: ProgressType diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/OnAnimationEndListener.java b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/OnAnimationEndListener.java similarity index 57% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/OnAnimationEndListener.java rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/OnAnimationEndListener.java index c37a155..496d247 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/OnAnimationEndListener.java +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/OnAnimationEndListener.java @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.customViews; +package io.writeopia.loadingbutton.customViews; @FunctionalInterface public interface OnAnimationEndListener { diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/ProgressButton.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/ProgressButton.kt similarity index 81% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/ProgressButton.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/ProgressButton.kt index 2890de5..5d4dea3 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/customViews/ProgressButton.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/customViews/ProgressButton.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.customViews +package io.writeopia.loadingbutton.customViews import android.animation.Animator import android.animation.AnimatorListenerAdapter @@ -16,15 +16,15 @@ import android.util.AttributeSet import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.LifecycleObserver -import com.github.leandroborgesferreira.loadingbutton.R -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.ProgressType -import com.github.leandroborgesferreira.loadingbutton.presentation.State -import com.github.leandroborgesferreira.loadingbutton.updateHeight -import com.github.leandroborgesferreira.loadingbutton.updateWidth -import com.github.leandroborgesferreira.loadingbutton.utils.addLifecycleObserver -import com.github.leandroborgesferreira.loadingbutton.utils.parseGradientDrawable +import io.writeopia.loadingbutton.animatedDrawables.CircularProgressAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.CircularRevealAnimatedDrawable +import io.writeopia.loadingbutton.animatedDrawables.ProgressType +import io.writeopia.loadingbutton.presentation.State +import io.writeopia.loadingbutton.updateHeight +import io.writeopia.loadingbutton.updateWidth +import io.writeopia.loadingbutton.utils.addLifecycleObserver +import io.writeopia.loadingbutton.utils.parseGradientDrawable +import io.writeopia.loadingbutton.R import kotlin.math.abs interface ProgressButton : Drawable.Callback, LifecycleObserver { @@ -80,7 +80,7 @@ interface ProgressButton : Drawable.Callback, LifecycleObserver { fun revertAnimation() { revertAnimation { } } - + fun doneLoadingAnimation(fillColor: Int, bitmap: Bitmap) fun startRevealAnimation() @@ -93,7 +93,12 @@ interface ProgressButton : Drawable.Callback, LifecycleObserver { internal fun ProgressButton.init(attrs: AttributeSet? = null, defStyleAttr: Int = 0) { val typedArray: TypedArray? = attrs?.run { - getContext().obtainStyledAttributes(this, R.styleable.CircularProgressButton, defStyleAttr, 0) + getContext().obtainStyledAttributes( + this, + R.styleable.CircularProgressButton, + defStyleAttr, + 0 + ) } val typedArrayBg: TypedArray? = attrs?.run { @@ -128,10 +133,13 @@ internal fun ProgressButton.config(tArray: TypedArray) { initialCorner = tArray.getDimension(R.styleable.CircularProgressButton_initialCornerAngle, 0f) finalCorner = tArray.getDimension(R.styleable.CircularProgressButton_finalCornerAngle, 100f) - spinningBarWidth = tArray.getDimension(R.styleable.CircularProgressButton_spinning_bar_width, 10f) - spinningBarColor = tArray.getColor(R.styleable.CircularProgressButton_spinning_bar_color, spinningBarColor) + spinningBarWidth = + tArray.getDimension(R.styleable.CircularProgressButton_spinning_bar_width, 10f) + spinningBarColor = + tArray.getColor(R.styleable.CircularProgressButton_spinning_bar_color, spinningBarColor) - paddingProgress = tArray.getDimension(R.styleable.CircularProgressButton_spinning_bar_padding, 0F) + paddingProgress = + tArray.getDimension(R.styleable.CircularProgressButton_spinning_bar_padding, 0F) } internal fun ProgressButton.createProgressDrawable(): CircularProgressAnimatedDrawable = @@ -158,14 +166,24 @@ internal fun ProgressButton.createRevealAnimatedDrawable( val padding = Rect() drawableBackground.getPadding(padding) val paddingSides = (abs(padding.top - padding.left)) - setBounds(paddingSides, padding.top, finalWidth - paddingSides, finalHeight - padding.bottom) + setBounds( + paddingSides, + padding.top, + finalWidth - paddingSides, + finalHeight - padding.bottom + ) callback = this@createRevealAnimatedDrawable } internal fun cornerAnimator(drawable: Drawable, initial: Float, final: Float) = when (drawable) { // is GradientDrawable -> ObjectAnimator.ofFloat(drawable, "cornerRadius", initial, final) - else -> ObjectAnimator.ofFloat(parseGradientDrawable(drawable), "cornerRadius", initial, final) + else -> ObjectAnimator.ofFloat( + parseGradientDrawable(drawable), + "cornerRadius", + initial, + final + ) } internal fun widthAnimator(view: View, initial: Int, final: Int) = diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenter.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/presentation/ProgressButtonPresenter.kt similarity index 95% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenter.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/presentation/ProgressButtonPresenter.kt index 182afac..cb9fb07 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenter.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/presentation/ProgressButtonPresenter.kt @@ -1,9 +1,9 @@ -package com.github.leandroborgesferreira.loadingbutton.presentation +package io.writeopia.loadingbutton.presentation import android.graphics.Bitmap import android.graphics.Canvas import android.os.Handler -import com.github.leandroborgesferreira.loadingbutton.customViews.ProgressButton +import io.writeopia.loadingbutton.customViews.ProgressButton enum class State { BEFORE_DRAW, diff --git a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/utils/Utils.kt b/loading-button-android/src/main/java/io/writeopia/loadingbutton/utils/Utils.kt similarity index 97% rename from loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/utils/Utils.kt rename to loading-button-android/src/main/java/io/writeopia/loadingbutton/utils/Utils.kt index 91ccd32..3d8fa8e 100644 --- a/loading-button-android/src/main/java/com/github/leandroborgesferreira/loadingbutton/utils/Utils.kt +++ b/loading-button-android/src/main/java/io/writeopia/loadingbutton/utils/Utils.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.loadingbutton.utils +package io.writeopia.loadingbutton.utils import android.content.Context import android.graphics.drawable.ColorDrawable diff --git a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawableTest.kt b/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawableTest.kt deleted file mode 100644 index 66fb913..0000000 --- a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularProgressAnimatedDrawableTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.leandroborgesferreira.loadingbutton.animatedDrawables - -import com.nhaarman.mockitokotlin2.mock -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class CircularProgressAnimatedDrawableTest { - - @Test - fun `isRunning should return correct state`() { - getCircularAnimatedDrawable().run { - assertFalse(isRunning) - - start() - assertTrue(isRunning) - - stop() - assertFalse(isRunning) - } - } - - @Test - fun `call start or stop twice should not break anything`() { - getCircularAnimatedDrawable().run { - assertFalse(isRunning) - - start() - start() - assertTrue(isRunning) - - stop() - stop() - assertFalse(isRunning) - } - } - - @Test - fun `setting progress should update the state to determinate`() { - getCircularAnimatedDrawable().run { - val newProgress = 20F - - assertEquals(progressType, ProgressType.INDETERMINATE) - - progress = newProgress - - assertEquals(progress, newProgress) - assertEquals(progressType, ProgressType.DETERMINATE) - } - } - - private fun getCircularAnimatedDrawable() = CircularProgressAnimatedDrawable(mock(), 5F, 2) -} diff --git a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawableTest.kt b/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawableTest.kt deleted file mode 100644 index fe8da58..0000000 --- a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/animatedDrawables/CircularRevealAnimatedDrawableTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.leandroborgesferreira.loadingbutton.animatedDrawables - -import android.content.Context -import android.graphics.BitmapFactory -import androidx.test.core.app.ApplicationProvider -import com.github.leandroborgesferreira.loadingbutton.R -import com.nhaarman.mockitokotlin2.mock -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner - -@RunWith(RobolectricTestRunner::class) -class CircularRevealAnimatedDrawableTest { - - @Test - fun `isRunning should return correct state`() { - val context: Context = ApplicationProvider.getApplicationContext() - - getCircularRevealAnimatedDrawable(context).run { - assertFalse(isRunning) - - start() - assertTrue(isRunning) - - stop() - assertFalse(isRunning) - } - } - - @Test - fun `call start or stop twice should not break anything`() { - val context: Context = ApplicationProvider.getApplicationContext() - - getCircularRevealAnimatedDrawable(context).run { - assertFalse(isRunning) - - start() - start() - assertTrue(isRunning) - - stop() - stop() - assertFalse(isRunning) - } - } - - private fun getCircularRevealAnimatedDrawable(context: Context) = - CircularRevealAnimatedDrawable( - mock(), - android.R.color.black, - BitmapFactory.decodeResource(context.resources, R.drawable.abc_ab_share_pack_mtrl_alpha)) -} diff --git a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenterTest.kt b/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenterTest.kt deleted file mode 100644 index 4b67314..0000000 --- a/loading-button-android/src/test/java/com/github/leandroborgesferreira/loadingbutton/presentation/ProgressButtonPresenterTest.kt +++ /dev/null @@ -1,282 +0,0 @@ -package com.github.leandroborgesferreira.loadingbutton.presentation - -import android.graphics.Bitmap -import android.graphics.Canvas -import com.github.leandroborgesferreira.loadingbutton.customViews.ProgressButton -import com.nhaarman.mockitokotlin2.any -import com.nhaarman.mockitokotlin2.mock -import com.nhaarman.mockitokotlin2.never -import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner -import org.robolectric.shadows.ShadowLooper - -@RunWith(RobolectricTestRunner::class) -class ProgressButtonPresenterTest { - - private lateinit var view: ProgressButton - private lateinit var canvas: Canvas - - @Before - fun setUp() { - view = mock() - canvas = mock() - } - - @Test - fun `should handle state correctly`() { - ProgressButtonPresenter(view).run { - assertEquals(State.BEFORE_DRAW, state) - - onDraw(mock()) - assertEquals(State.IDLE, state) - } - } - - @Test - fun `it should call view correctly at given state`() { - ProgressButtonPresenter(view).run { - state = State.PROGRESS - onDraw(canvas) - verify(view).drawProgress(canvas) - state = State.DONE - onDraw(canvas) - verify(view).drawDoneAnimation(canvas) - } - } - - @Test - fun `view should be clean before morph starts`() { - ProgressButtonPresenter(view).run { - morphStart() - assertEquals(State.MORPHING, state) - } - - verify(view).run { - setClickable(false) - hideInitialState() - setCompoundDrawables(null, null, null, null) - } - } - - @Test - fun `state should change when morph ends`() { - ProgressButtonPresenter(view).run { - morphEnd() - assertEquals(State.PROGRESS, state) - } - } - - @Test - fun `reveal animation should start if done is called during morph`() { - ProgressButtonPresenter(view).run { - morphStart() - doneLoadingAnimation(1, mock()) - morphEnd() - } - - ShadowLooper.runUiThreadTasksIncludingDelayedTasks() - - verify(view).startRevealAnimation() - } - - @Test - fun `morph revert start should behave correctly`() { - ProgressButtonPresenter(view).run { - morphRevertStart() - assertEquals(State.MORPHING, state) - - verify(view).setClickable(false) - } - } - - @Test - fun `morph revert end should behave correctly`() { - ProgressButtonPresenter(view).run { - morphRevertEnd() - assertEquals(State.IDLE, state) - } - - verify(view).run { - setClickable(true) - recoverInitialState() - } - } - - @Test - fun `view animation start should only be called in Idle state`() { - ProgressButtonPresenter(view).run { - State.values() - .filter { state -> state != State.IDLE } - .forEach { state -> - this.state = state - startAnimation() - } - - verify(view, never()).startMorphAnimation() - - this.state = State.IDLE - startAnimation() - verify(view).startMorphAnimation() - } - } - - @Test - fun `when animation is called before the onDraw method, it should call startAnimation on onDraw`() { - ProgressButtonPresenter(view).run { - state = State.BEFORE_DRAW - startAnimation() - verify(view, never()).startMorphAnimation() - onDraw(canvas) - verify(view).startMorphAnimation() - } - } - - @Test - fun `stop animation should call view if presenter is on progress state`() { - ProgressButtonPresenter(view).run { - state = State.PROGRESS - stopAnimation() - assertEquals(State.STOPPED, state) - } - - verify(view).stopProgressAnimation() - } - - @Test - fun `stop animation should not call view if presenter is NOT on progress state`() { - ProgressButtonPresenter(view).run { - stopAnimation() - assertEquals(State.STOPPED, state) - } - - verify(view, never()).stopProgressAnimation() - } - - @Test - fun `revert animation should do nothing if not in correct stage`() { - ProgressButtonPresenter(view).run { - State.values().filterNot { state -> - state == State.PROGRESS || - state == State.MORPHING || - state == State.DONE || - state == State.WAITING_DONE || - state == State.STOPPED - }.forEach { state -> - this.state = state - revertAnimation() - } - } - - verifyNoMoreInteractions(view) - } - - @Test - fun `revertAnimation should call correct method of view in morphing state`() { - ProgressButtonPresenter(view).run { - state = State.MORPHING - revertAnimation() - } - - verify(view).stopMorphAnimation() - verify(view).startMorphRevertAnimation() - verifyNoMoreInteractions(view) - } - - @Test - fun `revertAnimation should call correct method of view in progress state`() { - ProgressButtonPresenter(view).run { - state = State.PROGRESS - revertAnimation() - } - - verify(view).stopProgressAnimation() - verify(view).startMorphRevertAnimation() - verifyNoMoreInteractions(view) - } - - @Test - fun `revertAnimation should call correct method of view in done state`() { - ProgressButtonPresenter(view).run { - state = State.DONE - revertAnimation() - } - - verify(view).startMorphRevertAnimation() - verifyNoMoreInteractions(view) - } - - @Test - fun `it should save state on the first onDraw`() { - ProgressButtonPresenter(view).onDraw(mock()) - verify(view).saveInitialState() - } - - @Test - fun `onDraw - on progress`() { - ProgressButtonPresenter(view).run { - state = State.PROGRESS - onDraw(mock()) - } - - verify(view).drawProgress(any()) - } - - @Test - fun `onDraw - done`() { - ProgressButtonPresenter(view).run { - state = State.DONE - onDraw(mock()) - } - - verify(view).drawDoneAnimation(any()) - } - - @Test - fun `done animation should work if button is on progress state`() { - ProgressButtonPresenter(view).run { - state = State.PROGRESS - doneLoadingAnimation(0, mock()) - assertEquals(State.DONE, state) - } - - verify(view).run { - stopProgressAnimation() - startRevealAnimation() - } - } - - @Test - fun `done animation should only interact with view on Progress state`() { - val bitmapMock: Bitmap = mock() - - ProgressButtonPresenter(view).run { - State.values() - .filter { state -> - state != State.PROGRESS - }.forEach { state -> - this.state = state - doneLoadingAnimation(0, bitmapMock) - } - } - - verify(view, never()).run { - stopProgressAnimation() - startRevealAnimation() - } - } - - @Test - fun `if done animation is called before morph finishes, it should not show progress`() { - ProgressButtonPresenter(view).run { - startAnimation() - doneLoadingAnimation(0, mock()) - - assertEquals(State.DONE, state) // Should not be progress - } - } -} diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index d8ad916..db0d643 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -1,16 +1,17 @@ plugins { - id("com.android.application") - kotlin("android") + alias(libs.plugins.application) + alias(libs.plugins.kotlinAndroid) + alias(libs.plugins.kotlin.compose) } android { - namespace = "com.github.leandroborgesferreira.sample" - compileSdk = 34 + namespace = "io.writeopia.sample" + compileSdk = 35 defaultConfig { - applicationId = "com.github.leandroborgesferreira.sample" + applicationId = "io.writeopia.sample" minSdk = 21 - targetSdk = 34 + targetSdk = 35 versionCode = 1 versionName = "1.0" @@ -52,22 +53,22 @@ android { dependencies { implementation(project(":loading-button-android")) - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") - implementation("androidx.activity:activity-compose:1.8.2") - implementation(platform("androidx.compose:compose-bom:2024.03.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2024.03.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index ec7a009..7cffd8c 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ android:supportsRtl="true" android:theme="@style/Theme.LoadingButtonAndroid"> diff --git a/sample/src/main/java/com/github/leandroborgesferreira/sample/SampleActivity.kt b/sample/src/main/java/io/writeopia/sample/SampleActivity.kt similarity index 69% rename from sample/src/main/java/com/github/leandroborgesferreira/sample/SampleActivity.kt rename to sample/src/main/java/io/writeopia/sample/SampleActivity.kt index 06e9fc6..edc72dd 100644 --- a/sample/src/main/java/com/github/leandroborgesferreira/sample/SampleActivity.kt +++ b/sample/src/main/java/io/writeopia/sample/SampleActivity.kt @@ -1,17 +1,16 @@ -package com.github.leandroborgesferreira.sample +package io.writeopia.sample import android.content.Context import android.content.res.Resources import android.graphics.Bitmap import android.graphics.BitmapFactory -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Handler +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat -import com.github.leandroborgesferreira.loadingbutton.animatedDrawables.ProgressType -import com.github.leandroborgesferreira.loadingbutton.customViews.CircularProgressButton -import com.github.leandroborgesferreira.loadingbutton.customViews.ProgressButton -import com.github.leandroborgesferreira.sample.R +import io.writeopia.loadingbutton.animatedDrawables.ProgressType +import io.writeopia.loadingbutton.customViews.CircularProgressButton +import io.writeopia.loadingbutton.customViews.ProgressButton class SampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -28,7 +27,7 @@ class SampleActivity : AppCompatActivity() { private fun defaultColor(context: Context) = ContextCompat.getColor(context, android.R.color.black) private fun defaultDoneImage(resources: Resources) = - BitmapFactory.decodeResource(resources, R.drawable.ic_done_white_48dp) + BitmapFactory.decodeResource(resources, io.writeopia.loadingbutton.R.drawable.ic_done_white_48dp) private fun ProgressButton.morphDoneAndRevert( context: Context, @@ -37,7 +36,7 @@ private fun ProgressButton.morphDoneAndRevert( doneTime: Long = 3000, revertTime: Long = 4000 ) { - progressType = com.github.leandroborgesferreira.loadingbutton.animatedDrawables.ProgressType.INDETERMINATE + progressType = ProgressType.INDETERMINATE startAnimation() Handler().run { postDelayed({ doneLoadingAnimation(fillColor, bitmap) }, doneTime) diff --git a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Color.kt b/sample/src/main/java/io/writeopia/sample/ui/theme/Color.kt similarity index 81% rename from sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Color.kt rename to sample/src/main/java/io/writeopia/sample/ui/theme/Color.kt index 2025a42..1596621 100644 --- a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Color.kt +++ b/sample/src/main/java/io/writeopia/sample/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.sample.ui.theme +package io.writeopia.sample.ui.theme import androidx.compose.ui.graphics.Color diff --git a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Theme.kt b/sample/src/main/java/io/writeopia/sample/ui/theme/Theme.kt similarity index 97% rename from sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Theme.kt rename to sample/src/main/java/io/writeopia/sample/ui/theme/Theme.kt index 49b58c7..f425382 100644 --- a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Theme.kt +++ b/sample/src/main/java/io/writeopia/sample/ui/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.sample.ui.theme +package io.writeopia.sample.ui.theme import android.app.Activity import android.os.Build diff --git a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Type.kt b/sample/src/main/java/io/writeopia/sample/ui/theme/Type.kt similarity index 94% rename from sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Type.kt rename to sample/src/main/java/io/writeopia/sample/ui/theme/Type.kt index eb48261..6743526 100644 --- a/sample/src/main/java/com/github/leandroborgesferreira/sample/ui/theme/Type.kt +++ b/sample/src/main/java/io/writeopia/sample/ui/theme/Type.kt @@ -1,4 +1,4 @@ -package com.github.leandroborgesferreira.sample.ui.theme +package io.writeopia.sample.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/sample/src/main/res/layout/activity_sample.xml b/sample/src/main/res/layout/activity_sample.xml index 2299785..0fa8ec1 100644 --- a/sample/src/main/res/layout/activity_sample.xml +++ b/sample/src/main/res/layout/activity_sample.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.github.leandroborgesferreira.sample.SampleActivity"> + tools:context=".SampleActivity"> - p.load(is) } - p.each { name, value -> ext[name] = value } -} else { - // Use system environment variables - ext["ossrhUsername"] = System.getenv('SONATYPE_NEXUS_USERNAME') - ext["ossrhPassword"] = System.getenv('SONATYPE_NEXUS_PASSWORD') - ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID') - ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID') - ext["signing.password"] = System.getenv('SIGNING_PASSWORD') - ext["signing.key"] = System.getenv('SIGNING_KEY') - ext["snapshot"] = System.getenv('SNAPSHOT') -} - -nexusPublishing { - repositories { - sonatype { - stagingProfileId = sonatypeStagingProfileId - username = ossrhUsername - password = ossrhPassword - } - } -} diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index b0c7fd9..0000000 --- a/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -include ':loading-button-android' -include ':sample' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..0a5a0e7 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,25 @@ +// enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +pluginManagement { + repositories { + google() + mavenCentral() + mavenLocal() + gradlePluginPortal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + } +} +dependencyResolutionManagement { +// repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + google() + mavenCentral() + mavenLocal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + } +} + +rootProject.name = "LoadingButtonAndroid" + +include(":loading-button-android") +include(":sample")