From c715ab60f1353afa676809ee04ed418305196ff6 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sun, 7 Feb 2021 14:29:56 +0900
Subject: [PATCH 001/100] Add kotlin plugin and update dependencies
---
app/build.gradle | 1 +
app/src/main/res/values/colors.xml | 2 +-
build.gradle | 6 +++++-
colorpickerview/build.gradle | 2 +-
dependencies.gradle | 9 ++++++---
5 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 9a691ed..5f08a99 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -13,6 +13,7 @@
// limitations under the License.
apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
apply from: "$rootDir/dependencies.gradle"
android {
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index ff1016a..22ef009 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,6 +1,6 @@
- #F50057
+ #FFF50057
#C51162
#3d95c9
#2B292B
diff --git a/build.gradle b/build.gradle
index f6fe064..c7442ef 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,18 +16,22 @@ buildscript {
apply from: "$rootDir/dependencies.gradle"
repositories {
jcenter()
+ mavenCentral()
google()
}
dependencies {
classpath "com.android.tools.build:gradle:$versions.gradleBuildTool"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin"
classpath "com.diffplug.spotless:spotless-plugin-gradle:$versions.spotlessGradle"
- classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$versions.bintrayPlugin"
+ classpath "com.vanniktech:gradle-maven-publish-plugin:$versions.mavenPublish"
+ classpath "org.jetbrains.dokka:dokka-gradle-plugin:$versions.dokkaGradle"
}
}
allprojects {
repositories {
jcenter()
+ mavenCentral()
google()
}
}
diff --git a/colorpickerview/build.gradle b/colorpickerview/build.gradle
index a86ec8c..a8014a3 100644
--- a/colorpickerview/build.gradle
+++ b/colorpickerview/build.gradle
@@ -13,8 +13,8 @@
// limitations under the License.
apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
apply from: "$rootDir/dependencies.gradle"
-apply from: "$rootDir/publish.gradle"
android {
compileSdkVersion versions.compileSdk
diff --git a/dependencies.gradle b/dependencies.gradle
index 9de5b05..8062936 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -18,10 +18,13 @@ ext.versions = [
versionoCode : 26,
versionName : '2.2.2',
- gradleBuildTool : '4.1.0',
- spotlessGradle : '5.8.0',
- bintrayPlugin : '1.8.5',
+ gradleBuildTool : '4.1.1',
+ spotlessGradle : '5.9.0',
+ ktlintGradle : '0.40.0',
+ dokkaGradle : '1.4.20',
+ mavenPublish : '0.13.0',
+ kotlin : '1.4.20',
androidxAppcompat: '1.2.0',
// for demo
From 102c9f5c6ae0a5c6794e3fde70fbfd0406ff216b Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sun, 7 Feb 2021 14:36:17 +0900
Subject: [PATCH 002/100] Implement colorPickerDialog extension for creating
ColorPickerDialog
---
.../kotlin/ColorPickerDialogExtension.kt | 34 +++++++++++++++++++
spotless.gradle | 7 ++++
2 files changed, 41 insertions(+)
create mode 100644 colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt b/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
new file mode 100644
index 0000000..565390d
--- /dev/null
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
@@ -0,0 +1,34 @@
+/*
+ * Designed and developed by 2017 skydoves (Jaewoong Eum)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.skydoves.colorpickerview.kotlin
+
+import android.content.Context
+import com.skydoves.colorpickerview.ColorPickerDialog
+
+@DslMarker
+internal annotation class ColorPickerDsl
+
+/**
+ * Creates a lambda scope for implementing [ColorPickerDialog] using its [ColorPickerDialog.Builder].
+ *
+ * @param block lambda scope for receiving [ColorPickerDialog.Builder].
+ * @return new instance of [ColorPickerDialog].
+ */
+@ColorPickerDsl
+@JvmSynthetic
+fun Context.colorPickerDialog(block: ColorPickerDialog.Builder.() -> Unit) =
+ ColorPickerDialog.Builder(this).apply(block)
diff --git a/spotless.gradle b/spotless.gradle
index e6c6ffe..009d2a6 100644
--- a/spotless.gradle
+++ b/spotless.gradle
@@ -22,4 +22,11 @@ spotless {
googleJavaFormat()
endWithNewline()
}
+ kotlin {
+ target "**/*.kt"
+ ktlint("$versions.ktlintGradle").userData(['indent_size': '2', 'continuation_indent_size': '2'])
+ licenseHeaderFile "$rootDir/spotless.license.java"
+ trimTrailingWhitespace()
+ endWithNewline()
+ }
}
\ No newline at end of file
From a35879341293b42c0226712ee975084345de5f36 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sun, 7 Feb 2021 14:38:24 +0900
Subject: [PATCH 003/100] Remove jcenter publishing tasks and migrate to maven
---
.../colorpickerviewdemo/MainActivity.java | 2 +-
gradle.properties | 55 +++++--
publish.gradle | 146 ------------------
3 files changed, 41 insertions(+), 162 deletions(-)
delete mode 100644 publish.gradle
diff --git a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
index 1176c0e..57ea4e7 100644
--- a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
+++ b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
@@ -52,7 +52,7 @@ public class MainActivity extends AppCompatActivity {
private boolean FLAG_SELECTOR = false;
private PowerMenu powerMenu;
- private OnMenuItemClickListener powerMenuItemClickListener =
+ private final OnMenuItemClickListener powerMenuItemClickListener =
new OnMenuItemClickListener() {
@Override
public void onItemClick(int position, PowerMenuItem item) {
diff --git a/gradle.properties b/gradle.properties
index 044d28b..df7d8b5 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,5 @@
-# Designed and developed by 2019 skydoves (Jaewoong Eum)
+#
+# Copyright 2017 skydoves (Jaewoong Eum)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -11,19 +12,43 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
+#
+
+# Jvm environments
+org.gradle.jvmargs=-Xmx4g
-# 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.
-android.enableJetifier=true
+# AndroidX
android.useAndroidX=true
-org.gradle.jvmargs=-Xmx1536m
-# 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
+
+# Required to publish to Nexus
+systemProp.org.gradle.internal.publish.checksums.insecure=true
+
+# Increase timeout when pushing to Sonatype
+systemProp.org.gradle.internal.http.connectionTimeout=120000
+systemProp.org.gradle.internal.http.socketTimeout=120000
+
+# Maven
+GROUP=com.github.skydoves
+POM_PACKAGING=aar
+
+VERSION_NAME=2.2.3-SNAPSHOT
+
+POM_ARTIFACT_ID=colorpickerview
+POM_NAME=colorpickerview
+POM_DESCRIPTION=Android colorpicker for getting colors from any images by tapping on the desired color.
+
+POM_URL=https://github.com/skydoves/colorpickerview/
+POM_SCM_URL=https://github.com/skydoves/colorpickerview/
+POM_SCM_CONNECTION=scm:git:git://github.com/skydoves/colorpickerview.git
+POM_SCM_DEV_CONNECTION=scm:git:git://github.com/skydoves/colorpickerview.git
+
+POM_LICENCE_NAME=The Apache Software License, Version 2.0
+POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
+POM_LICENCE_DIST=repo
+
+POM_DEVELOPER_ID=skydoves
+POM_DEVELOPER_NAME=Jaewoong Eum
+POM_DEVELOPER_URL=https://github.com/skydoves/
+
+RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2/
+SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots/
diff --git a/publish.gradle b/publish.gradle
deleted file mode 100644
index 868684f..0000000
--- a/publish.gradle
+++ /dev/null
@@ -1,146 +0,0 @@
-// Designed and developed by 2019 skydoves (Jaewoong Eum)
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-apply plugin: 'com.jfrog.bintray'
-apply plugin: 'maven-publish'
-apply from: "$rootDir/dependencies.gradle"
-
-ext.repository = [
- name : "colorpickerview",
- description: "Android colorpicker for getting colors from any images by tapping on the desired color.",
- websiteUrl : "https://github.com/skydoves/ColorPickerView",
- scm : 'scm:git@github.com/skydoves/ColorPickerView.git'
-]
-
-def (property_user, property_key) = getBintrayProperties()
-bintray {
- user = property_user
- key = property_key
-
- publications = ["release"]
- publish = true
- override = true
- dryRun = false
-
- pkg {
- repo = "maven"
- name = repository.name
- userOrg = "devmagician"
- desc = repository.description
- websiteUrl = repository.websiteUrl
- vcsUrl = "${websiteUrl}.git"
- issueTrackerUrl = "${websiteUrl}/issues"
- licenses = ["Apache-2.0"]
- labels = ["android"]
- publicDownloadNumbers = false
-
- githubRepo = websiteUrl
- githubReleaseNotesFile = "${websiteUrl}/releases"
-
- version {
- desc = repository.description
- name = versions.versionName
- vcsTag = versions.versionName
- released = new Date()
- gpg { sign = true }
- }
- }
-}
-
-afterEvaluate {
- publishing {
- publications {
- release(MavenPublication) {
- from components.release
-
- group = "com.github.skydoves"
- artifactId = repository.name
- version = versions.versionName
-
- artifact androidJavadocsJar
- artifact(sourceJar)
-
- pom {
- name = repository.name
- description = repository.description
- url = repository.websiteUrl
- licenses {
- license {
- name = "The Apache License, Version 2.0"
- url = "http://www.apache.org/licenses/LICENSE-2.0.txt"
- }
- }
- developers {
- developer {
- id = "skydoves"
- name = "Jaewoong Eum"
- }
- }
- scm {
- connection = repository.scm
- developerConnection = repository.scm
- url = repository.websiteUrl
- }
- }
- }
- }
- }
-}
-
-def getBintrayProperties() {
- def filename = "local.properties"
- def propsFile = rootProject.file(filename)
- if (propsFile.exists()) {
- Properties properties = new Properties()
- properties.load(project.rootProject.file(filename).newDataInputStream())
- return [
- properties.getProperty("bintray.user"),
- properties.getProperty("bintray.key")
- ]
- } else {
- print(filename + " does not exist!")
- return ["", ""]
- }
-}
-
-task checkBintrayConfig {
- doLast {
- def (user, key) = getBintrayProperties()
- if (user == null || user.isEmpty() || key == null || key.isEmpty()) {
- throw new IllegalArgumentException(
- "Must specify Bintray information! Check your local.properties file.")
- }
- }
-}
-
-task androidJavadocs(type: Javadoc) {
- source = android.sourceSets.main.java.srcDirs
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
- android.libraryVariants.all { variant ->
- if (variant.name == 'release') {
- owner.classpath += variant.javaCompileProvider.get().classpath
- }
- }
- exclude '**/R.html', '**/R.*.html', '**/index.html'
-}
-
-task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
- archiveClassifier.set('javadoc')
- from androidJavadocs.destinationDir
-}
-
-task sourceJar(type: Jar) {
- from android.sourceSets.main.java.srcDirs
- classifier "sources"
-}
\ No newline at end of file
From 126e779631070e74d291e343f6d61a285ebed06c Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sun, 7 Feb 2021 14:48:41 +0900
Subject: [PATCH 004/100] Add missing plugins and update gradle instructions
---
README.md | 5 ++---
app/build.gradle | 2 --
colorpickerview/build.gradle | 4 ++--
3 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 0146ccb..d80153c 100644
--- a/README.md
+++ b/README.md
@@ -21,7 +21,6 @@ Supports alpha & brightness slider bar, dialog, and saving & restoring selected
## Including in your project
-[ ](https://bintray.com/devmagician/maven/colorpickerview/_latestVersion)
[](https://search.maven.org/search?q=g:%22com.github.skydoves%22%20AND%20a:%22colorpickerview%22)
[](https://jitpack.io/#skydoves/ColorPickerView)
### Gradle
@@ -29,11 +28,11 @@ Add below codes to your **root** `build.gradle` file (not your module build.grad
```gradle
allprojects {
repositories {
- jcenter()
+ mavenCentral()
}
}
```
-And add below dependency code to your **module**'s `build.gradle` file.
+And add a dependency code to your **module**'s `build.gradle` file.
```gradle
dependencies {
implementation "com.github.skydoves:colorpickerview:2.2.2"
diff --git a/app/build.gradle b/app/build.gradle
index 5f08a99..8a02f21 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -38,6 +38,4 @@ dependencies {
implementation project(":colorpickerview")
}
-tasks.withType(Javadoc).all { enabled = false }
-
apply from: "$rootDir/spotless.gradle"
diff --git a/colorpickerview/build.gradle b/colorpickerview/build.gradle
index a8014a3..e0fba87 100644
--- a/colorpickerview/build.gradle
+++ b/colorpickerview/build.gradle
@@ -14,6 +14,7 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
+apply plugin: 'org.jetbrains.dokka'
apply from: "$rootDir/dependencies.gradle"
android {
@@ -34,6 +35,5 @@ dependencies {
implementation "androidx.appcompat:appcompat:$versions.androidxAppcompat"
}
-tasks.withType(Javadoc).all { enabled = false }
-
+apply plugin: "com.vanniktech.maven.publish"
apply from: "$rootDir/spotless.gradle"
\ No newline at end of file
From 47228b1b6087c3ef764dd5027f3160fe8f4f0511 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Tue, 16 Feb 2021 22:49:27 +0900
Subject: [PATCH 005/100] Fix wrong calcuation for the restoring position of
HSVColorPalette
---
.../colorpickerview/ColorHsvPalette.java | 4 +--
.../colorpickerview/ColorPickerView.java | 26 ++++++++++++++++---
.../ColorPickerPreferenceManager.java | 5 ++--
.../sliders/AbstractSlider.java | 17 +++++++++---
.../sliders/AlphaSlideBar.java | 4 +--
.../sliders/BrightnessSlideBar.java | 2 +-
6 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorHsvPalette.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorHsvPalette.java
index ef09274..44ef85d 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorHsvPalette.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorHsvPalette.java
@@ -36,8 +36,8 @@
*/
public class ColorHsvPalette extends BitmapDrawable {
- private Paint huePaint;
- private Paint saturationPaint;
+ private final Paint huePaint;
+ private final Paint saturationPaint;
public ColorHsvPalette(Resources resources, Bitmap bitmap) {
super(resources, bitmap);
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index 0a523dd..f75098e 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -227,6 +227,20 @@ private void onFinishInflated() {
if (getPreferenceName() != null) {
preferenceManager.restoreColorPickerData(this);
+ final int persisted = preferenceManager.getColor(getPreferenceName(), -1);
+ if (palette.getDrawable() instanceof ColorHsvPalette && persisted != -1) {
+ post(
+ new Runnable() {
+ @Override
+ public void run() {
+ try {
+ selectByHsvColor(persisted);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
} else {
selectCenter();
}
@@ -643,8 +657,8 @@ public void setCoordinate(int x, int y) {
*/
public void setInitialColor(@ColorInt final int color) {
if (getPreferenceName() == null
- || (getPreferenceName() != null)
- && preferenceManager.getColor(getPreferenceName(), -1) == -1) {
+ || (getPreferenceName() != null
+ && preferenceManager.getColor(getPreferenceName(), -1) == -1)) {
post(
new Runnable() {
@Override
@@ -691,8 +705,12 @@ public void selectByHsvColor(@ColorInt int color) throws IllegalAccessException
selectedPureColor = color;
selectedColor = color;
selectedPoint = new Point(mappedPoint.x, mappedPoint.y);
- if (getAlphaSlideBar() != null) getAlphaSlideBar().setSelectorPosition(getAlpha());
- if (getBrightnessSlider() != null) getBrightnessSlider().setSelectorPosition(hsv[2]);
+ if (getAlphaSlideBar() != null) {
+ getAlphaSlideBar().setSelectorByHalfSelectorPosition(getAlpha());
+ }
+ if (getBrightnessSlider() != null) {
+ getBrightnessSlider().setSelectorByHalfSelectorPosition(hsv[2]);
+ }
setCoordinate(mappedPoint.x, mappedPoint.y);
fireColorListener(getColor(), false);
notifyToFlagView(selectedPoint);
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
index 673f740..99857d2 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
@@ -35,7 +35,7 @@ public class ColorPickerPreferenceManager {
protected static final String AlphaSlider = "_SLIDER_ALPHA";
protected static final String BrightnessSlider = "_SLIDER_BRIGHTNESS";
private static ColorPickerPreferenceManager colorPickerPreferenceManager;
- private SharedPreferences sharedPreferences;
+ private final SharedPreferences sharedPreferences;
private ColorPickerPreferenceManager(Context context) {
sharedPreferences =
@@ -49,8 +49,9 @@ private ColorPickerPreferenceManager(Context context) {
* @return {@link ColorPickerPreferenceManager}.
*/
public static ColorPickerPreferenceManager getInstance(Context context) {
- if (colorPickerPreferenceManager == null)
+ if (colorPickerPreferenceManager == null) {
colorPickerPreferenceManager = new ColorPickerPreferenceManager(context);
+ }
return colorPickerPreferenceManager;
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
index f500ba0..412bb9d 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
@@ -199,7 +199,16 @@ public void updateSelectorX(int x) {
public void setSelectorPosition(@FloatRange(from = 0.0, to = 1.0) float selectorPosition) {
this.selectorPosition = Math.min(selectorPosition, 1.0f);
- float x = (getMeasuredWidth() * selectorPosition) - getSelectorHalfSize() - getBorderHalfSize();
+ float x = (getMeasuredWidth() * selectorPosition) - getSelectorSize() - getBorderHalfSize();
+ selectedX = (int) getBoundaryX(x);
+ selector.setX(selectedX);
+ }
+
+ public void setSelectorByHalfSelectorPosition(
+ @FloatRange(from = 0.0, to = 1.0) float selectorPosition) {
+ this.selectorPosition = Math.min(selectorPosition, 1.0f);
+ float x =
+ (getMeasuredWidth() * selectorPosition) - (getSelectorSize() * 0.5f) - getBorderHalfSize();
selectedX = (int) getBoundaryX(x);
selector.setX(selectedX);
}
@@ -207,11 +216,11 @@ public void setSelectorPosition(@FloatRange(from = 0.0, to = 1.0) float selector
private float getBoundaryX(float x) {
int maxPos = getMeasuredWidth() - selector.getMeasuredWidth();
if (x >= maxPos) return maxPos;
- if (x <= getSelectorHalfSize()) return 0;
- return x - getSelectorHalfSize();
+ if (x <= getSelectorSize()) return 0;
+ return x - getSelectorSize();
}
- protected int getSelectorHalfSize() {
+ protected int getSelectorSize() {
return (int) (selector.getMeasuredWidth());
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
index dfd37ad..421c0ab 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
@@ -37,7 +37,7 @@
public class AlphaSlideBar extends AbstractSlider {
private Bitmap backgroundBitmap;
- private AlphaTileDrawable drawable = new AlphaTileDrawable();
+ private final AlphaTileDrawable drawable = new AlphaTileDrawable();
public AlphaSlideBar(Context context) {
super(context);
@@ -112,7 +112,7 @@ public void onInflateFinished() {
updateSelectorX(
ColorPickerPreferenceManager.getInstance(getContext())
.getAlphaSliderPosition(getPreferenceName(), defaultPosition)
- + getSelectorHalfSize());
+ + getSelectorSize());
} else {
selector.setX(defaultPosition);
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
index c0a007d..e209c82 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
@@ -97,7 +97,7 @@ public void onInflateFinished() {
updateSelectorX(
ColorPickerPreferenceManager.getInstance(getContext())
.getBrightnessSliderPosition(getPreferenceName(), defaultPosition)
- + getSelectorHalfSize());
+ + getSelectorSize());
} else {
selector.setX(defaultPosition);
}
From a08590d78a92fecaeb9499bc997286edb38825a9 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Tue, 16 Feb 2021 22:50:18 +0900
Subject: [PATCH 006/100] Make inline function for the colorPickerDialog()
extension
---
.../colorpickerview/kotlin/ColorPickerDialogExtension.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt b/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
index 565390d..263c4e3 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/kotlin/ColorPickerDialogExtension.kt
@@ -28,7 +28,7 @@ internal annotation class ColorPickerDsl
* @param block lambda scope for receiving [ColorPickerDialog.Builder].
* @return new instance of [ColorPickerDialog].
*/
-@ColorPickerDsl
@JvmSynthetic
-fun Context.colorPickerDialog(block: ColorPickerDialog.Builder.() -> Unit) =
+@ColorPickerDsl
+inline fun Context.colorPickerDialog(block: ColorPickerDialog.Builder.() -> Unit) =
ColorPickerDialog.Builder(this).apply(block)
From 6434df6c6c7fafd48057a358e533c6239d07c396 Mon Sep 17 00:00:00 2001
From: Jaewoong Eum
Date: Tue, 16 Feb 2021 22:56:23 +0900
Subject: [PATCH 007/100] Add snapshots instructions
---
README.md | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/README.md b/README.md
index d80153c..936affc 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,17 @@ dependencies {
}
```
+## SNAPSHOT
+[](https://oss.sonatype.org/content/repositories/snapshots/com/github/skydoves/colorpickerview/)
+Snapshots of the current development version of ColorPickerView are available, which track [the latest versions](https://oss.sonatype.org/content/repositories/snapshots/com/github/skydoves/colorpickerview/).
+```Gradle
+repositories {
+ maven {
+ url 'https://oss.sonatype.org/content/repositories/snapshots/'
+ }
+}
+```
+
## Table of Contents
From 58e2ed6efeb8175f58ec4c37f555fa62f0fb59b5 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Fri, 19 Feb 2021 00:31:34 +0900
Subject: [PATCH 008/100] Release a new stable version 2.2.3
---
README.md | 2 +-
gradle.properties | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 936affc..52fb342 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ allprojects {
And add a dependency code to your **module**'s `build.gradle` file.
```gradle
dependencies {
- implementation "com.github.skydoves:colorpickerview:2.2.2"
+ implementation "com.github.skydoves:colorpickerview:2.2.3"
}
```
diff --git a/gradle.properties b/gradle.properties
index df7d8b5..bfb1238 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -31,7 +31,7 @@ systemProp.org.gradle.internal.http.socketTimeout=120000
GROUP=com.github.skydoves
POM_PACKAGING=aar
-VERSION_NAME=2.2.3-SNAPSHOT
+VERSION_NAME=2.2.4-SNAPSHOT
POM_ARTIFACT_ID=colorpickerview
POM_NAME=colorpickerview
From 6d6f7254f395655eb1a391b49d5b6d98b09b8510 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Fri, 19 Feb 2021 01:38:15 +0900
Subject: [PATCH 009/100] Update version name and version code for building on
Jitpack
---
dependencies.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index 8062936..25c08b8 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -15,8 +15,8 @@
ext.versions = [
minSdk : 15,
compileSdk : 30,
- versionoCode : 26,
- versionName : '2.2.2',
+ versionoCode : 27,
+ versionName : '2.2.3',
gradleBuildTool : '4.1.1',
spotlessGradle : '5.9.0',
From 7ac5679044f46372ba9c89ef56dfefb0dcafb3e5 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Thu, 10 Jun 2021 21:18:01 +0900
Subject: [PATCH 010/100] Update notifyToFlagView to move over than 0 of y
---
.../colorpickerview/ColorPickerView.java | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index f75098e..fec619e 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -460,16 +460,23 @@ private void notifyToFlagView(Point point) {
if (flagView != null) {
if (flagView.getFlagMode() == FlagMode.ALWAYS) flagView.visible();
int posX = centerPoint.x - flagView.getWidth() / 2 + selector.getWidth() / 2;
- if (centerPoint.y - flagView.getHeight() > 0) {
+ if (flagView.isFlipAble()) {
+ if (centerPoint.y - flagView.getHeight() > 0) {
+ flagView.setRotation(0);
+ flagView.setX(posX);
+ flagView.setY(centerPoint.y - flagView.getHeight());
+ flagView.onRefresh(getColorEnvelope());
+ } else {
+ flagView.setRotation(180);
+ flagView.setX(posX);
+ flagView.setY(centerPoint.y + flagView.getHeight() - selector.getHeight() * 0.5f);
+ flagView.onRefresh(getColorEnvelope());
+ }
+ } else {
flagView.setRotation(0);
flagView.setX(posX);
flagView.setY(centerPoint.y - flagView.getHeight());
flagView.onRefresh(getColorEnvelope());
- } else if (flagView.isFlipAble()) {
- flagView.setRotation(180);
- flagView.setX(posX);
- flagView.setY(centerPoint.y + flagView.getHeight() - selector.getHeight() * 0.5f);
- flagView.onRefresh(getColorEnvelope());
}
if (posX < 0) flagView.setX(0);
if (posX + flagView.getMeasuredWidth() > getMeasuredWidth()) {
From bba75484a245c712a6b8c7b73d8591f577a3dc25 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Thu, 10 Jun 2021 21:20:40 +0900
Subject: [PATCH 011/100] Bump maven publish version and AGP
---
dependencies.gradle | 14 +++++++-------
gradle.properties | 3 ---
2 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index 25c08b8..b13ee74 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -15,16 +15,16 @@
ext.versions = [
minSdk : 15,
compileSdk : 30,
- versionoCode : 27,
- versionName : '2.2.3',
+ versionoCode : 28,
+ versionName : '2.2.4',
- gradleBuildTool : '4.1.1',
- spotlessGradle : '5.9.0',
+ gradleBuildTool : '4.1.3',
+ spotlessGradle : '5.12.4',
ktlintGradle : '0.40.0',
- dokkaGradle : '1.4.20',
- mavenPublish : '0.13.0',
+ dokkaGradle : '1.4.32',
+ mavenPublish : '0.15.1',
- kotlin : '1.4.20',
+ kotlin : '1.4.32',
androidxAppcompat: '1.2.0',
// for demo
diff --git a/gradle.properties b/gradle.properties
index bfb1238..73586f8 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -49,6 +49,3 @@ POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=skydoves
POM_DEVELOPER_NAME=Jaewoong Eum
POM_DEVELOPER_URL=https://github.com/skydoves/
-
-RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2/
-SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots/
From e03f3735e323de53873473e4d0636a82038459f4 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Thu, 10 Jun 2021 21:23:49 +0900
Subject: [PATCH 012/100] Change alpha relavant attributes names
---
.../colorpickerview/ColorPickerView.java | 30 +++++++++----------
.../src/main/res/values/attrs_colorpicker.xml | 6 ++--
2 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index fec619e..64bba71 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -87,10 +87,10 @@ public class ColorPickerView extends FrameLayout implements LifecycleObserver {
private ActionMode actionMode = ActionMode.ALWAYS;
@FloatRange(from = 0.0, to = 1.0)
- private float alpha_selector = 1.0f;
+ private float selector_alpha = 1.0f;
@FloatRange(from = 0.0, to = 1.0)
- private float alpha_flag = 1.0f;
+ private float flag_alpha = 1.0f;
@Px private int selectorSize = 0;
@@ -135,16 +135,16 @@ private void getAttrs(AttributeSet attrs) {
this.selectorDrawable = AppCompatResources.getDrawable(getContext(), resourceId);
}
}
- if (a.hasValue(R.styleable.ColorPickerView_alpha_selector)) {
- this.alpha_selector =
- a.getFloat(R.styleable.ColorPickerView_alpha_selector, alpha_selector);
+ if (a.hasValue(R.styleable.ColorPickerView_selector_alpha)) {
+ this.selector_alpha =
+ a.getFloat(R.styleable.ColorPickerView_selector_alpha, selector_alpha);
}
if (a.hasValue(R.styleable.ColorPickerView_selector_size)) {
this.selectorSize =
a.getDimensionPixelSize(R.styleable.ColorPickerView_selector_size, selectorSize);
}
- if (a.hasValue(R.styleable.ColorPickerView_alpha_flag)) {
- this.alpha_flag = a.getFloat(R.styleable.ColorPickerView_alpha_flag, alpha_flag);
+ if (a.hasValue(R.styleable.ColorPickerView_flag_alpha)) {
+ this.flag_alpha = a.getFloat(R.styleable.ColorPickerView_flag_alpha, flag_alpha);
}
if (a.hasValue(R.styleable.ColorPickerView_actionMode)) {
int actionMode = a.getInteger(R.styleable.ColorPickerView_actionMode, 0);
@@ -193,7 +193,7 @@ private void onCreate() {
}
selectorParam.gravity = Gravity.CENTER;
addView(selector, selectorParam);
- selector.setAlpha(alpha_selector);
+ selector.setAlpha(selector_alpha);
getViewTreeObserver()
.addOnGlobalLayoutListener(
@@ -260,8 +260,8 @@ protected void onCreateByBuilder(Builder builder) {
this.paletteDrawable = builder.paletteDrawable;
this.selectorDrawable = builder.selectorDrawable;
- this.alpha_selector = builder.alpha_selector;
- this.alpha_flag = builder.alpha_flag;
+ this.selector_alpha = builder.alpha_selector;
+ this.flag_alpha = builder.alpha_flag;
this.selectorSize = builder.selectorSize;
this.debounceDuration = builder.debounceDuration;
onCreate();
@@ -429,10 +429,10 @@ public void fireColorListener(@ColorInt int color, final boolean fromUser) {
if (VISIBLE_FLAG) {
VISIBLE_FLAG = false;
if (this.selector != null) {
- this.selector.setAlpha(alpha_selector);
+ this.selector.setAlpha(selector_alpha);
}
if (this.flagView != null) {
- this.flagView.setAlpha(alpha_flag);
+ this.flagView.setAlpha(flag_alpha);
}
}
}
@@ -548,7 +548,7 @@ public void setFlagView(@NonNull FlagView flagView) {
flagView.gone();
addView(flagView);
this.flagView = flagView;
- flagView.setAlpha(alpha_flag);
+ flagView.setAlpha(flag_alpha);
}
/**
@@ -775,11 +775,11 @@ public void setPaletteDrawable(Drawable drawable) {
if (!VISIBLE_FLAG) {
VISIBLE_FLAG = true;
if (selector != null) {
- alpha_selector = selector.getAlpha();
+ selector_alpha = selector.getAlpha();
selector.setAlpha(0.0f);
}
if (flagView != null) {
- alpha_flag = flagView.getAlpha();
+ flag_alpha = flagView.getAlpha();
flagView.setAlpha(0.0f);
}
}
diff --git a/colorpickerview/src/main/res/values/attrs_colorpicker.xml b/colorpickerview/src/main/res/values/attrs_colorpicker.xml
index 61f2d9c..c2181dd 100644
--- a/colorpickerview/src/main/res/values/attrs_colorpicker.xml
+++ b/colorpickerview/src/main/res/values/attrs_colorpicker.xml
@@ -8,9 +8,11 @@
-
+
-
+
+
+
From 00c3894fb953b4f379826a6db101172fd10e79af Mon Sep 17 00:00:00 2001
From: skydoves
Date: Thu, 10 Jun 2021 21:26:59 +0900
Subject: [PATCH 013/100] Apply flag_isFlipAble attribute by the defined styles
---
.../colorpickerview/ColorPickerView.java | 26 ++++++++++++++-----
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index 64bba71..4cf8b4d 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -92,6 +92,8 @@ public class ColorPickerView extends FrameLayout implements LifecycleObserver {
@FloatRange(from = 0.0, to = 1.0)
private float flag_alpha = 1.0f;
+ private boolean flag_isFlipAble = true;
+
@Px private int selectorSize = 0;
private boolean VISIBLE_FLAG = false;
@@ -146,6 +148,10 @@ private void getAttrs(AttributeSet attrs) {
if (a.hasValue(R.styleable.ColorPickerView_flag_alpha)) {
this.flag_alpha = a.getFloat(R.styleable.ColorPickerView_flag_alpha, flag_alpha);
}
+ if (a.hasValue(R.styleable.ColorPickerView_flag_isFlipAble)) {
+ this.flag_isFlipAble =
+ a.getBoolean(R.styleable.ColorPickerView_flag_isFlipAble, flag_isFlipAble);
+ }
if (a.hasValue(R.styleable.ColorPickerView_actionMode)) {
int actionMode = a.getInteger(R.styleable.ColorPickerView_actionMode, 0);
if (actionMode == 0) {
@@ -260,8 +266,8 @@ protected void onCreateByBuilder(Builder builder) {
this.paletteDrawable = builder.paletteDrawable;
this.selectorDrawable = builder.selectorDrawable;
- this.selector_alpha = builder.alpha_selector;
- this.flag_alpha = builder.alpha_flag;
+ this.selector_alpha = builder.selector_alpha;
+ this.flag_alpha = builder.flag_alpha;
this.selectorSize = builder.selectorSize;
this.debounceDuration = builder.debounceDuration;
onCreate();
@@ -549,6 +555,7 @@ public void setFlagView(@NonNull FlagView flagView) {
addView(flagView);
this.flagView = flagView;
flagView.setAlpha(flag_alpha);
+ flagView.setFlipAble(flag_isFlipAble);
}
/**
@@ -959,10 +966,12 @@ public static class Builder {
@ColorInt private int initialColor = 0;
@FloatRange(from = 0.0, to = 1.0)
- private float alpha_selector = 1.0f;
+ private float selector_alpha = 1.0f;
@FloatRange(from = 0.0, to = 1.0)
- private float alpha_flag = 1.0f;
+ private float flag_alpha = 1.0f;
+
+ private boolean flag_isFlipAble = false;
@Dp private int selectorSize = 0;
@Dp private int width = LayoutParams.MATCH_PARENT;
@@ -1015,12 +1024,17 @@ public Builder setActionMode(ActionMode actionMode) {
}
public Builder setSelectorAlpha(@FloatRange(from = 0.0, to = 1.0) float alpha) {
- this.alpha_selector = alpha;
+ this.selector_alpha = alpha;
return this;
}
public Builder setFlagAlpha(@FloatRange(from = 0.0, to = 1.0) float alpha) {
- this.alpha_flag = alpha;
+ this.flag_alpha = alpha;
+ return this;
+ }
+
+ public Builder setFlagIsFlipAble(boolean isFlipAble) {
+ this.flag_isFlipAble = isFlipAble;
return this;
}
From 003b740ef7a3e05da62dce22cc4583b442507fd8 Mon Sep 17 00:00:00 2001
From: Nishanth-Risor <80327176+Nishanth-Risor@users.noreply.github.com>
Date: Fri, 11 Jun 2021 09:27:39 +0530
Subject: [PATCH 014/100] added getSelector function
---
.../com/skydoves/colorpickerview/ColorPickerView.java | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index f75098e..3f4b8df 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -578,7 +578,14 @@ public void setDebounceDuration(long debounceDuration) {
private Point getCenterPoint(int x, int y) {
return new Point(x - (selector.getMeasuredWidth() / 2), y - (selector.getMeasuredHeight() / 2));
}
-
+ /**
+ * gets selector.
+ *
+ * @return selector.
+ */
+ public ImageView getSelector() {
+ return this.selector;
+ }
/**
* gets a selector's selected coordinate x.
*
From 552175b3e0304668964aefd9aad65c0f464cf173 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Fri, 11 Jun 2021 23:25:48 +0900
Subject: [PATCH 015/100] Remove unused jcenter repository
---
build.gradle | 2 --
.../main/java/com/skydoves/colorpickerview/ColorPickerView.java | 2 +-
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/build.gradle b/build.gradle
index c7442ef..dce94da 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,7 +15,6 @@
buildscript {
apply from: "$rootDir/dependencies.gradle"
repositories {
- jcenter()
mavenCentral()
google()
}
@@ -30,7 +29,6 @@ buildscript {
allprojects {
repositories {
- jcenter()
mavenCentral()
google()
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index 893fae3..9b795dc 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -593,7 +593,7 @@ private Point getCenterPoint(int x, int y) {
return new Point(x - (selector.getMeasuredWidth() / 2), y - (selector.getMeasuredHeight() / 2));
}
/**
- * gets selector.
+ * gets a selector.
*
* @return selector.
*/
From 5d95dd2dc59854693511a8778cd9259e21933fdc Mon Sep 17 00:00:00 2001
From: skydoves
Date: Fri, 11 Jun 2021 23:28:30 +0900
Subject: [PATCH 016/100] Bump powermenu to 2.1.9 for demo
---
dependencies.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index b13ee74..875b07b 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -29,6 +29,6 @@ ext.versions = [
// for demo
googleMaterial : '1.3.0-alpha02',
- powermenu : '2.1.3',
+ powermenu : '2.1.9',
timber : '4.7.1'
]
From c17314066dc8061c519644c8c562b472873c2214 Mon Sep 17 00:00:00 2001
From: Jaewoong Eum
Date: Sat, 10 Jul 2021 16:25:36 +0900
Subject: [PATCH 017/100] Add a google developer library badge
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 52fb342..d296f63 100644
--- a/README.md
+++ b/README.md
@@ -7,10 +7,10 @@ Supports alpha & brightness slider bar, dialog, and saving & restoring selected
+ 
-
From 6fa66695335bfa5eedbeeb4e6ab63d210541862c Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 13 Nov 2021 21:08:36 +0900
Subject: [PATCH 018/100] Update AGP and dependencies
---
app/build.gradle | 4 ++--
app/src/main/AndroidManifest.xml | 4 +++-
dependencies.gradle | 8 ++++----
gradle/wrapper/gradle-wrapper.properties | 2 +-
4 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 8a02f21..568f6fc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -26,8 +26,8 @@ android {
versionName versions.versionName
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
}
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cc3e710..566c193 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,7 +13,9 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
-
+
diff --git a/dependencies.gradle b/dependencies.gradle
index 875b07b..04b4bec 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -14,13 +14,13 @@
ext.versions = [
minSdk : 15,
- compileSdk : 30,
+ compileSdk : 31,
versionoCode : 28,
versionName : '2.2.4',
- gradleBuildTool : '4.1.3',
- spotlessGradle : '5.12.4',
- ktlintGradle : '0.40.0',
+ gradleBuildTool : '7.0.2',
+ spotlessGradle : '5.15.0',
+ ktlintGradle : '0.41.0',
dokkaGradle : '1.4.32',
mavenPublish : '0.15.1',
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 93d8db4..fd9e2e1 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -17,4 +17,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
From 082e515230ebbc8291e002033585e079db4b4285 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 13 Nov 2021 21:13:21 +0900
Subject: [PATCH 019/100] Refactor codes
---
.../colorpickerview/ColorPickerView.java | 43 ++++++++-----------
1 file changed, 17 insertions(+), 26 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index 9b795dc..a5595ae 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -236,14 +236,11 @@ private void onFinishInflated() {
final int persisted = preferenceManager.getColor(getPreferenceName(), -1);
if (palette.getDrawable() instanceof ColorHsvPalette && persisted != -1) {
post(
- new Runnable() {
- @Override
- public void run() {
- try {
- selectByHsvColor(persisted);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
+ () -> {
+ try {
+ selectByHsvColor(persisted);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
}
});
}
@@ -339,12 +336,9 @@ public boolean isHuePalette() {
private void notifyColorChanged() {
this.debounceHandler.removeCallbacksAndMessages(null);
Runnable debounceRunnable =
- new Runnable() {
- @Override
- public void run() {
- fireColorListener(getColor(), true);
- notifyToFlagView(selectedPoint);
- }
+ () -> {
+ fireColorListener(getColor(), true);
+ notifyToFlagView(selectedPoint);
};
this.debounceHandler.postDelayed(debounceRunnable, this.debounceDuration);
}
@@ -471,19 +465,17 @@ private void notifyToFlagView(Point point) {
flagView.setRotation(0);
flagView.setX(posX);
flagView.setY(centerPoint.y - flagView.getHeight());
- flagView.onRefresh(getColorEnvelope());
} else {
flagView.setRotation(180);
flagView.setX(posX);
flagView.setY(centerPoint.y + flagView.getHeight() - selector.getHeight() * 0.5f);
- flagView.onRefresh(getColorEnvelope());
}
} else {
flagView.setRotation(0);
flagView.setX(posX);
flagView.setY(centerPoint.y - flagView.getHeight());
- flagView.onRefresh(getColorEnvelope());
}
+ flagView.onRefresh(getColorEnvelope());
if (posX < 0) flagView.setX(0);
if (posX + flagView.getMeasuredWidth() > getMeasuredWidth()) {
flagView.setX(getMeasuredWidth() - flagView.getMeasuredWidth());
@@ -592,6 +584,7 @@ public void setDebounceDuration(long debounceDuration) {
private Point getCenterPoint(int x, int y) {
return new Point(x - (selector.getMeasuredWidth() / 2), y - (selector.getMeasuredHeight() / 2));
}
+
/**
* gets a selector.
*
@@ -600,6 +593,7 @@ private Point getCenterPoint(int x, int y) {
public ImageView getSelector() {
return this.selector;
}
+
/**
* gets a selector's selected coordinate x.
*
@@ -681,14 +675,11 @@ public void setInitialColor(@ColorInt final int color) {
|| (getPreferenceName() != null
&& preferenceManager.getColor(getPreferenceName(), -1) == -1)) {
post(
- new Runnable() {
- @Override
- public void run() {
- try {
- selectByHsvColor(color);
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
+ () -> {
+ try {
+ selectByHsvColor(color);
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
}
});
}
@@ -961,7 +952,7 @@ public void onDestroy() {
/** Builder class for create {@link ColorPickerView}. */
public static class Builder {
- private Context context;
+ private final Context context;
private ColorPickerViewListener colorPickerViewListener;
private int debounceDuration = 0;
private FlagView flagView;
From f21d5c9f72dc6bc25768bc30967f7bc5a5860536 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 13 Nov 2021 21:14:49 +0900
Subject: [PATCH 020/100] Update GitHub workflows
---
.github/workflows/android.yml | 57 +++++++++++++++++++++++++----------
1 file changed, 41 insertions(+), 16 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index e47cef2..1db9de8 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -1,24 +1,49 @@
name: Android CI
on:
- push:
- branches:
- - master
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
jobs:
- build:
+ lint:
+ name: Spotless check
+ runs-on: ubuntu-18.04
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v2
+ - name: Set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 11
+ - name: spotless
+ run: ./gradlew spotlessCheck
+ build:
runs-on: ubuntu-latest
-
steps:
- - uses: actions/checkout@v2
- - name: set up JDK 1.8
- uses: actions/setup-java@v1
- with:
- java-version: 1.8
- - name: Make Gradle executable
- run: chmod +x ./gradlew
- - name: Build with Gradle
- run: ./gradlew build
- - name: Build Debug APK
- run: ./gradlew assembleDebug
+ - uses: actions/checkout@v2
+
+ - name: set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 11
+
+ - name: Cache Gradle and wrapper
+ uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ - name: Make Gradle executable
+ run: chmod +x ./gradlew
+
+ - name: Build with Gradle
+ run: ./gradlew build
From b485bcd6f0546ca4d53bef0a5766d96c6fccad84 Mon Sep 17 00:00:00 2001
From: janaltenhof <51320528+janaltenhof@users.noreply.github.com>
Date: Mon, 22 Nov 2021 14:34:15 +0100
Subject: [PATCH 021/100] - Bugfix: notify flag view when ActionMode is set to
LAST
---
.../main/java/com/skydoves/colorpickerview/ColorPickerView.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index a5595ae..d2dcd20 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -316,6 +316,7 @@ private boolean onTouchReceived(final MotionEvent event) {
setCoordinate(snapPoint.x, snapPoint.y);
if (actionMode == ActionMode.LAST) {
+ notifyToFlagView(this.selectedPoint);
if (event.getAction() == MotionEvent.ACTION_UP) {
notifyColorChanged();
}
From bb05f3e019bba90a73e4dbc1f4f9539c226e0f94 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Thu, 25 Nov 2021 20:09:20 +0900
Subject: [PATCH 022/100] Prepare the next release
---
README.md | 2 +-
gradle.properties | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index d296f63..ef4f7a0 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ allprojects {
And add a dependency code to your **module**'s `build.gradle` file.
```gradle
dependencies {
- implementation "com.github.skydoves:colorpickerview:2.2.3"
+ implementation "com.github.skydoves:colorpickerview:2.2.4"
}
```
diff --git a/gradle.properties b/gradle.properties
index 73586f8..46bf6ee 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -31,7 +31,7 @@ systemProp.org.gradle.internal.http.socketTimeout=120000
GROUP=com.github.skydoves
POM_PACKAGING=aar
-VERSION_NAME=2.2.4-SNAPSHOT
+VERSION_NAME=2.2.5-SNAPSHOT
POM_ARTIFACT_ID=colorpickerview
POM_NAME=colorpickerview
From 7e4da71aebcf8a6e09296c5d0ca9102cd20653b2 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 5 Mar 2022 13:36:56 +0900
Subject: [PATCH 023/100] Bump AGP to 7.1.2 and Kotlin to 1.5.32
---
dependencies.gradle | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index 04b4bec..a315e41 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -18,17 +18,17 @@ ext.versions = [
versionoCode : 28,
versionName : '2.2.4',
- gradleBuildTool : '7.0.2',
- spotlessGradle : '5.15.0',
+ gradleBuildTool : '7.1.2',
+ spotlessGradle : '6.2.1',
ktlintGradle : '0.41.0',
dokkaGradle : '1.4.32',
- mavenPublish : '0.15.1',
+ mavenPublish : '0.18.0',
- kotlin : '1.4.32',
+ kotlin : '1.5.32',
androidxAppcompat: '1.2.0',
// for demo
- googleMaterial : '1.3.0-alpha02',
+ googleMaterial : '1.5.0',
powermenu : '2.1.9',
- timber : '4.7.1'
+ timber : '5.0.1'
]
From d1ddac9395ff191d7d6b690fba2e3f33bf41f5f9 Mon Sep 17 00:00:00 2001
From: Jaewoong Eum
Date: Sat, 23 Apr 2022 23:06:34 +0900
Subject: [PATCH 024/100] Update README.md
---
README.md | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index ef4f7a0..4c107e6 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,6 @@
ColorPickerView
-🎨 ColorPickerView implements getting HSV colors, ARGB values, Hex color codes from
-any image drawables or your gallery pictures by tapping on the desired color.
-Supports alpha & brightness slider bar, dialog, and saving & restoring selected data.
+🎨 ColorPickerView implements getting HSV colors, ARGB values, Hex color codes from any image drawables or your gallery pictures by tapping on the desired color. It also supports alpha & brightness slider bar, dialog, and saving & restoring selected data.
@@ -22,7 +20,7 @@ Supports alpha & brightness slider bar, dialog, and saving & restoring selected
## Including in your project
[](https://search.maven.org/search?q=g:%22com.github.skydoves%22%20AND%20a:%22colorpickerview%22)
-[](https://jitpack.io/#skydoves/ColorPickerView)
+
### Gradle
Add below codes to your **root** `build.gradle` file (not your module build.gradle file).
```gradle
From 8ceddc71a75efdcb6679669a581e1b24a81e433b Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 23 Apr 2022 23:10:35 +0900
Subject: [PATCH 025/100] Bump appcompat to 1.4.0
---
dependencies.gradle | 5 ++---
spotless.gradle | 2 +-
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index a315e41..c68662c 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -19,13 +19,12 @@ ext.versions = [
versionName : '2.2.4',
gradleBuildTool : '7.1.2',
- spotlessGradle : '6.2.1',
- ktlintGradle : '0.41.0',
+ spotlessGradle : '6.3.0',
dokkaGradle : '1.4.32',
mavenPublish : '0.18.0',
kotlin : '1.5.32',
- androidxAppcompat: '1.2.0',
+ androidxAppcompat: '1.4.0',
// for demo
googleMaterial : '1.5.0',
diff --git a/spotless.gradle b/spotless.gradle
index 009d2a6..a37519b 100644
--- a/spotless.gradle
+++ b/spotless.gradle
@@ -24,7 +24,7 @@ spotless {
}
kotlin {
target "**/*.kt"
- ktlint("$versions.ktlintGradle").userData(['indent_size': '2', 'continuation_indent_size': '2'])
+ ktlint().userData(['indent_size': '2', 'continuation_indent_size': '2'])
licenseHeaderFile "$rootDir/spotless.license.java"
trimTrailingWhitespace()
endWithNewline()
From 8cec21603e5d08d2543d164576358859604b694e Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 23 Apr 2022 23:11:32 +0900
Subject: [PATCH 026/100] Bump Gradle to 7.4.2
---
app/build.gradle | 2 +-
dependencies.gradle | 4 +-
gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59536 bytes
gradle/wrapper/gradle-wrapper.properties | 17 +-
gradlew | 257 ++++++++++++++---------
gradlew.bat | 193 ++++++++---------
6 files changed, 246 insertions(+), 227 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 568f6fc..3558e95 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,4 @@
-// Designed and developed by 2019 skydoves (Jaewoong Eum)
+// Designed and developed by 2017 skydoves (Jaewoong Eum)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
diff --git a/dependencies.gradle b/dependencies.gradle
index c68662c..0228e96 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -1,4 +1,4 @@
-// Designed and developed by 2019 skydoves (Jaewoong Eum)
+// Designed and developed by 2017 skydoves (Jaewoong Eum)
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -28,6 +28,6 @@ ext.versions = [
// for demo
googleMaterial : '1.5.0',
- powermenu : '2.1.9',
+ powermenu : '2.2.0',
timber : '5.0.1'
]
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 62d4c053550b91381bbd28b1afc82d634bf73a8a..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644
GIT binary patch
delta 18328
zcmY(KV|Snp(4;dlC$??dwr$%s?%1|%+Y{TEB$J74XJYKL?}t6_{)RqPefp~E{28#s
zMX<&I7zFQD-2pam5RgAmARxjiNx~Q@eb6u|)i9L6jw-G?+Lr@IPMA5WiWC)^j?e}U
zD7iWE@!V0LVEYpjM=!-_G-j1dk20uwjkq>!`+4(Xkt6o-|jrlKp7EEb=pWN^Cb%UFSjMVtrh&&jh&(3&&Vz
zcKd9bC@*3rdk-IDdhKyay<~pt5W2vLi+beI>IM*s9tUt*Tie5L!O&Oa+YxxyZ>XQ3
z*!CqyZc&Lp<-7_Dq9qyQYk&)mBB!iu=|iO1D$Wb90#Xq}qtc4I>k6*aFOO`|o{~CB&AzSl{m8ypK)KV5tzuj)?Yxgxq@0
zVju*z4j_?AVwN166T>$_hihYLmz(Bd%S>UDV3OWrqg0d1-n1=yX`@qg&@)zuF|(%>
zvyoT-_`5(3rh$4^jH_N;Z=0<)c`DXh`)~WK?|^*4?;-^O@2}7_=0;h`8X;q;xOK*^ge-w%rmKGYl8TS{qf^OvGJ?{V8_Hs2n
z6Fg+)$u6GZ5;%iLoZ$-O5qQyj*+m^*-)K!K%|qioyXNlccYVs;;qG}}d?*NjbiyGA
zlVrvz+iMLH=&kw9s@xm#oc0(Lgy_6FfCY@X=dvQH2T}<{@AhUhx*d>Exama~A`O`2NhqWxtc4c+GTCrij|T4+AQta`%_O9hkBcP
zr1j+;KBy*X<`YG%=Omk4RAI&K(*1Ol{fIG=El(R&Yzylv?UlZS8)J+PdNu2F{R^0l
z%I;^t-(d;6@qz!SK9FiKim_2gq1ZV)Jv4wq^8~ctTFm%9loa_HC0~
zOA9s##RyE$k321P$&vs38KOQp_Mdl|0*^+T@RVP(h=hC@tuB2reduHA&qPTh(!?)d
z(L0?n9EX<#^J(+-W{+jb?R;dhIB+
zdR#Keem4GG?N(a(&VFN)7=ZWUV65+jnor4bW-L>t3H$r;J+wtdiqSZ6dr!cpMw_qR
z0a=>Z>Rd&cvR~mZ_7Yom+{^;v0*fxRzif8+51bxoFupNdwtFECCs4;lJdM1q+gnC!
z<80e3o}rz+1i@t~_kfex62FF3H>Jr{T>q^om(x0|35CFgGaKDKip;j+C
z2md{8H;QCAAxRS-pUOC`?&&YZ!9E{BDJclw=sv1}8?=4Yw?Mu!#|75hQ9`ZJg3geB
zqkTuUTg61Va8Ltr#%+okq$0;X{A8^4SW@w1lG0TvcKL6~LjH)V63h2zLNC0LJ*AK!
zX%=YeJ{D13qxT2SPSH3kF7+iQ^$>_9=w@MbmmqTjM-gvC<)g6)g%YPTMuMW-Hzxn4
zZ;1b2&k0V7Gt?*`Ae9s#AjJQpXM@$Bz^FEim+nfMz_`wK%Ol=~%)Xd3G-xxIfiyJC
zAEQWoDB8PZEstPS5wE6vd-7(o(h9m%^3-x)E!bANGPk18vV{c{?m?kKdKlj`JGZB^
z);wy~nLZDzi?8QCO6}$_>64tB9KSpN=X~Gmu9N(S0@v#{!|z#FMwCUGFJ-
z6+G+bJN@ji3aDE6_L>kU^g4BZOUnq5@4s6zWeW99gutc1<*vHIydG5|MNTctl8siaqnUD8FY~jc~)hS?qMOPcXN29SA>ln
zcCA|Pq-aI&hUBgxxDWv2^f`6!Q#wi`Fc`&*60ds=Kqus2(heWjBvnYC3r}6XxsD^~oIIDZ5
zj}(NjP%N&V7Th;W?kx~MQ#&d*Yn-GK-_))(y=z1$(YKHHYP^Mxu0+OuhBYXARZOi_
z_sSk!sI97R)4SoJ^+c$1s1c}mYaJn{k<#2KdpBrdse7sIVWnWij>eklswtMmqAhn_
z#1Zr3v#*Umj~6@h_i|$cgbFxSYL;Z?I7VjoL2kRd-L2dvBQq0)4r9V}H#ghAw_56a
z*H)jll^QE>?ecsd{e4W;5)e4UXUxbrHfPjUF%rt;_$?e(O02CgEbrT&9RDnA_t2tk
zZqJPfLn*T}&;H%qa8-BorE0CI18c?~GF_;ztLW+ZRfouXc@F0Rv^_sQU!B8xctDC?
zWoi=+?H{4beQiIvU&OF5b(P%h89T>^<=q`R9XP2VO2&k84HO&C0dEYa~{S8;QMsJar&luegcF
z8Ctv(=I>Tllo|K#@ezPu=;938xq01uj0=6kpCPVO38qpik8Y@VH@yoIO56+e>XutU|mV
z<)N0}3msacg~xKw+X|Zh`_4Ik`nUtpY}s;v)&M=gcmG{Epsgca*#(V+7Y$FkRDR5k
zeH(8xSQ>7>l^AR%I11m=)X!-(9XEo@DOMbwT6wzHxIidfn}|NiU{^XLHIvR?<3vyN
zH^68?DpHybsGqpTj?I!_DVJ;_%412s2uI)rK`@VNJY4FrvL6+H$fC*vpFy}K9hmZNc?
zE70~T?tQ`%PB2SmVkkP#L|2UoRsnTf+2iZ9jXm>=Co$U!qbcFV=F!|os>Jt9T31iKKb&T_F7Ivrj
zj<`?#AmPCt2M9)Fon=rdVEZB?Tzye}%pWVj_%(lP$^M4tZ%{(&CRMU=hD5Ug52XX#
zBR`8&jub4P{_IvQsW`PZG9O_>MSw~A@7!Vg;v*EEL;n4n4BI2udihLKzG?mncBkkr
z&o5)laJPrO4@$BE9)I~X;xT^g`5rTAwWX^}-9m~qw;(8S|DM(HD>d<(d~vhl?(-v1
zqF)gxTx2}ue^H>)W4tTB3;8hDBenz<^baClXmJGTvK#K#*uHoG(F4hs99Y5XJLLem
zgYnn)+72<4%gHbthemDYpidtfB;+&hEQL&oPT|w1&>=;e5BdO^gNoM;Ij?N|V%7@RvEb`727q{`UCsmnPc$nfO5#lW$hBTI2tyeKNB(qWUm@<70P67Ae9
z(dj-!`+zy91+|!)TH!PIG%n`Yn@#Hu)Q(e>MZzQJcLU}qjPH^B+%}OrbmpCqh+=tc
z;GdKL3Bhr4rG420%vZGKJ^Krvo{%j~h&R=JCVYSY959wPC|FltqIg~_p@hLXYEvZ6
zpaHWtj2yFROOO~)O=(Z4p#i|3rJ0xB3kNi(1QMl3D?NH3I>^moSP5)j&kj>j!l98i
zYC}bPe(%r+Gz`@d)V%6_o}&X-xxzRRU`aab@_AteBj4G$}h<1&6^
z2;stAmDAbOp~c}DMFR$!iGD@L84QK*5JkGHP
zVg;3C1cuw;F?cON%Z7Wo(0VVgPVC&GuL0h-v-Dz*eA=wQcG*%BZjo?lqvU`fNl7ik
zw_=1&jpzemroS2&CJU&>$*KmOmsMH30^$am2ZZ;$Qkvo{(oX)@OWt#G(k|rn=2Z0N
z5Y~hh1$a<C(sZ3s8CB3YR&PV{bYPR9$1X
zabcS%2_v|OhKLN$URPel+jr3`rZ|l!21W~;1K~=KK~<#**nwnLCG{V^t4{kGJjE5=
zabV?sD0bue+!Rn@&+(gSQwaK;*aMw5$3qGbvwa=BDEmHs(*GXImZ`;$9Nz?e^`b7S
zO|`U)wUOPU9RfyYGz+pQGHO$C6-cb7Zj$(@hg%(SB6E6qO@0)l67LmK3bzXBCjA>Z
z^qu1G=ERc*r2!aN8JIHlF{y
zEx{gl4{taG-ZB`{v>c{eY`Fq8@l$=ICVjXh3m|;aMs|AnLeTmeM_fToet@vP6Mg65GTD2T1an>-?In1UwWmuhF_JWd9;TeHEkoOGGPgj7oYfWN*FP&8Sm@^Vbq8wNl>S?@z9zD!^9w^En!#8gSFDp2BavIvvUSYnphLnyr!a^1h;@a)zQKld(i$
zQ|w@qt^?KhuA(DhSkzDqMSp7h=I+r6Q5mIh|{qo~>5C2j`fqJ@z>4kmxyq-D%c=0WNy%fic-}EA5V*
zyrTa$MYc}AYi#viBf5O_4on6OHfWuTw|MyZm1D?GR?!%Rra3!*14oq!;I@aOc&6ic
z_Lrr9y1~NgXdrtjIl}q`MklQ(=DMQUS%-hO$18Ru)!=ePKEEw`^9otR44kwSHRB
zjJ1OD{5SYEys~%-aXT&rK$FC7?Nx{MH^p4X_FB9_ILAvGbN9KLs<$(7G}1n!;6Hde
zftc;`=O9(TE|e$#0?X+Jh(IVLuc18hR)o`T9K8)|<|{FwYtZBR67^EjOi!@25a=tW
zf1vhYY_VC$N+fLHhFPr{4#iZ>7I>8k1D4Vw+OPubXTGh3?>kaAK=8r*sl^)%(wD2*
z;`15NC+QZ5yu+cm8)|_h=K~AR2)i3C=YoAN%DRTpv4D{&I?7+HRq8+7@|4i8a6Njm
z^FbA8*&|kX{D_b1vh&Muk>A8t&m=zPT;te0VTZ>f4wwtm3zEoEQzl6KxFM(7Saf@E
zXYY?-E<#Z4Yu%msfPpYtS0Z$V(0+|jDRivo1aHvn6k4@vrD)L_nvZ@FCz_9HQHL2Q
zEGjSZA}YwYoE}{lLuGd0y^OLzYAQ@_lTq>|wZ>_5qllv-5sW&TY2$Yg#4PyFS7YBp
z@j{vaPixD}93#u5n)C50QxI~p2`i3$OVj`{`LiL#XRLpCzy)3fJy_rNUuM|6}|b7dk3hapQQ`DWg+5Ef`k(ll2ZHffJg=8AvP~J$h#=^FlRvRYZ=I18YUD-3Y%LsL!
z4yicM)Apce+DS#%+*V#aEKYTH7{=k;^ur&od3GF_3EWKhc5lN(i8#0~upcDC!?X1Q
zDt5x8O$U@OaOW1FvBC|CCzxwDX*DF^G~e>{VtXd3fh~3#7K#sblI4FGT>Y3uK5%{M
zaW+QSB2qPtUw)~1kZQrQN%U{Ok4;YcvpSQ
zEu4`=d2#h}0_SMA>L}j+fcPZ$`6a~$gyj!RB<0p6NcHT8N6G$GJZ&f{X>_7blQZ&-
z2xSI61u94&pX5OJ=kQ>_rALzsh)=YnFw#`HTI4mxGi&1;#WL{5T86K?m)#idPepKr
zD_!i-<*{Xc>q7HD_UZ$45yTfiANf>P;0Bgsq^c?cV>2Eam(zI_b4EBrJlQ|vdb{W)
zlHWG)Jd`W}dHU5Oh?M@qXS*3S6Vx9oJ!RFCKy7uNOC}9pWEO8EUU`eCnk4gf25!%x
z7vOODgkPyduEewlhXDPxUi4#to^AK3M+7W-2OmetRul~Vnukrs{}ddbFP-*XgY8%F
za-PID{Kp+l@hSVc2*Y1#N2wS$t?@>BmH6MEo=d|qNt@pWI;8~M|NO0!rmbl|LweEN
zW<^yB<-4|n$q8_$482C+vLfNKdOnuJAAa_P>hfdK)b#{dDL`5(|Uv4)uv
zNs9m!yA(%}6o~Uik;pM?4IvT3koge_p@{8*#Iz>=ymlDfCLmYXcdJO2h{mtLq;!T=
z$W3Vk9Z~S~xmh{;m9o$EYWeKe-Av^FD!|t9a6C)Vgl#uodr6mqw=i=y1Q3Sv`(-7
zAg>x-8tC;XFZ$-mc#m4>tpoba;OG6tFBh)@yzQHDsE^LVVl>2wS15HqXvFFlCKVb$
zg1LO3gg}L#j
zFlK&o?}4T-kg@s&rLT6Emd0bh2GrH_($*TTgYfLiVaKzy#8&e?sh*!dPrnBObnoDe
z`WJKccmz(5JuM2M4Myg=%@}GsLB}(2u~qqDrCV^6JX&W>N|B
zSP70J%`Sd~^a&%VSm`t1hhYu3kUjdI)aIYOSbWx6f={jAi4xhLK5qRE;)i_lkL$xp
zp##m0)(GrBwcmt(Tk+YSk&=e5bPi_`I9c{QO64lNntY&VqVlMnHkaskgi|#De@(T8
ztaln`e9IhW3(^cBe7DC}-GP0&GivY{pD{
z{DgRV#`lT}mjYM=qJs~^5nge-=PB$++bK(EWQ8t9IHr_lka>q*yer)v;mxi{ea%S}
z>4;rEW&b8w9gyk2olTvWHQ`$Tu>t8~vqi+#m!J()p?TuhHBzd7=dnKjOD?`q7{9=}
z^iZCjSUcL_S=g1bOQ8hmeS2>Yv9ovUrXc^t<5Od
z_rtgT^faW{22;^b5qlKGZM(_1qdUm37xa%IvJJSYUAU^aL2t3*uIjzo)-dd
z1z5BKISF`Oqpfe}FE&4bP;lW^^h0Vef&BwKfjNdErA1T`o;4CDAi9A1r7PTUHv@;n
zD?1!H_qP+CqUJ3vLjRZ}__1&23iX8x+mz}xLvHz`Em>jzthiG!kl=vWL53m`t8FUX
zw==o-3_8u9+0kT0Zl^$IAjh>aQaSMyt
zuuwjcA9#>im|;*GzOXCP)ZHR1dC6B6%Nfbm5G3SyI1Lo0Fo!e!VVvKBzJvXlt-%y0
zod_YwWtG)rBnbE}GxHmRXE4gs8Rn%#=#R(aezsGvF{@V7YKnzX(1@pzfM!=hs#ZO{
zLFu8kIH@DIuro`}m`g-^M^`S6_(|J%o_h)O%Bv&4ty*rSLQtE;a|HK(OJkD?X1Y
zj(B7BP~eOvD}B0kt43vEbT76<7)Xj~mj9L?9Y(`mMFr?rl~^oBuBzmwC(`0vnOIU=
zGjnC(Z1jp)n?Epl>%6DjiU?RPFFlwYi}lewRLQq4A=>3jXe_0TA*}1?
zbKqv~RY)0$q*_x)GM42qM8=^A_mAFW_`eTi<-@hrRjBnXtAo+i^uy
z*?j?tw5jn{rrBKZHF^RCPB0l(*YaJl<`aW_^ybUeBY)+V*rZAZM?{U_j~tQZ
z=(dcRqvZ`5H5!U4g(G+Uie-)%jvC3FGXeN>3LsXIsZ?V`U?X#WnNNA5VRCPXw1D}V
zK8mprv?`@0mGef&wl*XcZBCDlbxoloH6q7V);IHLh9eK9V4Rw<=%IP=9J_sH`5xn}
zkaT!$OVEz1!~4KYB>|;yef`71)3#nv3KAnYb8cX3Kj@1%f!`o0=c-9lXaA{zi&e4R
z8aQcOOf4oJJ_GGykoU@*m0JuFp^0mseJq)oRFj^%5rJ4q?`(vVcOz4bff=`8d`nH^
zTW(30Pe{3e!^sbb^3~t)IOLleD)%Pg9-3A-HTn$Lgnlic3`AsyHpK+@aOD6q&-FB)
zWuJRCo2BL2$zg8@E!gSpaJ?ihOX?5q2SyP}GVcP1m!_LWh#{K_N{(4}LGovIR37(;
zx;nLUE0oPk`B}n?Z=;!CJe;Yv`QwxOl&R$Va13F;z}WltWvQ-cVN>0oUqN*|VOdqF
z3dl62T*}A@u_VzwA+w`xqmQ=FaSTOaTe4-wn0lnEl%?pg$MKqHv!pDCBi}FRSh+M#4c7RF%sTr+(G39=>ru;g2^OTy2@%ZTDqc7
zAL@_zX&AT2zSR;uS|&`|Cg_?*f||u3cJN0ElcxBaJOm~u);S~8YcbU8A&Xqo%sEq9
z0*RWC?Z_CUpL-sZei^R@JaS^PfHSh>3wsC-L22nQRdN1%(E(Q1(>~c7v(WDZ7YCz6
zWads+=wYSGnl#VJVfZ8NzixPxR9AfVF(hM=Bl!HF6#cJQ(oj4i+TtJja%v*}v|#^A
ztgwb*gHMq(%#bMtsXW^+h0wR^MJo=J7SIneK~HG+xybtCd45*i6K87l0K|EQ=J1Cy
z&pTngba0mD+F2n#sYsHL7n6^3Xs=2$)jxFct>9~=_sW%PXE8e{Wj8ltxdc>}_X$V?
zSzk6#l~lDdhThOPN}V3;pN%cN@N(WXV)xT&)fUmL6pSDEGby8jbp10L%Ni<+eBpH^
z?@DPytB*+9Vf3IYW^HiAfp-W=7YJ1=Qio9wk~NvuQu}Evl7(hif&!2P6?RlBVnmh5
zC}%|WwMB8R0X$nb{X_hhb7ZFbLmi)fg7+Yg@UhA=rU&wo`PHNlPr!Ep&CYJ>QL
z3SlzpuNd;YnstCM1y
z*2pil%15G{brz~R@~>PTDn1bEar^Bbr(!K5X%(X|e8YR)4?qhedprzyh^19p%AkM*
zU1pj@(8*Nep9|tL`O%zZodK?B4B1qv1NOmg$Yi1S$Mol
zBiLu>XSML&xNf(w_5fdBFAzrf3GgFH8OGeg#^T{nEcz?Ti3iz1;H&O-Ojzm(ntFH5
z0VG%|qoiN?x(Zu9d!75t`dqv58;>JE{jI-28Ty$~*tD&>ZNnaS8%^EPusZy4P4>=i
zeUB^ErD@t~Xvcxe4yM4c$91t!mDY2$hSAX5?%lHLo;ET0hI|RnUxi;H;uO&e^1TlE
zsbSCQ8Tv=n4z3*|{F29e;-97FI?p-n@-V|1^&P{?)#C+R>=k#Z#zlxMg;gj(mOUPi
znsX{__(4YK2_9GR5YjCDFH@;&_D=uaX~p4k_3C9LKh@Hyg{T(k4wupY}v^UMM?t5xLEQ)F`z2Or|6@W24Ox`_09s
z$wsbHQdCZ7+3*PX6nsa=Daj$gfl2P0u!N&36#kbojL#j3lq?jRtSm1Z1r?=dA*#$e
z1zYxy|Mt+c_80Esyo`IAiQcxcYNv!Nt5(=WwDAN56!N_th;exYQfJfzr09@|i_#9G{37J0`LQT@pDDXij>5w}A$i1Z{
zEFNZYQx?Q^(KFgtSC^vo?dsCni_z1-<;Ck(bUIcYJXZetFFP1w>gv1+KF`WgOo|Td
zj5BV&Z~r>U_f7xie(vQ}{CplX6>H7>#wq=!M>eayB$rgKm0cBPB~zM3(NF{sr9HUC
zS$akGKS(78^Qj(NNVD=zSh{Luy9V<`%p)xQ$fuRB8hZ$43p;`H&l)@WQ4hWJORvgV
zJ+a)?J@NVgf<=W?5$?!3X)GoL?f6XCU`RIP_rUa_dlwsRsWx|f{9QH3noX}x`5O2c
z{s#rN9`5c#Dd3uT(J3&1z|sOJlscjf{S&6ydjRVdexr!vgtUe*EOd5F)G+3ScStT5
z&z>E!jG^|FKOC=7^xe-yz*XD
zM5F*`-w0&+oF9GZlZ5hao;euHvB#k+`pfp%dCD#2Yb?pq%hlEzDO%X4a*tyrFeNG0
z?YPFv-7~$H$!wSTJds$o39u*J4sh*<%SMZCEe)jE3gQf`Ym&u)g}!7&mW(~iet2@-
zSe)pAG-hBPAWufnw8o;Z^~B@ztB;}rqsI>_rGt3UnnnJ<>uNULt#+%m9Xk^Zk&Gwy
z^yhH&gs;Vd?X%c!S5`eQZ(sQ1;Lm9`J6C-&bJjYS6{Cvf;UfK{>sIqWNn(EPT?da+
z#S(TT^`{dBmNbHZy~aW%>V|I8Q){ndN3k3#-jnlk{d!*;4B6-_Ssnk_zWKE7GIRN)
zva-MacInufai{kq)AEw4j`ww@`XB9-yfyLKT%}>23!4Z1q|)Bu^ns|XRCDUMh6r7z
z^`!WrUT@HOYTU`PO?sb1n8=*Kx+gcyjDcn&PyUpO@ylVr3%u`21s7ukiL3<=lDdV|
zUi|VaTV9B=u!~{IzTEEi-VFvm+O>ycG{qX1H%mgUxb7F>Hm6-k71AX>OlEmpQni6J
zNxVZ_Ts(hHZ0S(e*ngw{#MvskgUT#7u+T}W|MG)#kS7bQg_E%6*Ra;?HFM(O6yy{R
zP4;7|WmN_6HOS6h{%l}36<(1=2p*TP&mx@PTDPmO494Gs$90!
zu=g2j&C0#dG^y-wnwy)V^Oo&L+R-0#At*5MT(%;sD^bglFKI+nftuv5XRz_wwW!X5
z7yqOvviXCr_*(rAPEVBA=}T56p=gq_D&@J^xQqdC7<$1PnAZL%ES2kNLj2P*8mKEr
ziy>V`28t9?(j~kII=J7u*$GC|;#yh}o`6{k(^Mokg_qbPXPul9QBJ&%ob_k)yF(
z`-)J2^3ar6-WXx1G-*{{5?4I)={Ys+4n!MD6^3Y_<{xVbdFhVy7=NM4vZZscpj0n7
zw?`rTY4FDRzgOv$e1Sa@{h=|-cfXLW{Mv1Ek9-F#$LwnaPr%KM=<0+qY*VqNZEuAb
zB&8b7vh3z?GiIo2NrG#W`7Gk@+-7FVJQ7fV=?&|t*W#<$@~Pye9!r;V6Hg6W8bykR
zk;6C~0Q%)xitPPi33oZz*!8f2-!lx)Z)lYuOh{4fl7KB$@R&ibGqGyppWh5Y`F8oXlRgY<=exiw?zq_?x@rW1n`~_O;48k44kr9AeeLtO=<**Kz`-)@^4*V#&)d
zvUGn#_|&L~I77}0kYT)d35rY&Y%f8|4-pVUdui$h-j$g`BI
z)`{<{Mcz#bW)_2h;Uw-{1LM$xtm?yX9t9VJL7o0I@eV
z^8>#fb&sL+yKz0Dh3_w+L2Ai`Vc?RPR_E+hhLP6E`)lMJ7+>Xsa$nBb6(u@Jizlou
z*-#TFMbI4LZ3qtH*@t;Rr1e1+JH{GzI@9bKfrmE4-1v)eo`7h_*$1>>^@FC7%Jn*N
zn@Xvu`JGeow7qrbbf7EmJT(xPF}4BXpqZVyNO;Z6z&dK}Ve?+R171Oh*-0
zqXMtl
z+;}+HDvJ-=t?G(pdRSkB1oHil1`m0@6HO;Xu@+Z9&Cim`8ib5;nFC-w6es<^a4dH(
zmywrc)V%H<_D|@AS{Rpw$jSJN1)BKq%irwyjik&hS_87vzGxK_uJ={#^hHK$t&{OH
z@w|fFhO>`SK7ah5r3F%Q;2WfOa(Hkd6-qq0wU;X&hQV$J4N;Y?URDLdG{}flCfoAPSAA6Pvjd{oT)
z9`XbUqg4Eodr)loDN>i0mu@7H*Yz^fzuO|9SwH2SVm)@@$9{4^)}K3b&{{Vx^T@Lk
ziz=bPN_9CtG7dmX9;vsZA@Igv{+Ft_
zcO#10y#5(^Pjx--teCZn*GCkSS-fOKgHW0KU$~=raN+dUq~5=9xV9t>Ui+g>TB-h|
z*V-D_Pa)OLfiqa9ecSnZ>p&;adgKmKg)R_?abe*y;a&g?hry-Gl}d0lFAFnrKWZj;S(FOhDvHzyGYQjKk4NNhJRh}(k_@Vtr~l+b}ysiRNq+%
zp7`Q{zg9+O?eFSyPN|2F+PSagc;W$X-7mAU$_Y~Ow60BMn*m%I1PUJ2wua?DNwi;XM$P$S|UrBgFYO4XMNy+tqaiIw-V@k#$d1aDj!}2C0rCEPVcm<25DGN?w
zrMq^ZLqnYhE00r&BW9oLGQ308r$*!pwQcra_X4nucySn^vmf1S|m_I#Lv
zk32xE$ryE=)Mh4FeU_Q>+HMBxRqkEUc63fhc@ml)BF=!+(QzEmHI<`P*R1VYjA^}<
z_>r+iS}^90h=6SMWPi;AQ=apC#e8Zo@j~CAl5R(r)NzsG39CvTX4)<`o4FIBiHX7C
zX+3Lg@oSPC3E|k~8vnD2e{R;x3QOCRp&zihcgJ@g_h5m3_i^scbo+T#=0b9>9Jwu@
zfx3+DMO*l+l(fmc+a<+7q}HEMul(8OhX2+g>HF_H1B&L7`%>&Cl6V#l17d+3$y>}*zftjyjYf0)>>&WsB^`A?z81pVShtiKnLUj#)be(8tYk$5%S{=JM
zHa)9SeyO3~dq)=?)`n09DDw-oASN4JWJDx>?^XZc=~?9!+iMr*saQSHzGeiTB6`Oi
zO2Sgk#3pnv4ezf@*eW#OtijyspO@Jf4s%+a0*|lZU(G7rPSgVgy!N@*9k%(ATuACl
zABc9n)hc`vST=srNNhl~bqgc^aAOFHd0tpYD|B>%Ax-~$En$}mumNYMv~Wc9*P(1Xee$aV~K5#N5`ZT(QCxbs5_U$w%dFPS&h
z(CZL9$^LwVz``*OOJZEglX>!Yi@Xk=p?4G5LSQhs>`U(xdk!oJbf>na99V5wG>DU7
z>((rJ*D86BGALQUVCO-3VU!>1kuVlecwn>fiW^ICIs!qkDD(#9^CtlS2)s(`>_
zR{TP0ar5nn%HCPk6`xd^c$Fjm%qo%NE_BtEk_tY=gA5|LI-(HsAT7aZ_ScaZ&mtvD?w!^Jtq2{FhboK*g4q1-v{)S1mbJg^%WfzzY^
zRYst5@(`yHjaOw2$9n%OFVMOo8Y|dwCh?6^*Df}ljaxI+at_fUib9RkDH_Wrf;vbg`5tKFwBUWNw>-2{x^};kQy}FH}dRcY#}sZcn^JROk2N
z^b?4mdvDqrx55i{fQ82|)M34}u)LhWKB|EDiwv2%E
zkt>t(PIjVKQZ!UI_SYg;{^G1ko`~|rpcdz9lXvhN2|fT5?N?6ukAWDFJ$0ly
zf_Yq!p;}kWMKg2&5{D{dY3)>+3S`nH+F^!^FEDNYI5^ieFDZhF1XeTo1Uxx29U;~f
z#~&YnN1eqe^mRd<8ckLx82h$7)js(X_~TRNaoou+*E6s;BBHXiuK9E}M6DxAH@vcM
z_8W=4)jN81@IpN9mRqmC&pmO@^Zo_$(D|^i9IQ1UlA|3!ScI^@-{zCbfvhUS@b+i5
z`vt-Ah`6Bp*9J^cNm`2b@A-%f)dG)D9d8oh=*Wi7&n3BttDk)PrCc(O_=OzUf5-`7
z4{8^}tvI>*>Q1k~+=>Q}wm|gRgfI!iIYyxyZLNFG9Ys)_jXGn>i~W&S34%Wfh9GV5rmvjcM>fz$?3crw-6y)h54^cJ$6Y-yf`LyA
zjQ~k+Hki)q5$i|1W3m?+;cq^Viz4m9ZaiOxqPjygwY~8lAu>wPM(n^UgiDQZ)Tyq*);KE5O?%V1%Vsl`J(@t
zj?~VEfu}nW-T+AFw-mN%^)PWsxB}`aIeH6;OJHJtMHD#1{kx3CS_xC=VGnv5%?w82
z#r7ef&07OIzQ>IYo2cG`0hSbUm{#%+!IFAp7To`ZCTLtv&x5!SySKb6ihU*XgNrJx-U!SLf6We;m8nB69@d1dw`jPwhh>x%z
z{K&!&G@r`Gr(?NQjw5q(+@7SL+QNNElt+d{5tJDqd1>DfY5R#QrJoTLB){3-Hk@@z
zl`p|%MCcK(SVD{uWD3o=?s3q+VqgKa*+gE-cGD7IL6G$%6t4_)d})$P1<e@nEL?
zXggs!wAw~}{vRRV9c&;c?s|piORXw7jmNEPBE8^b#
z_-j<)$r5AD0wviH-S)aBFZ5vE`pB~tlrRp=!LK)BE>V$K?>y5Ru9h?rVPNJ(;SSH^
z=+KWH!X+1U_b`?IN4eZO3W%r}S;~p7-pO74HJ#JW@xQItNj^_dTD~7zZp@H94+2rl
zl^|A-{EB01fkxXQj3K`s6@J^RPP}>so)k9Ieh~g&wwc1Pj??0k7OhrQ#+-JX0wuO_@Ex$6aq6AL(
z0U{`qyM@t26UoTxYH>W1yYBA`ctbSCztX8-%?}KQa-=Yn>(4NCs;|p1n57su{@&%}
zOLT5z6m43kzmgtJ+)hrCYsWr@`z8O&>NR$7J+3C0STi|^%g!(@4B$CBN@NM3uD`vF
zrLA)2JR@^oH^E|Q&lzpGP(U(ELFLc*r5}w!y(gD4Z%KIQv~gR?#K}a8}F^M
zQ}l+8peidEzJL%QPiClkoa<-&`d+7fUZS}WIUv2Mfxh@7U_P0B_91bwHbS72V97~;
zhPn3JkN}36MucD`7$|WORYQU7DKvE6Yp~WTRg_zt*ST$jjP|3C>_w1xYc_j_$y1Gx
z7tr*Bq^;*0q^TDe3}8~5U%+d2Z%(#CfZs;}OVvJIfJXd5v2>6X^(Yc!LO8s|{=-{e
z7M;*|3;3y+bJ&J`>W~t=kU1%w=@cnelk|}@
z1sGd6`gawX=k)7xa+PQ}znh)k|8+)KO(!{Af*2jIeO-6>Px3ua=H8zx2m|1ExddPj
zurzd#C6gjnnAG%srnrYipdgwf<1k+ERYiL7#d6f%MgxQC*ukTUys=32_xJ1st73YH
zCAd5A2f8mFSUbiMTz$Ah&qFT)`OpU_0RyWkBo4O^RZMSpY>4xbUK%5=#C(KfAOToI
z34dN82n-H|1T8KoNep23%sC8U_EwM#;P%{~0MU^gP=}nQ2N!ESc6!m-_4I06(9+m)
z>M<>84nTest?~QvGV87?>L{!$YW-+3>vH6N^TW>Ktu}DtxA|*zF3qG4GrQ!E*8R%B
zCuV(CdhHgBqvSg1Q!YVXR|gZjzP_3gtBJ7WW+R%hQUeP_&e-Y-0ySCKu+wU+H*<2w
zxEjc~ZfAX=+tli+RqG#6rW?OH=EE@{UdA6m#eu6_6?XH#3@2!&26Jg><)pQS}=E5$bw
z*FD`%U6JGcj_I`KK31tfv%{@nsfbcjswl{=KV`G{k@iGgcS
z_C9pM0%rT%WqZg2)0Hse}Jh#kEE?b!B0C5ClY$
zfDj2m0;oU=LO>o#5QbNI#FAnJk&2c<#6U~K5FP_)jLirrQ0PI>3gOXIs1G`+6cMnY
zfGrV`q%Z^s5Z>BB1q2c0;oRO)*W%nC`}_9&&R+Mdb$;x%?%vx}8$X{d$fDRq>0{)#
zCC<%)^07#5$A9!{q#OuT#{E#SUH|k$4@rxC;N>F0vH8!pNs8x8>Q7%t)gZokezBWJ
z3C>wA6R0Nk;dliF_v+M+rK}3FJ%g4F)@{e^m#+&XQIUVU-B!Dw!eak?NpAanNAE~%
zR>*1@d(EdsxI2baaa&A_k1vi0t8ac{()09y`L#d8xEHUvT#GYQo^MQcY887{)JYq1
zt_cVUfy-9akom3
zPCHQ(E-8zro5z>#HGHUd`q$YK@Ah*kMvsN2dG=3xkEGsUSI%;$i)=9G{?GyEB(m7q
zP`oRJp?WaM=^2sO$*NYihL|K#(+x`6Oh4Yc-HOU++~4lYIvQf68`{F3Rwemhc}f9Yc2-Hws_sN36<_QyTML@#J4MB?9oQ^6(b@y^_?<%9
zE51!sk8i7#3IH$&p(x}Q0^2ke`cU1*B>@1mwD`D`>Lsp5PZphjoSvet&M0i-hWUFW
zT9{QSpPQdo6wH1==$1u#tJj{KZZ=PeEa1VBo&2e_CBB
zq^;m=-Jam3dfpv5f}U1h^w%$92Bo_cW!XcA@5xtIM!ZO3;oOT*N(bRpebEe+){vzY
zqw};*5>h*yT$hm9=4Bv_*2Zf|+tx6Hf7Z7j`T+A%dr(Tr2&@iwk@_bsay|K03b?k;
z2-S6#y$t!Sg2+=ZD)%)`2?@sCuS|@%o2+>^ZQIwlkJK{6Pqsl{GknrK^+<&IDjtU`
zxuh3Kcc*o;wi`V=XyGmR=1cQ!Z`AB&aymGtrayheTDWiH=p8fJdoXSxsbL113hed!
zEjO)Oo64iPpOp|>SB{j@##kK+Otu@hu4m;et5oNg@gi-jHBFnYiIZz)x1#=T&4GnV
z!Yx{l1<*i;l)$L}#1S_P6F|lbyjvo^x*jaVn!-(eHpC4b%I_4274esFh{zJ!_hVsZ
z9|0WQ2`foXu(OX0f_K3}b7yF)AcIg_L}UoRP>_imN>DdMGPXxW9SSd?OGP26p9+@#
z4>|p2#J`FiGLaO_SQDvW-LN&+8`Zb;lZo$tLn8{(1`*2-6^(jqhP7Ur(0YIj93xN{
zdw@vXkmGIGH*y444g?Y3=M{QtYDk~<`z7MH9z_He&}Ps9=$t?Uat8eYAs&Sf2YrEI
z!dti*Iw;)$Cl$sinLw5bo0OrzI1TC#(Lq2OWDZ4wo^-?*!(*vC;mi;j2zW42OoUFu
zUVy+y;n0v76b}Iaf4QK(m`2{A$=i
zjHum#My{S9fb}}$c-C-cf(*ichn;QK&~uUuV!C1cWH`wA1Fk-Fhbz5Uh?^pS$X+Ou
Y(TzS~Xdo8@nTUZrK}a{fL*HNQe=4o%4FCWD
delta 17568
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 \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
fi
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
fi
- i=`expr $i + 1`
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 5093609..ac1b06f 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,104 +1,89 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
From 33a9b16f70625afddfaf90c8c50afb286de18798 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 23 Apr 2022 23:17:07 +0900
Subject: [PATCH 027/100] Configure Gradle properties
---
.../colorpickerviewdemo/MainActivity.java | 2 +-
app/src/main/res/drawable/wheel.png | Bin 0 -> 624 bytes
colorpickerview/build.gradle | 1 -
gradle.properties | 36 +++++++++++++++---
4 files changed, 31 insertions(+), 8 deletions(-)
create mode 100644 app/src/main/res/drawable/wheel.png
diff --git a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
index 57ea4e7..520a097 100644
--- a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
+++ b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
@@ -53,7 +53,7 @@ public class MainActivity extends AppCompatActivity {
private PowerMenu powerMenu;
private final OnMenuItemClickListener powerMenuItemClickListener =
- new OnMenuItemClickListener() {
+ new OnMenuItemClickListener<>() {
@Override
public void onItemClick(int position, PowerMenuItem item) {
switch (position) {
diff --git a/app/src/main/res/drawable/wheel.png b/app/src/main/res/drawable/wheel.png
new file mode 100644
index 0000000000000000000000000000000000000000..40be615abd3ed71abb5832f6deedff60adcd6b11
GIT binary patch
literal 624
zcmV-$0+0QPP)P000>X1^@s6#OZ}&0006vNklF0TE?_@?_T*gZ{AdV{``6S-@ku<{zn2J
z{@1Txw}a%jZ{Mx}QctP{tdAZ&iun2S=QW^tzk&GQf9&8N5c~nEyZ-d)(+H@~h_m3~
z!-pAv{``3lG~hq60HprOlP4L(Sj2Sa&YcL5hW}&$kiPr(??>Vdy5-B4EByHJ;~FVG
zKnuJ7-@kvqzG%@RMV!6>dbbLw@b`ZT07(C{XV0pE<}qWlg!A3IcRTPzGST(`&DjYw
zj~gQ|xVX5;{r>&?=YJ{yVBGxl@bFMT&qK^JX3TIUH!iTn&CHoI-Oz)KW$V_h3IC}G
zwr$&%1Tq&TZ*+HedsEXVK=XXj^9+l!va${^PJU6t5|BAYMn-z*J^@9L%;U$84^Sg@
z0gI%AK=Wj=WlF&lCr)&O$|4Gb>JQMI9-w(b*zyT`XlSU-hYug_Qep{E|2>d7pnQj`
z-jGjASJbd)UR2yrWK?gmoJb3
z4-jk3ojbPzSUlW=#u487U(Br@QDJkJk+&nP+A@;&V!!mC~2{P3}OQ%btuh3tjhsNY4b{k_;k(y0000<
KMNUMnLSTX|MmCB7
literal 0
HcmV?d00001
diff --git a/colorpickerview/build.gradle b/colorpickerview/build.gradle
index e0fba87..6ed2c98 100644
--- a/colorpickerview/build.gradle
+++ b/colorpickerview/build.gradle
@@ -26,7 +26,6 @@ android {
versionName versions.versionName
}
buildFeatures {
- buildConfig false
viewBinding true
}
}
diff --git a/gradle.properties b/gradle.properties
index 46bf6ee..1c42e2c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -14,12 +14,6 @@
# limitations under the License.
#
-# Jvm environments
-org.gradle.jvmargs=-Xmx4g
-
-# AndroidX
-android.useAndroidX=true
-
# Required to publish to Nexus
systemProp.org.gradle.internal.publish.checksums.insecure=true
@@ -49,3 +43,33 @@ POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=skydoves
POM_DEVELOPER_NAME=Jaewoong Eum
POM_DEVELOPER_URL=https://github.com/skydoves/
+
+# https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory
+org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:MaxMetaspaceSize=512m -Dkotlin.daemon.jvm.options=-XX:MaxMetaspaceSize=1g -Dlint.nullness.ignore-deprecated=true
+
+# https://docs.gradle.org/current/userguide/build_cache.html
+org.gradle.caching=true
+
+# 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
+
+# Configure only necessary projects, useful with multimodule projects
+org.gradle.configureondemand=true
+
+# AndroidX Migration https://developer.android.com/jetpack/androidx/migrate
+android.useAndroidX=true
+
+# Removes uneccessary default build features
+android.defaults.buildfeatures.aidl=false
+android.defaults.buildfeatures.buildconfig=false
+android.defaults.buildfeatures.renderscript=false
+android.defaults.buildfeatures.resvalues=false
+android.defaults.buildfeatures.shaders=false
+
+# 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
+# https://developer.android.com/studio/releases/gradle-plugin#4.1-nontransitive-r-class
+android.nonTransitiveRClass=true
\ No newline at end of file
From b7bb4e2bd8048e4fb4fc8ead06730901441e234d Mon Sep 17 00:00:00 2001
From: Jaewoong Eum
Date: Tue, 3 May 2022 18:46:55 +0900
Subject: [PATCH 028/100] Update android.yml
---
.github/workflows/android.yml | 59 +++++++++++++++++++++--------------
1 file changed, 35 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 1db9de8..b237bb4 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -2,11 +2,9 @@ name: Android CI
on:
push:
- branches:
- - master
+ branches: [ main ]
pull_request:
- branches:
- - master
+ branches: [ main ]
jobs:
lint:
@@ -22,28 +20,41 @@ jobs:
- name: spotless
run: ./gradlew spotlessCheck
- build:
- runs-on: ubuntu-latest
+ api_check:
+ name: API check
+ runs-on: ubuntu-18.04
steps:
- - uses: actions/checkout@v2
-
- - name: set up JDK
+ - name: Check out code
+ uses: actions/checkout@v2
+ - name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: 11
+ - name: API check
+ run: ./gradlew apiCheck
- - name: Cache Gradle and wrapper
- uses: actions/cache@v2
- with:
- path: |
- ~/.gradle/caches
- ~/.gradle/wrapper
- key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
- restore-keys: |
- ${{ runner.os }}-gradle-
-
- - name: Make Gradle executable
- run: chmod +x ./gradlew
-
- - name: Build with Gradle
- run: ./gradlew build
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: 11
+
+ - name: Cache Gradle and wrapper
+ uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+
+ - name: Make Gradle executable
+ run: chmod +x ./gradlew
+
+ - name: Build with Gradle
+ run: ./gradlew build
From 1f3a9ac6f46eb891f53895397de1dc990b4d8b2b Mon Sep 17 00:00:00 2001
From: Jaewoong Eum
Date: Tue, 3 May 2022 18:55:35 +0900
Subject: [PATCH 029/100] Update android.yml
---
.github/workflows/android.yml | 13 -------------
1 file changed, 13 deletions(-)
diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index b237bb4..cf1957f 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -20,19 +20,6 @@ jobs:
- name: spotless
run: ./gradlew spotlessCheck
- api_check:
- name: API check
- runs-on: ubuntu-18.04
- steps:
- - name: Check out code
- uses: actions/checkout@v2
- - name: Set up JDK
- uses: actions/setup-java@v1
- with:
- java-version: 11
- - name: API check
- run: ./gradlew apiCheck
-
build:
runs-on: ubuntu-latest
steps:
From e2d6fd3486b17acc63026d2802521f6433e1749a Mon Sep 17 00:00:00 2001
From: Hannes Achleitner
Date: Wed, 8 Mar 2023 14:51:46 +0100
Subject: [PATCH 030/100] Introduce dependabot to keep repo up to date
---
.github/dependabot.yml | 15 +++++++++++++++
1 file changed, 15 insertions(+)
create mode 100644 .github/dependabot.yml
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..0377071
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,15 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "gradle" # See documentation for possible values
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "daily"
+ - package-ecosystem: "github-actions"
+ directory: "/" # Location of package manifests
+ schedule:
+ interval: "weekly"
\ No newline at end of file
From 7dd7de3f64632ea429b0d462852785548ada9665 Mon Sep 17 00:00:00 2001
From: ultron
Date: Wed, 29 Mar 2023 22:29:02 +0600
Subject: [PATCH 031/100] fix SlideBars: onTouch { selector.getMeasuredWidth()
-> selector.getWidth() / 2f} and if (event.getX() > getWidth() ||
event.getX() < 0) {return false;}
---
.../colorpickerview/AlphaTileView.java | 2 +-
.../colorpickerview/ColorPickerView.java | 12 +++---
.../skydoves/colorpickerview/PointMapper.java | 2 +-
.../colorpickerview/flag/FlagView.java | 2 +-
.../ColorPickerPreferenceManager.java | 2 +-
.../sliders/AbstractSlider.java | 39 +++++++++++--------
.../sliders/AlphaSlideBar.java | 4 +-
.../sliders/BrightnessSlideBar.java | 21 +++++-----
8 files changed, 46 insertions(+), 38 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/AlphaTileView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/AlphaTileView.java
index e0e76eb..4d746c8 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/AlphaTileView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/AlphaTileView.java
@@ -102,7 +102,7 @@ protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight)
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(backgroundBitmap, 0, 0, null);
- canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), colorPaint);
+ canvas.drawRect(0, 0, getWidth(), getMeasuredHeight(), colorPaint);
}
public void setPaintColor(int color) {
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
index d2dcd20..adc8935 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/ColorPickerView.java
@@ -478,8 +478,8 @@ private void notifyToFlagView(Point point) {
}
flagView.onRefresh(getColorEnvelope());
if (posX < 0) flagView.setX(0);
- if (posX + flagView.getMeasuredWidth() > getMeasuredWidth()) {
- flagView.setX(getMeasuredWidth() - flagView.getMeasuredWidth());
+ if (posX + flagView.getWidth() > getWidth()) {
+ flagView.setX(getWidth() - flagView.getWidth());
}
}
}
@@ -583,7 +583,7 @@ public void setDebounceDuration(long debounceDuration) {
* @return the center coordinate of the selector.
*/
private Point getCenterPoint(int x, int y) {
- return new Point(x - (selector.getMeasuredWidth() / 2), y - (selector.getMeasuredHeight() / 2));
+ return new Point(x - (selector.getWidth() / 2), y - (selector.getMeasuredHeight() / 2));
}
/**
@@ -601,7 +601,7 @@ public ImageView getSelector() {
* @return a selected coordinate x.
*/
public float getSelectorX() {
- return selector.getX() - (selector.getMeasuredWidth() * 0.5f);
+ return selector.getX() - (selector.getWidth() * 0.5f);
}
/**
@@ -661,7 +661,7 @@ public void moveSelectorPoint(int x, int y, @ColorInt int color) {
* @param y coordinate y of the selector.
*/
public void setCoordinate(int x, int y) {
- selector.setX(x - (selector.getMeasuredWidth() * 0.5f));
+ selector.setX(x - (selector.getWidth() * 0.5f));
selector.setY(y - (selector.getMeasuredHeight() * 0.5f));
}
@@ -802,7 +802,7 @@ public void setSelectorDrawable(Drawable drawable) {
/** selects the center of the palette manually. */
public void selectCenter() {
- setSelectorPoint(getMeasuredWidth() / 2, getMeasuredHeight() / 2);
+ setSelectorPoint(getWidth() / 2, getMeasuredHeight() / 2);
}
/**
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/PointMapper.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/PointMapper.java
index 432c45e..83d7cde 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/PointMapper.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/PointMapper.java
@@ -24,7 +24,7 @@ private PointMapper() {}
protected static Point getColorPoint(ColorPickerView colorPickerView, Point point) {
Point center =
- new Point(colorPickerView.getMeasuredWidth() / 2, colorPickerView.getMeasuredHeight() / 2);
+ new Point(colorPickerView.getWidth() / 2, colorPickerView.getMeasuredHeight() / 2);
if (colorPickerView.isHuePalette()) return getHuePoint(colorPickerView, point);
return approximatedPoint(colorPickerView, point, center);
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/flag/FlagView.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/flag/FlagView.java
index a8ade17..fe5bbc1 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/flag/FlagView.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/flag/FlagView.java
@@ -63,7 +63,7 @@ private void initializeLayout(int layout) {
inflated.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
- inflated.layout(0, 0, inflated.getMeasuredWidth(), inflated.getMeasuredHeight());
+ inflated.layout(0, 0, inflated.getWidth(), inflated.getMeasuredHeight());
}
/** makes {@link FlagView} visible. */
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
index 99857d2..7817e79 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/preference/ColorPickerPreferenceManager.java
@@ -227,7 +227,7 @@ public void restoreColorPickerData(ColorPickerView colorPickerView) {
colorPickerView.setPureColor(getColor(name, -1));
Point defaultPoint =
new Point(
- colorPickerView.getMeasuredWidth() / 2, colorPickerView.getMeasuredHeight() / 2);
+ colorPickerView.getWidth() / 2, colorPickerView.getMeasuredHeight() / 2);
colorPickerView.moveSelectorPoint(
getSelectorPosition(name, defaultPoint).x,
getSelectorPosition(name, defaultPoint).y,
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
index 412bb9d..66107b2 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AbstractSlider.java
@@ -121,7 +121,7 @@ private void onCreate() {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
- float width = getMeasuredWidth();
+ float width = getWidth();
float height = getMeasuredHeight();
canvas.drawRect(0, 0, width, height, colorPaint);
canvas.drawRect(0, 0, width, height, borderPaint);
@@ -147,8 +147,13 @@ public boolean onTouchEvent(MotionEvent event) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
selector.setPressed(true);
- onTouchReceived(event);
- return true;
+ if (event.getX() > getWidth() || event.getX() < 0) {
+ return false;
+ }
+ else {
+ onTouchReceived(event);
+ return true;
+ }
default:
selector.setPressed(false);
return false;
@@ -160,13 +165,12 @@ public boolean onTouchEvent(MotionEvent event) {
private void onTouchReceived(MotionEvent event) {
float eventX = event.getX();
- float left = selector.getMeasuredWidth();
- float right = getMeasuredWidth() - selector.getMeasuredWidth();
- if (eventX < left) eventX = left;
+ float left = selector.getWidth() / 2f;
+ float right = getWidth() - left;
if (eventX > right) eventX = right;
selectorPosition = (eventX - left) / (right - left);
+ if (selectorPosition < 0) selectorPosition = 0;
if (selectorPosition > 1.0f) selectorPosition = 1.0f;
-
Point snapPoint = new Point((int) event.getX(), (int) event.getY());
selectedX = (int) getBoundaryX(snapPoint.x);
selector.setX(selectedX);
@@ -182,15 +186,16 @@ private void onTouchReceived(MotionEvent event) {
colorPickerView.getFlagView().receiveOnTouchEvent(event);
}
- int maxPos = getMeasuredWidth() - selector.getMeasuredWidth();
+ int maxPos = getWidth() - selector.getWidth();
if (selector.getX() >= maxPos) selector.setX(maxPos);
if (selector.getX() <= 0) selector.setX(0);
}
public void updateSelectorX(int x) {
- float left = selector.getMeasuredWidth();
- float right = getMeasuredWidth() - selector.getMeasuredWidth();
+ float left = selector.getWidth() / 2f;
+ float right = getWidth() - left;
selectorPosition = (x - left) / (right - left);
+ if (selectorPosition < 0) selectorPosition = 0;
if (selectorPosition > 1.0f) selectorPosition = 1.0f;
selectedX = (int) getBoundaryX(x);
selector.setX(selectedX);
@@ -199,7 +204,7 @@ public void updateSelectorX(int x) {
public void setSelectorPosition(@FloatRange(from = 0.0, to = 1.0) float selectorPosition) {
this.selectorPosition = Math.min(selectorPosition, 1.0f);
- float x = (getMeasuredWidth() * selectorPosition) - getSelectorSize() - getBorderHalfSize();
+ float x = (getWidth() * selectorPosition) - getSelectorSize() - getBorderHalfSize();
selectedX = (int) getBoundaryX(x);
selector.setX(selectedX);
}
@@ -208,20 +213,20 @@ public void setSelectorByHalfSelectorPosition(
@FloatRange(from = 0.0, to = 1.0) float selectorPosition) {
this.selectorPosition = Math.min(selectorPosition, 1.0f);
float x =
- (getMeasuredWidth() * selectorPosition) - (getSelectorSize() * 0.5f) - getBorderHalfSize();
+ (getWidth() * selectorPosition) - (getSelectorSize() * 0.5f) - getBorderHalfSize();
selectedX = (int) getBoundaryX(x);
selector.setX(selectedX);
}
private float getBoundaryX(float x) {
- int maxPos = getMeasuredWidth() - selector.getMeasuredWidth();
+ int maxPos = getWidth() - selector.getWidth() / 2;
if (x >= maxPos) return maxPos;
- if (x <= getSelectorSize()) return 0;
- return x - getSelectorSize();
+ if (x <= getSelectorSize() / 2f) return 0;
+ return x - getSelectorSize() / 2f;
}
protected int getSelectorSize() {
- return (int) (selector.getMeasuredWidth());
+ return (int) (selector.getWidth());
}
protected int getBorderHalfSize() {
@@ -255,7 +260,7 @@ public void setSelectorDrawable(Drawable drawable) {
this.selector.setImageDrawable(drawable);
FrameLayout.LayoutParams thumbParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- thumbParams.gravity = Gravity.CENTER_VERTICAL;
+ thumbParams.gravity = Gravity.CENTER;
addView(selector, thumbParams);
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
index 421c0ab..951de40 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
@@ -97,7 +97,7 @@ public void updatePaint(Paint colorPaint) {
new LinearGradient(
0,
0,
- getMeasuredWidth(),
+ getWidth(),
getMeasuredHeight(),
startColor,
endColor,
@@ -107,7 +107,7 @@ public void updatePaint(Paint colorPaint) {
@Override
public void onInflateFinished() {
- int defaultPosition = getMeasuredWidth();
+ int defaultPosition = getWidth();
if (getPreferenceName() != null) {
updateSelectorX(
ColorPickerPreferenceManager.getInstance(getContext())
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
index e209c82..9b5e6a3 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
@@ -92,15 +92,18 @@ protected void updatePaint(Paint colorPaint) {
@Override
public void onInflateFinished() {
- int defaultPosition = getMeasuredWidth();
- if (getPreferenceName() != null) {
- updateSelectorX(
- ColorPickerPreferenceManager.getInstance(getContext())
- .getBrightnessSliderPosition(getPreferenceName(), defaultPosition)
- + getSelectorSize());
- } else {
- selector.setX(defaultPosition);
- }
+ selector.post(()->{
+ int defaultPosition = getWidth() - selector.getWidth();
+
+ if (getPreferenceName() != null) {
+ updateSelectorX(
+ ColorPickerPreferenceManager.getInstance(getContext())
+ .getBrightnessSliderPosition(getPreferenceName(), defaultPosition)
+ + getSelectorSize() / 2);
+ } else {
+ selector.setX(defaultPosition);
+ }
+ });
}
@Override
From 804f60f520bc12dedf9c7606339f9531eba7e6f1 Mon Sep 17 00:00:00 2001
From: ultron
Date: Wed, 29 Mar 2023 22:43:46 +0600
Subject: [PATCH 032/100] fix AlphaSlideBar
---
.../com/skydoves/colorpickerview/sliders/AlphaSlideBar.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
index 951de40..aaf10b1 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
@@ -107,12 +107,12 @@ public void updatePaint(Paint colorPaint) {
@Override
public void onInflateFinished() {
- int defaultPosition = getWidth();
+ int defaultPosition = getWidth() - selector.getWidth();
if (getPreferenceName() != null) {
updateSelectorX(
ColorPickerPreferenceManager.getInstance(getContext())
.getAlphaSliderPosition(getPreferenceName(), defaultPosition)
- + getSelectorSize());
+ + getSelectorSize() / 2);
} else {
selector.setX(defaultPosition);
}
From ead5701f2a62a48bee332b7f29859909d42bf436 Mon Sep 17 00:00:00 2001
From: ultron
Date: Wed, 29 Mar 2023 22:45:05 +0600
Subject: [PATCH 033/100] fix dialog in demo app
---
.../skydoves/colorpickerviewdemo/MainActivity.java | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
index 520a097..8f9a865 100644
--- a/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
+++ b/app/src/main/java/com/skydoves/colorpickerviewdemo/MainActivity.java
@@ -57,16 +57,20 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onItemClick(int position, PowerMenuItem item) {
switch (position) {
- case 1:
+ case 0:
+ {
palette();
break;
- case 2:
+ }
+ case 1:
+ {
paletteFromGallery();
break;
- case 3:
+ }
+ case 2:
selector();
break;
- case 4:
+ case 3:
dialog();
break;
}
From c6f08429b61b9256f736bc37da16c4df96827ae2 Mon Sep 17 00:00:00 2001
From: skydoves
Date: Sat, 8 Apr 2023 13:12:02 +0900
Subject: [PATCH 034/100] Bump AGP to 7.4.2 and Gradle to 7.6.1 and apply
spotless
---
.DS_Store | Bin 0 -> 8196 bytes
.editorconfig | 5 +++++
.../colorpickerviewdemo/MainActivity.java | 17 ++++++++--------
.../ColorPickerPreferenceManager.java | 3 +--
.../sliders/AbstractSlider.java | 6 ++----
.../sliders/AlphaSlideBar.java | 8 +-------
.../sliders/BrightnessSlideBar.java | 19 +++++++++---------
dependencies.gradle | 6 +++---
gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61574 bytes
gradle/wrapper/gradle-wrapper.properties | 3 ++-
gradlew | 18 +++++++++++++----
gradlew.bat | 15 ++++++++------
spotless.gradle | 7 ++++---
13 files changed, 59 insertions(+), 48 deletions(-)
create mode 100644 .DS_Store
create mode 100644 .editorconfig
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..117a5514795eb849c51fa31fd8c3d4b3fc4b0f74
GIT binary patch
literal 8196
zcmeI1-EI>x5QWE0N(%*AgphiJlqX2V8>CGuRH;;mie8hSB@{xk%1c~ejl#~n
zwO0p~Z2_=Vx~^Kajd)(v^!~|NfTWz2p9{)9w%3pjcRIJr>r(A6CrO
z5@tSWpG?P-5xD1aCZA-C_e?&@o}6<&(3dIgjNUytlot0|v|jT&;{-u_-_w)H6<9q@
z=+Rb&qLuZ*#+vgx2R{UzaqciNX4CxZNyJO$&;hGH&uOc_z2!4z+^5C3m&^_yRaEP#
zW}!y1&%Js{qm65vykiFK2>mre-@8GhKJ(UDWFf~rjW|BS2)(-K8lyi)=yf7ofXt*7
z`TZUtD|pN$4^jFI1oKnWC{|(ZTZCGdHnYEAeBIDrr5Pdb|3aD;3+81ye<|s_ZRbvX
zQ!FRab>1&&llL&HsP1LcPv(x;PJ!}LXq8VDA%IK{SO~f{ti=JM~TbZ>XCvq%JIg(RW@liM;%Uv10Lw<)S
z*TVk6j5LSA`{b^?BGNu<`~|kodXJtK&0E0OCPNu|sbcz;_-(%C*f}Gf=(>TsoJ|G;
z_7m_iyU#c}_!@98V+Q&byS#0s1)fN3DoKGAD^T(Ac6I-MwD|mg#iL5$k^)JARVv`B
zhi8WeL@f5!bFp==UE_MgrA2WwZ;e7_+i|RI$FVp6Fr-}rs+>k)XWr67S@}UgdH getWidth() || event.getX() < 0) {
return false;
- }
- else {
+ } else {
onTouchReceived(event);
return true;
}
@@ -212,8 +211,7 @@ public void setSelectorPosition(@FloatRange(from = 0.0, to = 1.0) float selector
public void setSelectorByHalfSelectorPosition(
@FloatRange(from = 0.0, to = 1.0) float selectorPosition) {
this.selectorPosition = Math.min(selectorPosition, 1.0f);
- float x =
- (getWidth() * selectorPosition) - (getSelectorSize() * 0.5f) - getBorderHalfSize();
+ float x = (getWidth() * selectorPosition) - (getSelectorSize() * 0.5f) - getBorderHalfSize();
selectedX = (int) getBoundaryX(x);
selector.setX(selectedX);
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
index aaf10b1..d23e451 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/AlphaSlideBar.java
@@ -95,13 +95,7 @@ public void updatePaint(Paint colorPaint) {
int endColor = Color.HSVToColor(255, hsv);
Shader shader =
new LinearGradient(
- 0,
- 0,
- getWidth(),
- getMeasuredHeight(),
- startColor,
- endColor,
- Shader.TileMode.CLAMP);
+ 0, 0, getWidth(), getMeasuredHeight(), startColor, endColor, Shader.TileMode.CLAMP);
colorPaint.setShader(shader);
}
diff --git a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
index 9b5e6a3..fec08c4 100644
--- a/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
+++ b/colorpickerview/src/main/java/com/skydoves/colorpickerview/sliders/BrightnessSlideBar.java
@@ -92,18 +92,19 @@ protected void updatePaint(Paint colorPaint) {
@Override
public void onInflateFinished() {
- selector.post(()->{
- int defaultPosition = getWidth() - selector.getWidth();
+ selector.post(
+ () -> {
+ int defaultPosition = getWidth() - selector.getWidth();
- if (getPreferenceName() != null) {
- updateSelectorX(
+ if (getPreferenceName() != null) {
+ updateSelectorX(
ColorPickerPreferenceManager.getInstance(getContext())
.getBrightnessSliderPosition(getPreferenceName(), defaultPosition)
- + getSelectorSize() / 2);
- } else {
- selector.setX(defaultPosition);
- }
- });
+ + getSelectorSize() / 2);
+ } else {
+ selector.setX(defaultPosition);
+ }
+ });
}
@Override
diff --git a/dependencies.gradle b/dependencies.gradle
index 0228e96..f41b98b 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -18,8 +18,8 @@ ext.versions = [
versionoCode : 28,
versionName : '2.2.4',
- gradleBuildTool : '7.1.2',
- spotlessGradle : '6.3.0',
+ gradleBuildTool : '7.4.2',
+ spotlessGradle : '6.7.0',
dokkaGradle : '1.4.32',
mavenPublish : '0.18.0',
@@ -28,6 +28,6 @@ ext.versions = [
// for demo
googleMaterial : '1.5.0',
- powermenu : '2.2.0',
+ powermenu : '2.2.2',
timber : '5.0.1'
]
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644
GIT binary patch
delta 36900
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