From 124dea0c0e7ef89a9ac27b31d276b6f5c52c739b Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Tue, 25 Mar 2025 22:54:40 +0800 Subject: [PATCH] =?UTF-8?q?6.6.2=20-=20Alpha5=20-=20=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8C=96=20Color=20Picker=20=E5=BA=93;=20=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=89=B2=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2=E6=96=B0=E6=97=A7?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E5=88=86=E7=A6=BB=20(=E5=88=9D=E6=AD=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 8 +- .../autojs/autojs/core/image/ColorItems.kt | 758 ++++++++++++++ .../autojs/autojs/theme/ThemeColorHelper.java | 3 +- .../autojs/theme/app/ColorSelectActivity.kt | 53 +- .../theme/app/ColorSelectBaseActivity.kt | 81 +- .../theme/app/ColorSelectLegacyActivity.kt | 33 + .../theme/app/ColorSettingRecyclerView.kt | 70 +- .../app/ColorSettingRecyclerViewLegacy.kt | 174 ++++ .../autojs/theme/widget/ThemeColorToolbar.kt | 4 +- .../org/autojs/autojs/ui/edit/EditActivity.kt | 205 ++-- .../autojs/ui/main/drawer/DrawerFragment.kt | 1 + .../ui/main/scripts/MediaInfoDialogManager.kt | 1 - .../ui/settings/ThemeColorPreference.kt | 2 +- .../ui/widget/AppWithStatusBarLayout.java | 14 +- .../java/org/autojs/autojs/util/ColorUtils.kt | 317 ------ .../java/org/autojs/autojs/util/ViewUtils.kt | 40 + .../res/drawable/ic_color_palette_vector.xml | 45 + .../mt_activity_color_select_legacy.xml | 2 +- app/src/main/res/menu/menu_color_select.xml | 20 +- app/src/main/res/menu/menu_main.xml | 2 +- ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-ar/strings.xml | 2 + .../res/values-en/android_colors_string.xml | 28 + .../main/res/values-en/css_colors_string.xml | 153 +++ ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-en/strings.xml | 2 + .../main/res/values-en/web_colors_string.xml | 253 +++++ ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-es/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-fr/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-ja/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-ko/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-ru/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-zh-rHK/strings.xml | 2 + ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-zh-rTW/strings.xml | 2 + .../res/values-zh/android_colors_string.xml | 28 + .../main/res/values-zh/css_colors_string.xml | 153 +++ ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values-zh/strings.xml | 2 + .../main/res/values-zh/web_colors_string.xml | 253 +++++ app/src/main/res/values/android_colors.xml | 28 + .../main/res/values/android_colors_string.xml | 28 + app/src/main/res/values/css_colors.xml | 153 +++ app/src/main/res/values/css_colors_string.xml | 153 +++ app/src/main/res/values/dimens.xml | 3 +- ..._colors.xml => material_design_colors.xml} | 0 ....xml => material_design_colors_string.xml} | 0 app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles.xml | 4 + app/src/main/res/values/web_colors.xml | 253 +++++ app/src/main/res/values/web_colors_string.xml | 253 +++++ {apksigner => modules/apk-signer}/.gitignore | 0 .../apk-signer}/build.gradle | 0 .../java/com/android/apksig/ApkSigner.java | 0 .../com/android/apksig/ApkSignerEngine.java | 0 .../android/apksig/ApkVerificationIssue.java | 0 .../java/com/android/apksig/ApkVerifier.java | 0 .../java/com/android/apksig/Constants.java | 0 .../apksig/DefaultApkSignerEngine.java | 0 .../main/java/com/android/apksig/Hints.java | 0 .../com/android/apksig/JcaSignerEngine.java | 0 .../java/com/android/apksig/KeyConfig.java | 0 .../java/com/android/apksig/SignerEngine.java | 0 .../android/apksig/SignerEngineFactory.java | 0 .../apksig/SigningCertificateLineage.java | 0 .../android/apksig/SourceStampVerifier.java | 0 .../apksig/apk/ApkFormatException.java | 0 .../apk/ApkSigningBlockNotFoundException.java | 0 .../java/com/android/apksig/apk/ApkUtils.java | 0 .../com/android/apksig/apk/ApkUtilsLite.java | 0 .../apk/CodenameMinSdkVersionException.java | 0 .../apksig/apk/MinSdkVersionException.java | 0 .../internal/apk/AndroidBinXmlParser.java | 0 .../apksig/internal/apk/ApkSigResult.java | 0 .../apksig/internal/apk/ApkSignerInfo.java | 0 .../internal/apk/ApkSigningBlockUtils.java | 0 .../apk/ApkSigningBlockUtilsLite.java | 0 .../internal/apk/ApkSupportedSignature.java | 0 .../internal/apk/ContentDigestAlgorithm.java | 0 .../NoApkSupportedSignaturesException.java | 0 .../internal/apk/SignatureAlgorithm.java | 0 .../apksig/internal/apk/SignatureInfo.java | 0 .../apk/SignatureNotFoundException.java | 0 .../stamp/SourceStampCertificateLineage.java | 0 .../apk/stamp/SourceStampConstants.java | 0 .../apk/stamp/SourceStampVerifier.java | 0 .../apk/stamp/V1SourceStampSigner.java | 0 .../apk/stamp/V1SourceStampVerifier.java | 0 .../apk/stamp/V2SourceStampSigner.java | 0 .../apk/stamp/V2SourceStampVerifier.java | 0 .../internal/apk/v1/DigestAlgorithm.java | 0 .../internal/apk/v1/V1SchemeConstants.java | 0 .../internal/apk/v1/V1SchemeSigner.java | 0 .../internal/apk/v1/V1SchemeVerifier.java | 0 .../internal/apk/v2/V2SchemeConstants.java | 0 .../internal/apk/v2/V2SchemeSigner.java | 0 .../internal/apk/v2/V2SchemeVerifier.java | 0 .../internal/apk/v3/V3SchemeConstants.java | 0 .../internal/apk/v3/V3SchemeSigner.java | 0 .../internal/apk/v3/V3SchemeVerifier.java | 0 .../apk/v3/V3SigningCertificateLineage.java | 0 .../internal/apk/v4/V4SchemeSigner.java | 0 .../internal/apk/v4/V4SchemeVerifier.java | 0 .../apksig/internal/apk/v4/V4Signature.java | 0 .../apksig/internal/asn1/Asn1BerParser.java | 0 .../apksig/internal/asn1/Asn1Class.java | 0 .../internal/asn1/Asn1DecodingException.java | 0 .../apksig/internal/asn1/Asn1DerEncoder.java | 0 .../internal/asn1/Asn1EncodingException.java | 0 .../apksig/internal/asn1/Asn1Field.java | 0 .../internal/asn1/Asn1OpaqueObject.java | 0 .../apksig/internal/asn1/Asn1TagClass.java | 0 .../apksig/internal/asn1/Asn1Tagging.java | 0 .../apksig/internal/asn1/Asn1Type.java | 0 .../internal/asn1/ber/BerDataValue.java | 0 .../asn1/ber/BerDataValueFormatException.java | 0 .../internal/asn1/ber/BerDataValueReader.java | 0 .../apksig/internal/asn1/ber/BerEncoding.java | 0 .../ber/ByteBufferBerDataValueReader.java | 0 .../ber/InputStreamBerDataValueReader.java | 0 .../apksig/internal/jar/ManifestParser.java | 0 .../apksig/internal/jar/ManifestWriter.java | 0 .../internal/jar/SignatureFileWriter.java | 0 .../apksig/internal/oid/OidConstants.java | 0 .../internal/pkcs7/AlgorithmIdentifier.java | 0 .../apksig/internal/pkcs7/Attribute.java | 0 .../apksig/internal/pkcs7/ContentInfo.java | 0 .../pkcs7/EncapsulatedContentInfo.java | 0 .../internal/pkcs7/IssuerAndSerialNumber.java | 0 .../apksig/internal/pkcs7/Pkcs7Constants.java | 0 .../pkcs7/Pkcs7DecodingException.java | 0 .../apksig/internal/pkcs7/SignedData.java | 0 .../internal/pkcs7/SignerIdentifier.java | 0 .../apksig/internal/pkcs7/SignerInfo.java | 0 .../internal/util/AndroidSdkVersion.java | 0 .../internal/util/ByteArrayDataSink.java | 0 .../internal/util/ByteBufferDataSource.java | 0 .../apksig/internal/util/ByteBufferSink.java | 0 .../apksig/internal/util/ByteBufferUtils.java | 0 .../apksig/internal/util/ByteStreams.java | 0 .../internal/util/ChainedDataSource.java | 0 .../util/DelegatingX509Certificate.java | 0 .../internal/util/FileChannelDataSource.java | 0 .../GuaranteedEncodedFormX509Certificate.java | 0 .../internal/util/InclusiveIntRange.java | 0 .../internal/util/MessageDigestSink.java | 0 .../internal/util/OutputStreamDataSink.java | 0 .../android/apksig/internal/util/Pair.java | 0 .../util/RandomAccessFileDataSink.java | 0 .../apksig/internal/util/TeeDataSink.java | 0 .../internal/util/VerityTreeBuilder.java | 0 .../internal/util/X509CertificateUtils.java | 0 .../internal/x509/AttributeTypeAndValue.java | 0 .../apksig/internal/x509/Certificate.java | 0 .../apksig/internal/x509/Extension.java | 0 .../android/apksig/internal/x509/Name.java | 0 .../apksig/internal/x509/RSAPublicKey.java | 0 .../x509/RelativeDistinguishedName.java | 0 .../internal/x509/SubjectPublicKeyInfo.java | 0 .../apksig/internal/x509/TBSCertificate.java | 0 .../android/apksig/internal/x509/Time.java | 0 .../apksig/internal/x509/Validity.java | 0 .../internal/zip/CentralDirectoryRecord.java | 0 .../apksig/internal/zip/EocdRecord.java | 0 .../apksig/internal/zip/LocalFileRecord.java | 0 .../android/apksig/internal/zip/ZipUtils.java | 0 .../com/android/apksig/kms/KmsException.java | 0 .../apksig/kms/KmsSignerEngineProvider.java | 0 .../java/com/android/apksig/kms/KmsType.java | 0 .../com/android/apksig/util/DataSink.java | 0 .../com/android/apksig/util/DataSinks.java | 0 .../com/android/apksig/util/DataSource.java | 0 .../com/android/apksig/util/DataSources.java | 0 .../android/apksig/util/ReadableDataSink.java | 0 .../apksig/util/RunnablesExecutor.java | 0 .../apksig/util/RunnablesProvider.java | 0 .../apksig/zip/ZipFormatException.java | 0 .../com/android/apksig/zip/ZipSections.java | 0 .../com/android/apksigner/ApkSignerTool.java | 0 .../com/android/apksigner/HexEncoding.java | 0 .../com/android/apksigner/OptionsParser.java | 0 .../android/apksigner/ParameterException.java | 0 .../android/apksigner/PasswordRetriever.java | 0 .../com/android/apksigner/SignerParams.java | 0 .../main/java/com/android/apksigner/help.txt | 0 .../com/android/apksigner/help_lineage.txt | 0 .../com/android/apksigner/help_rotate.txt | 0 .../java/com/android/apksigner/help_sign.txt | 0 .../com/android/apksigner/help_verify.txt | 0 .../android/apksigner/utils/FileUtils.java | 0 .../main/java/com/mcal/apksigner/ApkSigner.kt | 0 .../java/com/mcal/apksigner/CertConverter.kt | 0 .../java/com/mcal/apksigner/CertCreator.kt | 0 .../app/filepicker/FilePickHelper.java | 0 .../app/filepicker/MimeTypeUtil.java | 0 .../apksigner/app/filepicker/RequestFile.java | 0 .../java/com/mcal/apksigner/utils/Base64.kt | 0 .../utils/DistinguishedNameValues.kt | 0 .../java/com/mcal/apksigner/utils/JKS.java | 0 .../com/mcal/apksigner/utils/JksKeyStore.kt | 0 .../java/com/mcal/apksigner/utils/KeySet.java | 0 .../mcal/apksigner/utils/KeyStoreHelper.kt | 0 .../apksigner/utils/LoadKeystoreException.kt | 0 .../src/main/resources/keystore/testkey.pk8 | Bin .../main/resources/keystore/testkey.x509.pem | 0 modules/color-picker/.gitignore | 1 + modules/color-picker/build.gradle | 41 + .../color-picker/src/main/AndroidManifest.xml | 1 + .../colorpicker/AlphaPatternDrawable.java | 110 ++ .../colorpicker/ColorPaletteAdapter.java | 143 +++ .../android/colorpicker/ColorPanelView.java | 308 ++++++ .../colorpicker/ColorPickerDialog.java | 972 ++++++++++++++++++ .../ColorPickerDialogListener.java | 43 + .../android/colorpicker/ColorPickerView.java | 962 +++++++++++++++++ .../android/colorpicker/ColorPreference.java | 211 ++++ .../colorpicker/ColorPreferenceCompat.java | 207 ++++ .../android/colorpicker/ColorShape.java | 29 + .../android/colorpicker/DrawingUtils.java | 32 + .../android/colorpicker/NestedGridView.java | 42 + .../src/main/res/drawable-hdpi/cpv_alpha.png | Bin 0 -> 81 bytes .../src/main/res/drawable-xhdpi/cpv_alpha.png | Bin 0 -> 93 bytes .../main/res/drawable-xxhdpi/cpv_alpha.png | Bin 0 -> 101 bytes .../main/res/drawable/cpv_btn_background.xml | 7 + .../drawable/cpv_btn_background_pressed.xml | 14 + .../cpv_ic_arrow_right_black_24dp.xml | 10 + .../main/res/drawable/cpv_preset_checked.xml | 9 + .../main/res/layout/cpv_color_item_circle.xml | 27 + .../main/res/layout/cpv_color_item_square.xml | 27 + .../res/layout/cpv_dialog_color_picker.xml | 99 ++ .../main/res/layout/cpv_dialog_presets.xml | 100 ++ .../main/res/layout/cpv_preference_circle.xml | 8 + .../layout/cpv_preference_circle_large.xml | 8 + .../main/res/layout/cpv_preference_square.xml | 8 + .../layout/cpv_preference_square_large.xml | 8 + .../src/main/res/values-ar/strings.xml | 23 + .../src/main/res/values-be/strings.xml | 23 + .../src/main/res/values-cs/strings.xml | 23 + .../src/main/res/values-de/strings.xml | 23 + .../src/main/res/values-es/strings.xml | 9 + .../src/main/res/values-fr-rFR/strings.xml | 20 + .../src/main/res/values-it-rIT/strings.xml | 22 + .../src/main/res/values-iw/strings.xml | 8 + .../src/main/res/values-ja/strings.xml | 23 + .../src/main/res/values-nl-rNL/strings.xml | 20 + .../src/main/res/values-pl/strings.xml | 23 + .../src/main/res/values-pt/strings.xml | 9 + .../src/main/res/values-ru/strings.xml | 23 + .../src/main/res/values-sk/strings.xml | 23 + .../src/main/res/values-tr/strings.xml | 20 + .../src/main/res/values-zh/strings.xml | 23 + .../src/main/res/values/attrs.xml | 38 + .../src/main/res/values/dimen.xml | 11 + .../color-picker/src/main/res/values/ids.xml | 8 + .../src/main/res/values/strings.xml | 23 + .../src/main/res/values/styles.xml | 25 + .../jieba-analysis}/LICENSE | 0 .../jieba-analysis}/README.md | 0 .../jieba-analysis}/build.gradle | 0 .../main/assets/dict-chinese-chars.db.gzip | Bin .../main/assets/dict-chinese-phrases.db.gzip | Bin .../main/assets/dict-chinese-words.db.gzip | Bin .../src/main/assets/prob_emit.txt | 0 .../huaban/analysis/jieba/CharacterUtil.kt | 0 .../analysis/jieba/CharsDictionaryDatabase.kt | 0 .../com/huaban/analysis/jieba/DictSegment.kt | 0 .../analysis/jieba/DictionaryDatabase.kt | 0 .../java/com/huaban/analysis/jieba/Hit.java | 0 .../huaban/analysis/jieba/JiebaSegmenter.kt | 0 .../java/com/huaban/analysis/jieba/Log.java | 0 .../java/com/huaban/analysis/jieba/Node.java | 0 .../java/com/huaban/analysis/jieba/Pair.java | 0 .../jieba/PhrasesDictionaryDatabase.kt | 0 .../com/huaban/analysis/jieba/SegToken.java | 0 .../huaban/analysis/jieba/WordDictionary.kt | 0 .../analysis/jieba/WordDictionaryDatabase.kt | 0 .../huaban/analysis/jieba/viterbi/FinalSeg.kt | 0 settings.gradle.kts | 5 +- version.properties | 6 +- 284 files changed, 6919 insertions(+), 537 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/core/image/ColorItems.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt create mode 100644 app/src/main/res/drawable/ic_color_palette_vector.xml rename app/src/main/res/values-ar/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) create mode 100644 app/src/main/res/values-en/android_colors_string.xml create mode 100644 app/src/main/res/values-en/css_colors_string.xml rename app/src/main/res/values-en/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) create mode 100644 app/src/main/res/values-en/web_colors_string.xml rename app/src/main/res/values-es/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-fr/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-ja/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-ko/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-ru/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-zh-rHK/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) rename app/src/main/res/values-zh-rTW/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) create mode 100644 app/src/main/res/values-zh/android_colors_string.xml create mode 100644 app/src/main/res/values-zh/css_colors_string.xml rename app/src/main/res/values-zh/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) create mode 100644 app/src/main/res/values-zh/web_colors_string.xml create mode 100644 app/src/main/res/values/android_colors.xml create mode 100644 app/src/main/res/values/android_colors_string.xml create mode 100644 app/src/main/res/values/css_colors.xml create mode 100644 app/src/main/res/values/css_colors_string.xml rename app/src/main/res/values/{android_material_design_colors.xml => material_design_colors.xml} (100%) rename app/src/main/res/values/{android_material_design_colors_string.xml => material_design_colors_string.xml} (100%) create mode 100644 app/src/main/res/values/web_colors.xml create mode 100644 app/src/main/res/values/web_colors_string.xml rename {apksigner => modules/apk-signer}/.gitignore (100%) rename {apksigner => modules/apk-signer}/build.gradle (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/ApkSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/ApkSignerEngine.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/ApkVerificationIssue.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/ApkVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/Constants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/DefaultApkSignerEngine.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/Hints.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/JcaSignerEngine.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/KeyConfig.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/SignerEngine.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/SignerEngineFactory.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/SigningCertificateLineage.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/SourceStampVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/ApkFormatException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/ApkUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/ApkUtilsLite.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/apk/MinSdkVersionException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ApkSigResult.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtilsLite.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ApkSupportedSignature.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/NoApkSupportedSignaturesException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/SignatureNotFoundException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampCertificateLineage.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeConstants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeConstants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/jar/ManifestParser.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/oid/OidConstants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ByteStreams.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/Pair.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/TeeDataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/Certificate.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/Extension.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/Name.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/Time.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/x509/Validity.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/zip/EocdRecord.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/internal/zip/ZipUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/kms/KmsException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/kms/KmsSignerEngineProvider.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/kms/KmsType.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/DataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/DataSinks.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/DataSource.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/DataSources.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/ReadableDataSink.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/RunnablesExecutor.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/util/RunnablesProvider.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/zip/ZipFormatException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksig/zip/ZipSections.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/ApkSignerTool.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/HexEncoding.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/OptionsParser.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/ParameterException.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/PasswordRetriever.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/SignerParams.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/help.txt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/help_lineage.txt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/help_rotate.txt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/help_sign.txt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/help_verify.txt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/android/apksigner/utils/FileUtils.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/ApkSigner.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/CertConverter.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/CertCreator.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/app/filepicker/FilePickHelper.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/app/filepicker/MimeTypeUtil.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/app/filepicker/RequestFile.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/Base64.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/DistinguishedNameValues.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/JKS.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/JksKeyStore.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/KeySet.java (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/KeyStoreHelper.kt (100%) rename {apksigner => modules/apk-signer}/src/main/java/com/mcal/apksigner/utils/LoadKeystoreException.kt (100%) rename {apksigner => modules/apk-signer}/src/main/resources/keystore/testkey.pk8 (100%) rename {apksigner => modules/apk-signer}/src/main/resources/keystore/testkey.x509.pem (100%) create mode 100644 modules/color-picker/.gitignore create mode 100644 modules/color-picker/build.gradle create mode 100644 modules/color-picker/src/main/AndroidManifest.xml create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/AlphaPatternDrawable.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPaletteAdapter.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPanelView.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialog.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialogListener.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerView.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreference.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreferenceCompat.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorShape.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/DrawingUtils.java create mode 100644 modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/NestedGridView.java create mode 100644 modules/color-picker/src/main/res/drawable-hdpi/cpv_alpha.png create mode 100644 modules/color-picker/src/main/res/drawable-xhdpi/cpv_alpha.png create mode 100644 modules/color-picker/src/main/res/drawable-xxhdpi/cpv_alpha.png create mode 100644 modules/color-picker/src/main/res/drawable/cpv_btn_background.xml create mode 100644 modules/color-picker/src/main/res/drawable/cpv_btn_background_pressed.xml create mode 100644 modules/color-picker/src/main/res/drawable/cpv_ic_arrow_right_black_24dp.xml create mode 100644 modules/color-picker/src/main/res/drawable/cpv_preset_checked.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_color_item_circle.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_color_item_square.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_dialog_color_picker.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_dialog_presets.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_preference_circle.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_preference_circle_large.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_preference_square.xml create mode 100644 modules/color-picker/src/main/res/layout/cpv_preference_square_large.xml create mode 100644 modules/color-picker/src/main/res/values-ar/strings.xml create mode 100644 modules/color-picker/src/main/res/values-be/strings.xml create mode 100644 modules/color-picker/src/main/res/values-cs/strings.xml create mode 100644 modules/color-picker/src/main/res/values-de/strings.xml create mode 100644 modules/color-picker/src/main/res/values-es/strings.xml create mode 100644 modules/color-picker/src/main/res/values-fr-rFR/strings.xml create mode 100644 modules/color-picker/src/main/res/values-it-rIT/strings.xml create mode 100644 modules/color-picker/src/main/res/values-iw/strings.xml create mode 100644 modules/color-picker/src/main/res/values-ja/strings.xml create mode 100644 modules/color-picker/src/main/res/values-nl-rNL/strings.xml create mode 100644 modules/color-picker/src/main/res/values-pl/strings.xml create mode 100644 modules/color-picker/src/main/res/values-pt/strings.xml create mode 100644 modules/color-picker/src/main/res/values-ru/strings.xml create mode 100644 modules/color-picker/src/main/res/values-sk/strings.xml create mode 100644 modules/color-picker/src/main/res/values-tr/strings.xml create mode 100644 modules/color-picker/src/main/res/values-zh/strings.xml create mode 100644 modules/color-picker/src/main/res/values/attrs.xml create mode 100644 modules/color-picker/src/main/res/values/dimen.xml create mode 100644 modules/color-picker/src/main/res/values/ids.xml create mode 100644 modules/color-picker/src/main/res/values/strings.xml create mode 100644 modules/color-picker/src/main/res/values/styles.xml rename {jieba-analysis => modules/jieba-analysis}/LICENSE (100%) rename {jieba-analysis => modules/jieba-analysis}/README.md (100%) rename {jieba-analysis => modules/jieba-analysis}/build.gradle (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/assets/dict-chinese-chars.db.gzip (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/assets/dict-chinese-phrases.db.gzip (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/assets/dict-chinese-words.db.gzip (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/assets/prob_emit.txt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/CharacterUtil.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/CharsDictionaryDatabase.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/DictSegment.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/DictionaryDatabase.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/Hit.java (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/Log.java (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/Node.java (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/Pair.java (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/PhrasesDictionaryDatabase.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/SegToken.java (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/WordDictionary.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/WordDictionaryDatabase.kt (100%) rename {jieba-analysis => modules/jieba-analysis}/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c79700af..7ab25e0d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -215,7 +215,7 @@ dependencies /* Unclassified */ { // implementation("com.android.tools.build:apksig:8.7.3") // ApkSigner - implementation(project(":modules:apksigner")) + implementation(project(":modules:apk-signer")) // Spongy Castle implementation("com.madgag.spongycastle:prov:1.58.0.0") @@ -361,10 +361,12 @@ dependencies /* Auto.js Extensions */ { // # implementation(project(":libs:Auto.js-ApkBuilder-1.0.3")) // Extracted from com.github.hyb1996:MutableTheme:1.0.0 - // @Legacy com.jrummyapps:colorpicker:2.1.7 - implementation("com.jaredrummler:colorpicker:1.1.0") implementation("androidx.recyclerview:recyclerview:1.4.0") implementation("com.github.ozodrukh:CircularReveal:2.0.1") + // @Legacy com.jrummyapps:colorpicker:2.1.7 + // @Integrated by SuperMonster003 on Mar 25, 2025. + // # implementation("com.jaredrummler:colorpicker:1.1.0") + implementation(project(":modules:color-picker")) } dependencies /* Archived */ { diff --git a/app/src/main/java/org/autojs/autojs/core/image/ColorItems.kt b/app/src/main/java/org/autojs/autojs/core/image/ColorItems.kt new file mode 100644 index 00000000..6ba16ebc --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/core/image/ColorItems.kt @@ -0,0 +1,758 @@ +package org.autojs.autojs.core.image + +import org.autojs.autojs6.R + +/** + * Created by SuperMonster003 on Mar 25, 2025. + */ +object ColorItems { + + @JvmField + val MATERIAL_COLORS: List> = listOf( + + /* reds */ + + R.color.md_red_50 to R.string.md_red_50, + R.color.md_red_100 to R.string.md_red_100, + R.color.md_red_200 to R.string.md_red_200, + R.color.md_red_300 to R.string.md_red_300, + R.color.md_red_400 to R.string.md_red_400, + R.color.md_red_500 to R.string.md_red_500, + R.color.md_red_600 to R.string.md_red_600, + R.color.md_red_700 to R.string.md_red_700, + R.color.md_red_800 to R.string.md_red_800, + R.color.md_red_900 to R.string.md_red_900, + R.color.md_red_a100 to R.string.md_red_a100, + R.color.md_red_a200 to R.string.md_red_a200, + R.color.md_red_a400 to R.string.md_red_a400, + R.color.md_red_a700 to R.string.md_red_a700, + + /* pinks */ + + R.color.md_pink_50 to R.string.md_pink_50, + R.color.md_pink_100 to R.string.md_pink_100, + R.color.md_pink_200 to R.string.md_pink_200, + R.color.md_pink_300 to R.string.md_pink_300, + R.color.md_pink_400 to R.string.md_pink_400, + R.color.md_pink_500 to R.string.md_pink_500, + R.color.md_pink_600 to R.string.md_pink_600, + R.color.md_pink_700 to R.string.md_pink_700, + R.color.md_pink_800 to R.string.md_pink_800, + R.color.md_pink_900 to R.string.md_pink_900, + R.color.md_pink_a100 to R.string.md_pink_a100, + R.color.md_pink_a200 to R.string.md_pink_a200, + R.color.md_pink_a400 to R.string.md_pink_a400, + R.color.md_pink_a700 to R.string.md_pink_a700, + + /* purples */ + + R.color.md_purple_50 to R.string.md_purple_50, + R.color.md_purple_100 to R.string.md_purple_100, + R.color.md_purple_200 to R.string.md_purple_200, + R.color.md_purple_300 to R.string.md_purple_300, + R.color.md_purple_400 to R.string.md_purple_400, + R.color.md_purple_500 to R.string.md_purple_500, + R.color.md_purple_600 to R.string.md_purple_600, + R.color.md_purple_700 to R.string.md_purple_700, + R.color.md_purple_800 to R.string.md_purple_800, + R.color.md_purple_900 to R.string.md_purple_900, + R.color.md_purple_a100 to R.string.md_purple_a100, + R.color.md_purple_a200 to R.string.md_purple_a200, + R.color.md_purple_a400 to R.string.md_purple_a400, + R.color.md_purple_a700 to R.string.md_purple_a700, + + /* deep purples */ + + R.color.md_deep_purple_50 to R.string.md_deep_purple_50, + R.color.md_deep_purple_100 to R.string.md_deep_purple_100, + R.color.md_deep_purple_200 to R.string.md_deep_purple_200, + R.color.md_deep_purple_300 to R.string.md_deep_purple_300, + R.color.md_deep_purple_400 to R.string.md_deep_purple_400, + R.color.md_deep_purple_500 to R.string.md_deep_purple_500, + R.color.md_deep_purple_600 to R.string.md_deep_purple_600, + R.color.md_deep_purple_700 to R.string.md_deep_purple_700, + R.color.md_deep_purple_800 to R.string.md_deep_purple_800, + R.color.md_deep_purple_900 to R.string.md_deep_purple_900, + R.color.md_deep_purple_a100 to R.string.md_deep_purple_a100, + R.color.md_deep_purple_a200 to R.string.md_deep_purple_a200, + R.color.md_deep_purple_a400 to R.string.md_deep_purple_a400, + R.color.md_deep_purple_a700 to R.string.md_deep_purple_a700, + + /* indigo */ + + R.color.md_indigo_50 to R.string.md_indigo_50, + R.color.md_indigo_100 to R.string.md_indigo_100, + R.color.md_indigo_200 to R.string.md_indigo_200, + R.color.md_indigo_300 to R.string.md_indigo_300, + R.color.md_indigo_400 to R.string.md_indigo_400, + R.color.md_indigo_500 to R.string.md_indigo_500, + R.color.md_indigo_600 to R.string.md_indigo_600, + R.color.md_indigo_700 to R.string.md_indigo_700, + R.color.md_indigo_800 to R.string.md_indigo_800, + R.color.md_indigo_900 to R.string.md_indigo_900, + R.color.md_indigo_a100 to R.string.md_indigo_a100, + R.color.md_indigo_a200 to R.string.md_indigo_a200, + R.color.md_indigo_a400 to R.string.md_indigo_a400, + R.color.md_indigo_a700 to R.string.md_indigo_a700, + + /* blue */ + + R.color.md_blue_50 to R.string.md_blue_50, + R.color.md_blue_100 to R.string.md_blue_100, + R.color.md_blue_200 to R.string.md_blue_200, + R.color.md_blue_300 to R.string.md_blue_300, + R.color.md_blue_400 to R.string.md_blue_400, + R.color.md_blue_500 to R.string.md_blue_500, + R.color.md_blue_600 to R.string.md_blue_600, + R.color.md_blue_700 to R.string.md_blue_700, + R.color.md_blue_800 to R.string.md_blue_800, + R.color.md_blue_900 to R.string.md_blue_900, + R.color.md_blue_a100 to R.string.md_blue_a100, + R.color.md_blue_a200 to R.string.md_blue_a200, + R.color.md_blue_a400 to R.string.md_blue_a400, + R.color.md_blue_a700 to R.string.md_blue_a700, + + /* light blue */ + + R.color.md_light_blue_50 to R.string.md_light_blue_50, + R.color.md_light_blue_100 to R.string.md_light_blue_100, + R.color.md_light_blue_200 to R.string.md_light_blue_200, + R.color.md_light_blue_300 to R.string.md_light_blue_300, + R.color.md_light_blue_400 to R.string.md_light_blue_400, + R.color.md_light_blue_500 to R.string.md_light_blue_500, + R.color.md_light_blue_600 to R.string.md_light_blue_600, + R.color.md_light_blue_700 to R.string.md_light_blue_700, + R.color.md_light_blue_800 to R.string.md_light_blue_800, + R.color.md_light_blue_900 to R.string.md_light_blue_900, + R.color.md_light_blue_a100 to R.string.md_light_blue_a100, + R.color.md_light_blue_a200 to R.string.md_light_blue_a200, + R.color.md_light_blue_a400 to R.string.md_light_blue_a400, + R.color.md_light_blue_a700 to R.string.md_light_blue_a700, + + /* cyan */ + + R.color.md_cyan_50 to R.string.md_cyan_50, + R.color.md_cyan_100 to R.string.md_cyan_100, + R.color.md_cyan_200 to R.string.md_cyan_200, + R.color.md_cyan_300 to R.string.md_cyan_300, + R.color.md_cyan_400 to R.string.md_cyan_400, + R.color.md_cyan_500 to R.string.md_cyan_500, + R.color.md_cyan_600 to R.string.md_cyan_600, + R.color.md_cyan_700 to R.string.md_cyan_700, + R.color.md_cyan_800 to R.string.md_cyan_800, + R.color.md_cyan_900 to R.string.md_cyan_900, + R.color.md_cyan_a100 to R.string.md_cyan_a100, + R.color.md_cyan_a200 to R.string.md_cyan_a200, + R.color.md_cyan_a400 to R.string.md_cyan_a400, + R.color.md_cyan_a700 to R.string.md_cyan_a700, + + /* teal */ + + R.color.md_teal_50 to R.string.md_teal_50, + R.color.md_teal_100 to R.string.md_teal_100, + R.color.md_teal_200 to R.string.md_teal_200, + R.color.md_teal_300 to R.string.md_teal_300, + R.color.md_teal_400 to R.string.md_teal_400, + R.color.md_teal_500 to R.string.md_teal_500, + R.color.md_teal_600 to R.string.md_teal_600, + R.color.md_teal_700 to R.string.md_teal_700, + R.color.md_teal_800 to R.string.md_teal_800, + R.color.md_teal_900 to R.string.md_teal_900, + R.color.md_teal_a100 to R.string.md_teal_a100, + R.color.md_teal_a200 to R.string.md_teal_a200, + R.color.md_teal_a400 to R.string.md_teal_a400, + R.color.md_teal_a700 to R.string.md_teal_a700, + + /* green */ + + R.color.md_green_50 to R.string.md_green_50, + R.color.md_green_100 to R.string.md_green_100, + R.color.md_green_200 to R.string.md_green_200, + R.color.md_green_300 to R.string.md_green_300, + R.color.md_green_400 to R.string.md_green_400, + R.color.md_green_500 to R.string.md_green_500, + R.color.md_green_600 to R.string.md_green_600, + R.color.md_green_700 to R.string.md_green_700, + R.color.md_green_800 to R.string.md_green_800, + R.color.md_green_900 to R.string.md_green_900, + R.color.md_green_a100 to R.string.md_green_a100, + R.color.md_green_a200 to R.string.md_green_a200, + R.color.md_green_a400 to R.string.md_green_a400, + R.color.md_green_a700 to R.string.md_green_a700, + + /* light green */ + + R.color.md_light_green_50 to R.string.md_light_green_50, + R.color.md_light_green_100 to R.string.md_light_green_100, + R.color.md_light_green_200 to R.string.md_light_green_200, + R.color.md_light_green_300 to R.string.md_light_green_300, + R.color.md_light_green_400 to R.string.md_light_green_400, + R.color.md_light_green_500 to R.string.md_light_green_500, + R.color.md_light_green_600 to R.string.md_light_green_600, + R.color.md_light_green_700 to R.string.md_light_green_700, + R.color.md_light_green_800 to R.string.md_light_green_800, + R.color.md_light_green_900 to R.string.md_light_green_900, + R.color.md_light_green_a100 to R.string.md_light_green_a100, + R.color.md_light_green_a200 to R.string.md_light_green_a200, + R.color.md_light_green_a400 to R.string.md_light_green_a400, + R.color.md_light_green_a700 to R.string.md_light_green_a700, + + /* lime */ + + R.color.md_lime_50 to R.string.md_lime_50, + R.color.md_lime_100 to R.string.md_lime_100, + R.color.md_lime_200 to R.string.md_lime_200, + R.color.md_lime_300 to R.string.md_lime_300, + R.color.md_lime_400 to R.string.md_lime_400, + R.color.md_lime_500 to R.string.md_lime_500, + R.color.md_lime_600 to R.string.md_lime_600, + R.color.md_lime_700 to R.string.md_lime_700, + R.color.md_lime_800 to R.string.md_lime_800, + R.color.md_lime_900 to R.string.md_lime_900, + R.color.md_lime_a100 to R.string.md_lime_a100, + R.color.md_lime_a200 to R.string.md_lime_a200, + R.color.md_lime_a400 to R.string.md_lime_a400, + R.color.md_lime_a700 to R.string.md_lime_a700, + + /* yellow */ + + R.color.md_yellow_50 to R.string.md_yellow_50, + R.color.md_yellow_100 to R.string.md_yellow_100, + R.color.md_yellow_200 to R.string.md_yellow_200, + R.color.md_yellow_300 to R.string.md_yellow_300, + R.color.md_yellow_400 to R.string.md_yellow_400, + R.color.md_yellow_500 to R.string.md_yellow_500, + R.color.md_yellow_600 to R.string.md_yellow_600, + R.color.md_yellow_700 to R.string.md_yellow_700, + R.color.md_yellow_800 to R.string.md_yellow_800, + R.color.md_yellow_900 to R.string.md_yellow_900, + R.color.md_yellow_a100 to R.string.md_yellow_a100, + R.color.md_yellow_a200 to R.string.md_yellow_a200, + R.color.md_yellow_a400 to R.string.md_yellow_a400, + R.color.md_yellow_a700 to R.string.md_yellow_a700, + + /* amber */ + + R.color.md_amber_50 to R.string.md_amber_50, + R.color.md_amber_100 to R.string.md_amber_100, + R.color.md_amber_200 to R.string.md_amber_200, + R.color.md_amber_300 to R.string.md_amber_300, + R.color.md_amber_400 to R.string.md_amber_400, + R.color.md_amber_500 to R.string.md_amber_500, + R.color.md_amber_600 to R.string.md_amber_600, + R.color.md_amber_700 to R.string.md_amber_700, + R.color.md_amber_800 to R.string.md_amber_800, + R.color.md_amber_900 to R.string.md_amber_900, + R.color.md_amber_a100 to R.string.md_amber_a100, + R.color.md_amber_a200 to R.string.md_amber_a200, + R.color.md_amber_a400 to R.string.md_amber_a400, + R.color.md_amber_a700 to R.string.md_amber_a700, + + /* orange */ + + R.color.md_orange_50 to R.string.md_orange_50, + R.color.md_orange_100 to R.string.md_orange_100, + R.color.md_orange_200 to R.string.md_orange_200, + R.color.md_orange_300 to R.string.md_orange_300, + R.color.md_orange_400 to R.string.md_orange_400, + R.color.md_orange_500 to R.string.md_orange_500, + R.color.md_orange_600 to R.string.md_orange_600, + R.color.md_orange_700 to R.string.md_orange_700, + R.color.md_orange_800 to R.string.md_orange_800, + R.color.md_orange_900 to R.string.md_orange_900, + R.color.md_orange_a100 to R.string.md_orange_a100, + R.color.md_orange_a200 to R.string.md_orange_a200, + R.color.md_orange_a400 to R.string.md_orange_a400, + R.color.md_orange_a700 to R.string.md_orange_a700, + + /* deep orange */ + + R.color.md_deep_orange_50 to R.string.md_deep_orange_50, + R.color.md_deep_orange_100 to R.string.md_deep_orange_100, + R.color.md_deep_orange_200 to R.string.md_deep_orange_200, + R.color.md_deep_orange_300 to R.string.md_deep_orange_300, + R.color.md_deep_orange_400 to R.string.md_deep_orange_400, + R.color.md_deep_orange_500 to R.string.md_deep_orange_500, + R.color.md_deep_orange_600 to R.string.md_deep_orange_600, + R.color.md_deep_orange_700 to R.string.md_deep_orange_700, + R.color.md_deep_orange_800 to R.string.md_deep_orange_800, + R.color.md_deep_orange_900 to R.string.md_deep_orange_900, + R.color.md_deep_orange_a100 to R.string.md_deep_orange_a100, + R.color.md_deep_orange_a200 to R.string.md_deep_orange_a200, + R.color.md_deep_orange_a400 to R.string.md_deep_orange_a400, + R.color.md_deep_orange_a700 to R.string.md_deep_orange_a700, + + /* brown */ + + R.color.md_brown_50 to R.string.md_brown_50, + R.color.md_brown_100 to R.string.md_brown_100, + R.color.md_brown_200 to R.string.md_brown_200, + R.color.md_brown_300 to R.string.md_brown_300, + R.color.md_brown_400 to R.string.md_brown_400, + R.color.md_brown_500 to R.string.md_brown_500, + R.color.md_brown_600 to R.string.md_brown_600, + R.color.md_brown_700 to R.string.md_brown_700, + R.color.md_brown_800 to R.string.md_brown_800, + R.color.md_brown_900 to R.string.md_brown_900, + + /* grey */ + + R.color.md_grey_50 to R.string.md_grey_50, + R.color.md_grey_100 to R.string.md_grey_100, + R.color.md_grey_200 to R.string.md_grey_200, + R.color.md_grey_300 to R.string.md_grey_300, + R.color.md_grey_400 to R.string.md_grey_400, + R.color.md_grey_500 to R.string.md_grey_500, + R.color.md_grey_600 to R.string.md_grey_600, + R.color.md_grey_700 to R.string.md_grey_700, + R.color.md_grey_800 to R.string.md_grey_800, + R.color.md_grey_900 to R.string.md_grey_900, + R.color.md_black_1000 to R.string.md_black_1000, + R.color.md_white_1000 to R.string.md_white_1000, + + /* blue grey */ + + R.color.md_blue_grey_50 to R.string.md_blue_grey_50, + R.color.md_blue_grey_100 to R.string.md_blue_grey_100, + R.color.md_blue_grey_200 to R.string.md_blue_grey_200, + R.color.md_blue_grey_300 to R.string.md_blue_grey_300, + R.color.md_blue_grey_400 to R.string.md_blue_grey_400, + R.color.md_blue_grey_500 to R.string.md_blue_grey_500, + R.color.md_blue_grey_600 to R.string.md_blue_grey_600, + R.color.md_blue_grey_700 to R.string.md_blue_grey_700, + R.color.md_blue_grey_800 to R.string.md_blue_grey_800, + R.color.md_blue_grey_900 to R.string.md_blue_grey_900, + ) + + @JvmField + val ANDROID_COLORS: List> = listOf( + R.color.android_black to R.string.android_black, + R.color.android_blue to R.string.android_blue, + R.color.android_cyan to R.string.android_cyan, + R.color.android_aqua to R.string.android_aqua, + R.color.android_dark_gray to R.string.android_dark_gray, + R.color.android_dark_grey to R.string.android_dark_grey, + R.color.android_gray to R.string.android_gray, + R.color.android_grey to R.string.android_grey, + R.color.android_green to R.string.android_green, + R.color.android_lime to R.string.android_lime, + R.color.android_light_gray to R.string.android_light_gray, + R.color.android_light_grey to R.string.android_light_grey, + R.color.android_magenta to R.string.android_magenta, + R.color.android_fuchsia to R.string.android_fuchsia, + R.color.android_maroon to R.string.android_maroon, + R.color.android_navy to R.string.android_navy, + R.color.android_olive to R.string.android_olive, + R.color.android_purple to R.string.android_purple, + R.color.android_red to R.string.android_red, + R.color.android_silver to R.string.android_silver, + R.color.android_teal to R.string.android_teal, + R.color.android_white to R.string.android_white, + R.color.android_yellow to R.string.android_yellow, + ) + + @JvmField + val CSS_COLORS: List> = listOf( + R.color.css_alice_blue to R.string.css_alice_blue, + R.color.css_antique_white to R.string.css_antique_white, + R.color.css_aquamarine to R.string.css_aquamarine, + R.color.css_azure to R.string.css_azure, + R.color.css_beige to R.string.css_beige, + R.color.css_bisque to R.string.css_bisque, + R.color.css_black to R.string.css_black, + R.color.css_blanched_almond to R.string.css_blanched_almond, + R.color.css_blue to R.string.css_blue, + R.color.css_blue_violet to R.string.css_blue_violet, + R.color.css_brown to R.string.css_brown, + R.color.css_burly_wood to R.string.css_burly_wood, + R.color.css_cadet_blue to R.string.css_cadet_blue, + R.color.css_chartreuse to R.string.css_chartreuse, + R.color.css_chocolate to R.string.css_chocolate, + R.color.css_coral to R.string.css_coral, + R.color.css_cornflower_blue to R.string.css_cornflower_blue, + R.color.css_corn_silk to R.string.css_corn_silk, + R.color.css_crimson to R.string.css_crimson, + R.color.css_cyan to R.string.css_cyan, + R.color.css_aqua to R.string.css_aqua, + R.color.css_dark_blue to R.string.css_dark_blue, + R.color.css_dark_cyan to R.string.css_dark_cyan, + R.color.css_dark_goldenrod to R.string.css_dark_goldenrod, + R.color.css_dark_gray to R.string.css_dark_gray, + R.color.css_dark_grey to R.string.css_dark_grey, + R.color.css_dark_green to R.string.css_dark_green, + R.color.css_dark_khaki to R.string.css_dark_khaki, + R.color.css_dark_magenta to R.string.css_dark_magenta, + R.color.css_dark_olive_green to R.string.css_dark_olive_green, + R.color.css_dark_orange to R.string.css_dark_orange, + R.color.css_dark_orchid to R.string.css_dark_orchid, + R.color.css_dark_red to R.string.css_dark_red, + R.color.css_dark_salmon to R.string.css_dark_salmon, + R.color.css_dark_sea_green to R.string.css_dark_sea_green, + R.color.css_dark_slate_blue to R.string.css_dark_slate_blue, + R.color.css_dark_slate_gray to R.string.css_dark_slate_gray, + R.color.css_dark_slate_grey to R.string.css_dark_slate_grey, + R.color.css_dark_turquoise to R.string.css_dark_turquoise, + R.color.css_dark_violet to R.string.css_dark_violet, + R.color.css_deep_pink to R.string.css_deep_pink, + R.color.css_deep_sky_blue to R.string.css_deep_sky_blue, + R.color.css_dim_gray to R.string.css_dim_gray, + R.color.css_dim_grey to R.string.css_dim_grey, + R.color.css_dodger_blue to R.string.css_dodger_blue, + R.color.css_fire_brick to R.string.css_fire_brick, + R.color.css_floral_white to R.string.css_floral_white, + R.color.css_forest_green to R.string.css_forest_green, + R.color.css_gainsboro to R.string.css_gainsboro, + R.color.css_ghost_white to R.string.css_ghost_white, + R.color.css_gold to R.string.css_gold, + R.color.css_goldenrod to R.string.css_goldenrod, + R.color.css_gray to R.string.css_gray, + R.color.css_grey to R.string.css_grey, + R.color.css_green to R.string.css_green, + R.color.css_green_yellow to R.string.css_green_yellow, + R.color.css_honeydew to R.string.css_honeydew, + R.color.css_hot_pink to R.string.css_hot_pink, + R.color.css_indian_red to R.string.css_indian_red, + R.color.css_indigo to R.string.css_indigo, + R.color.css_ivory to R.string.css_ivory, + R.color.css_khaki to R.string.css_khaki, + R.color.css_lavender to R.string.css_lavender, + R.color.css_lavender_blush to R.string.css_lavender_blush, + R.color.css_lawn_green to R.string.css_lawn_green, + R.color.css_lemon_chiffon to R.string.css_lemon_chiffon, + R.color.css_light_blue to R.string.css_light_blue, + R.color.css_light_coral to R.string.css_light_coral, + R.color.css_light_cyan to R.string.css_light_cyan, + R.color.css_light_goldenrod_yellow to R.string.css_light_goldenrod_yellow, + R.color.css_light_gray to R.string.css_light_gray, + R.color.css_light_grey to R.string.css_light_grey, + R.color.css_light_green to R.string.css_light_green, + R.color.css_light_pink to R.string.css_light_pink, + R.color.css_light_salmon to R.string.css_light_salmon, + R.color.css_light_sea_green to R.string.css_light_sea_green, + R.color.css_light_sky_blue to R.string.css_light_sky_blue, + R.color.css_light_slate_gray to R.string.css_light_slate_gray, + R.color.css_light_slate_grey to R.string.css_light_slate_grey, + R.color.css_light_steel_blue to R.string.css_light_steel_blue, + R.color.css_light_yellow to R.string.css_light_yellow, + R.color.css_lime to R.string.css_lime, + R.color.css_lime_green to R.string.css_lime_green, + R.color.css_linen to R.string.css_linen, + R.color.css_magenta to R.string.css_magenta, + R.color.css_fuchsia to R.string.css_fuchsia, + R.color.css_maroon to R.string.css_maroon, + R.color.css_medium_aquamarine to R.string.css_medium_aquamarine, + R.color.css_medium_blue to R.string.css_medium_blue, + R.color.css_medium_lavender_magenta to R.string.css_medium_lavender_magenta, + R.color.css_medium_orchid to R.string.css_medium_orchid, + R.color.css_medium_purple to R.string.css_medium_purple, + R.color.css_medium_sea_green to R.string.css_medium_sea_green, + R.color.css_medium_slate_blue to R.string.css_medium_slate_blue, + R.color.css_medium_spring_green to R.string.css_medium_spring_green, + R.color.css_medium_turquoise to R.string.css_medium_turquoise, + R.color.css_medium_violet_red to R.string.css_medium_violet_red, + R.color.css_midnight_blue to R.string.css_midnight_blue, + R.color.css_mint_cream to R.string.css_mint_cream, + R.color.css_misty_rose to R.string.css_misty_rose, + R.color.css_moccasin to R.string.css_moccasin, + R.color.css_navajo_white to R.string.css_navajo_white, + R.color.css_navy to R.string.css_navy, + R.color.css_old_lace to R.string.css_old_lace, + R.color.css_olive to R.string.css_olive, + R.color.css_olive_drab to R.string.css_olive_drab, + R.color.css_orange to R.string.css_orange, + R.color.css_orange_red to R.string.css_orange_red, + R.color.css_orchid to R.string.css_orchid, + R.color.css_pale_goldenrod to R.string.css_pale_goldenrod, + R.color.css_pale_green to R.string.css_pale_green, + R.color.css_pale_turquoise to R.string.css_pale_turquoise, + R.color.css_pale_violet_red to R.string.css_pale_violet_red, + R.color.css_papaya_whip to R.string.css_papaya_whip, + R.color.css_patriarch to R.string.css_patriarch, + R.color.css_peach_puff to R.string.css_peach_puff, + R.color.css_peru to R.string.css_peru, + R.color.css_pink to R.string.css_pink, + R.color.css_powder_blue to R.string.css_powder_blue, + R.color.css_rebecca_purple to R.string.css_rebecca_purple, + R.color.css_red to R.string.css_red, + R.color.css_rosy_brown to R.string.css_rosy_brown, + R.color.css_royal_blue to R.string.css_royal_blue, + R.color.css_saddle_brown to R.string.css_saddle_brown, + R.color.css_salmon to R.string.css_salmon, + R.color.css_sand_brown to R.string.css_sand_brown, + R.color.css_seashell to R.string.css_seashell, + R.color.css_sea_green to R.string.css_sea_green, + R.color.css_sienna to R.string.css_sienna, + R.color.css_silver to R.string.css_silver, + R.color.css_sky_blue to R.string.css_sky_blue, + R.color.css_slate_blue to R.string.css_slate_blue, + R.color.css_slate_gray to R.string.css_slate_gray, + R.color.css_slate_grey to R.string.css_slate_grey, + R.color.css_snow to R.string.css_snow, + R.color.css_spring_green to R.string.css_spring_green, + R.color.css_steel_blue to R.string.css_steel_blue, + R.color.css_tan to R.string.css_tan, + R.color.css_teal to R.string.css_teal, + R.color.css_thistle to R.string.css_thistle, + R.color.css_tomato to R.string.css_tomato, + R.color.css_turquoise to R.string.css_turquoise, + R.color.css_violet to R.string.css_violet, + R.color.css_wheat to R.string.css_wheat, + R.color.css_white to R.string.css_white, + R.color.css_white_smoke to R.string.css_white_smoke, + R.color.css_yellow to R.string.css_yellow, + R.color.css_yellow_green to R.string.css_yellow_green, + ) + + @JvmField + val WEB_COLORS: List> = listOf( + R.color.web_alice_blue to R.string.web_alice_blue, + R.color.web_alizarin_crimson to R.string.web_alizarin_crimson, + R.color.web_amber to R.string.web_amber, + R.color.web_amethyst to R.string.web_amethyst, + R.color.web_antique_white to R.string.web_antique_white, + R.color.web_apple_green to R.string.web_apple_green, + R.color.web_apricot to R.string.web_apricot, + R.color.web_aqua to R.string.web_aqua, + R.color.web_aquamarine to R.string.web_aquamarine, + R.color.web_aqua_blue to R.string.web_aqua_blue, + R.color.web_azure to R.string.web_azure, + R.color.web_baby_blue to R.string.web_baby_blue, + R.color.web_baby_pink to R.string.web_baby_pink, + R.color.web_beige to R.string.web_beige, + R.color.web_bisque to R.string.web_bisque, + R.color.web_black to R.string.web_black, + R.color.web_blanched_almond to R.string.web_blanched_almond, + R.color.web_blue to R.string.web_blue, + R.color.web_blue_violet to R.string.web_blue_violet, + R.color.web_bright_green to R.string.web_bright_green, + R.color.web_bronze to R.string.web_bronze, + R.color.web_brown to R.string.web_brown, + R.color.web_burgundy to R.string.web_burgundy, + R.color.web_burly_wood to R.string.web_burly_wood, + R.color.web_burnt_orange to R.string.web_burnt_orange, + R.color.web_cadet_blue to R.string.web_cadet_blue, + R.color.web_camel to R.string.web_camel, + R.color.web_camellia to R.string.web_camellia, + R.color.web_canary_yellow to R.string.web_canary_yellow, + R.color.web_cardinal_red to R.string.web_cardinal_red, + R.color.web_carmine to R.string.web_carmine, + R.color.web_celadon to R.string.web_celadon, + R.color.web_cerise to R.string.web_cerise, + R.color.web_cerulean_blue to R.string.web_cerulean_blue, + R.color.web_champagne_yellow to R.string.web_champagne_yellow, + R.color.web_chartreuse to R.string.web_chartreuse, + R.color.web_chocolate to R.string.web_chocolate, + R.color.web_chrome_yellow to R.string.web_chrome_yellow, + R.color.web_clematis to R.string.web_clematis, + R.color.web_cobalt_blue to R.string.web_cobalt_blue, + R.color.web_cobalt_green to R.string.web_cobalt_green, + R.color.web_coconut_brown to R.string.web_coconut_brown, + R.color.web_coffee to R.string.web_coffee, + R.color.web_coral to R.string.web_coral, + R.color.web_coral_pink to R.string.web_coral_pink, + R.color.web_cornflower_blue to R.string.web_cornflower_blue, + R.color.web_corn_silk to R.string.web_corn_silk, + R.color.web_cream to R.string.web_cream, + R.color.web_crimson to R.string.web_crimson, + R.color.web_cyan to R.string.web_cyan, + R.color.web_cyan_blue to R.string.web_cyan_blue, + R.color.web_dark_blue to R.string.web_dark_blue, + R.color.web_dark_cyan to R.string.web_dark_cyan, + R.color.web_dark_goldenrod to R.string.web_dark_goldenrod, + R.color.web_dark_gray to R.string.web_dark_gray, + R.color.web_dark_green to R.string.web_dark_green, + R.color.web_dark_khaki to R.string.web_dark_khaki, + R.color.web_dark_magenta to R.string.web_dark_magenta, + R.color.web_dark_mineral_blue to R.string.web_dark_mineral_blue, + R.color.web_dark_olive_green to R.string.web_dark_olive_green, + R.color.web_dark_orange to R.string.web_dark_orange, + R.color.web_dark_orchid to R.string.web_dark_orchid, + R.color.web_dark_powder_blue to R.string.web_dark_powder_blue, + R.color.web_dark_red to R.string.web_dark_red, + R.color.web_dark_salmon to R.string.web_dark_salmon, + R.color.web_dark_sea_green to R.string.web_dark_sea_green, + R.color.web_dark_slate_blue to R.string.web_dark_slate_blue, + R.color.web_dark_slate_gray to R.string.web_dark_slate_gray, + R.color.web_dark_turquoise to R.string.web_dark_turquoise, + R.color.web_dark_violet to R.string.web_dark_violet, + R.color.web_deep_pink to R.string.web_deep_pink, + R.color.web_deep_sky_blue to R.string.web_deep_sky_blue, + R.color.web_dim_gray to R.string.web_dim_gray, + R.color.web_dodger_blue to R.string.web_dodger_blue, + R.color.web_emerald to R.string.web_emerald, + R.color.web_fire_brick to R.string.web_fire_brick, + R.color.web_flamingo to R.string.web_flamingo, + R.color.web_floral_white to R.string.web_floral_white, + R.color.web_foliage_green to R.string.web_foliage_green, + R.color.web_forest_green to R.string.web_forest_green, + R.color.web_fresh_leaves to R.string.web_fresh_leaves, + R.color.web_fuchsia to R.string.web_fuchsia, + R.color.web_gainsboro to R.string.web_gainsboro, + R.color.web_ghost_white to R.string.web_ghost_white, + R.color.web_golden to R.string.web_golden, + R.color.web_goldenrod to R.string.web_goldenrod, + R.color.web_grass_green to R.string.web_grass_green, + R.color.web_gray to R.string.web_gray, + R.color.web_grayish_purple to R.string.web_grayish_purple, + R.color.web_green to R.string.web_green, + R.color.web_green_yellow to R.string.web_green_yellow, + R.color.web_heliotrope to R.string.web_heliotrope, + R.color.web_honeydew to R.string.web_honeydew, + R.color.web_honey_orange to R.string.web_honey_orange, + R.color.web_horizon_blue to R.string.web_horizon_blue, + R.color.web_hot_pink to R.string.web_hot_pink, + R.color.web_indian_red to R.string.web_indian_red, + R.color.web_indigo to R.string.web_indigo, + R.color.web_international_klein_blue to R.string.web_international_klein_blue, + R.color.web_iron_gray to R.string.web_iron_gray, + R.color.web_ivory to R.string.web_ivory, + R.color.web_ivy_green to R.string.web_ivy_green, + R.color.web_jasmine to R.string.web_jasmine, + R.color.web_khaki to R.string.web_khaki, + R.color.web_lapis_lazuli to R.string.web_lapis_lazuli, + R.color.web_lavender to R.string.web_lavender, + R.color.web_lavender_blue to R.string.web_lavender_blue, + R.color.web_lavender_blush to R.string.web_lavender_blush, + R.color.web_lavender_magenta to R.string.web_lavender_magenta, + R.color.web_lavender_mist to R.string.web_lavender_mist, + R.color.web_lawn_green to R.string.web_lawn_green, + R.color.web_lemon_chiffon to R.string.web_lemon_chiffon, + R.color.web_light_blue to R.string.web_light_blue, + R.color.web_light_coral to R.string.web_light_coral, + R.color.web_light_cyan to R.string.web_light_cyan, + R.color.web_light_goldenrod_yellow to R.string.web_light_goldenrod_yellow, + R.color.web_light_gray to R.string.web_light_gray, + R.color.web_light_green to R.string.web_light_green, + R.color.web_light_khaki to R.string.web_light_khaki, + R.color.web_light_pink to R.string.web_light_pink, + R.color.web_light_salmon to R.string.web_light_salmon, + R.color.web_light_sea_green to R.string.web_light_sea_green, + R.color.web_light_sky_blue to R.string.web_light_sky_blue, + R.color.web_light_slate_gray to R.string.web_light_slate_gray, + R.color.web_light_steel_blue to R.string.web_light_steel_blue, + R.color.web_light_violet to R.string.web_light_violet, + R.color.web_light_yellow to R.string.web_light_yellow, + R.color.web_lilac to R.string.web_lilac, + R.color.web_lime to R.string.web_lime, + R.color.web_lime_green to R.string.web_lime_green, + R.color.web_linen to R.string.web_linen, + R.color.web_magenta to R.string.web_magenta, + R.color.web_magenta_rose to R.string.web_magenta_rose, + R.color.web_malachite to R.string.web_malachite, + R.color.web_mallow to R.string.web_mallow, + R.color.web_marigold to R.string.web_marigold, + R.color.web_marine_blue to R.string.web_marine_blue, + R.color.web_maroon to R.string.web_maroon, + R.color.web_mauve to R.string.web_mauve, + R.color.web_medium_aquamarine to R.string.web_medium_aquamarine, + R.color.web_medium_blue to R.string.web_medium_blue, + R.color.web_medium_lavender_magenta to R.string.web_medium_lavender_magenta, + R.color.web_medium_orchid to R.string.web_medium_orchid, + R.color.web_medium_purple to R.string.web_medium_purple, + R.color.web_medium_sea_green to R.string.web_medium_sea_green, + R.color.web_medium_slate_blue to R.string.web_medium_slate_blue, + R.color.web_medium_spring_green to R.string.web_medium_spring_green, + R.color.web_medium_turquoise to R.string.web_medium_turquoise, + R.color.web_medium_violet_red to R.string.web_medium_violet_red, + R.color.web_midnight_blue to R.string.web_midnight_blue, + R.color.web_mimosa to R.string.web_mimosa, + R.color.web_mineral_blue to R.string.web_mineral_blue, + R.color.web_mineral_violet to R.string.web_mineral_violet, + R.color.web_mint to R.string.web_mint, + R.color.web_mint_cream to R.string.web_mint_cream, + R.color.web_misty_rose to R.string.web_misty_rose, + R.color.web_moccasin to R.string.web_moccasin, + R.color.web_moon_yellow to R.string.web_moon_yellow, + R.color.web_moss_green to R.string.web_moss_green, + R.color.web_mustard to R.string.web_mustard, + R.color.web_navajo_white to R.string.web_navajo_white, + R.color.web_navy to R.string.web_navy, + R.color.web_ocher to R.string.web_ocher, + R.color.web_old_lace to R.string.web_old_lace, + R.color.web_old_rose to R.string.web_old_rose, + R.color.web_olive to R.string.web_olive, + R.color.web_olive_drab to R.string.web_olive_drab, + R.color.web_opera_mauve to R.string.web_opera_mauve, + R.color.web_orange to R.string.web_orange, + R.color.web_orange_red to R.string.web_orange_red, + R.color.web_orchid to R.string.web_orchid, + R.color.web_pail_lilac to R.string.web_pail_lilac, + R.color.web_pale_blue to R.string.web_pale_blue, + R.color.web_pale_denim to R.string.web_pale_denim, + R.color.web_pale_goldenrod to R.string.web_pale_goldenrod, + R.color.web_pale_green to R.string.web_pale_green, + R.color.web_pale_ochre to R.string.web_pale_ochre, + R.color.web_pale_turquoise to R.string.web_pale_turquoise, + R.color.web_pale_violet_red to R.string.web_pale_violet_red, + R.color.web_pansy to R.string.web_pansy, + R.color.web_papaya_whip to R.string.web_papaya_whip, + R.color.web_patriarch to R.string.web_patriarch, + R.color.web_peach to R.string.web_peach, + R.color.web_peach_pearl to R.string.web_peach_pearl, + R.color.web_peach_puff to R.string.web_peach_puff, + R.color.web_peacock_blue to R.string.web_peacock_blue, + R.color.web_peacock_green to R.string.web_peacock_green, + R.color.web_pearl_pink to R.string.web_pearl_pink, + R.color.web_persimmon to R.string.web_persimmon, + R.color.web_peru to R.string.web_peru, + R.color.web_pink to R.string.web_pink, + R.color.web_plum to R.string.web_plum, + R.color.web_powder_blue to R.string.web_powder_blue, + R.color.web_prussian_blue to R.string.web_prussian_blue, + R.color.web_purple to R.string.web_purple, + R.color.web_red to R.string.web_red, + R.color.web_rose to R.string.web_rose, + R.color.web_rose_pink to R.string.web_rose_pink, + R.color.web_rosy_brown to R.string.web_rosy_brown, + R.color.web_royal_blue to R.string.web_royal_blue, + R.color.web_ruby to R.string.web_ruby, + R.color.web_saddle_brown to R.string.web_saddle_brown, + R.color.web_salmon to R.string.web_salmon, + R.color.web_salmon_pink to R.string.web_salmon_pink, + R.color.web_salvia_blue to R.string.web_salvia_blue, + R.color.web_sand_beige to R.string.web_sand_beige, + R.color.web_sand_brown to R.string.web_sand_brown, + R.color.web_sapphire to R.string.web_sapphire, + R.color.web_saxe_blue to R.string.web_saxe_blue, + R.color.web_scarlet to R.string.web_scarlet, + R.color.web_seashell to R.string.web_seashell, + R.color.web_sea_green to R.string.web_sea_green, + R.color.web_sepia to R.string.web_sepia, + R.color.web_shell_pink to R.string.web_shell_pink, + R.color.web_sienna to R.string.web_sienna, + R.color.web_silver to R.string.web_silver, + R.color.web_sky_blue to R.string.web_sky_blue, + R.color.web_slate_blue to R.string.web_slate_blue, + R.color.web_slate_gray to R.string.web_slate_gray, + R.color.web_snow to R.string.web_snow, + R.color.web_spinel_red to R.string.web_spinel_red, + R.color.web_spring_green to R.string.web_spring_green, + R.color.web_steel_blue to R.string.web_steel_blue, + R.color.web_strong_blue to R.string.web_strong_blue, + R.color.web_strong_red to R.string.web_strong_red, + R.color.web_sun_orange to R.string.web_sun_orange, + R.color.web_tan to R.string.web_tan, + R.color.web_tangerine to R.string.web_tangerine, + R.color.web_tangerine_yellow to R.string.web_tangerine_yellow, + R.color.web_teal to R.string.web_teal, + R.color.web_thistle to R.string.web_thistle, + R.color.web_tomato to R.string.web_tomato, + R.color.web_tropical_orange to R.string.web_tropical_orange, + R.color.web_turquoise to R.string.web_turquoise, + R.color.web_turquoise_blue to R.string.web_turquoise_blue, + R.color.web_turquoise_green to R.string.web_turquoise_green, + R.color.web_ultramarine to R.string.web_ultramarine, + R.color.web_vermilion to R.string.web_vermilion, + R.color.web_very_light_malachite_green to R.string.web_very_light_malachite_green, + R.color.web_violet to R.string.web_violet, + R.color.web_viridian to R.string.web_viridian, + R.color.web_wedgwood_blue to R.string.web_wedgwood_blue, + R.color.web_wheat to R.string.web_wheat, + R.color.web_white to R.string.web_white, + R.color.web_white_smoke to R.string.web_white_smoke, + R.color.web_wisteria to R.string.web_wisteria, + R.color.web_yellow to R.string.web_yellow, + R.color.web_yellow_green to R.string.web_yellow_green, + ) + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java index 44b2f6e6..c56c926b 100644 --- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java +++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java @@ -20,6 +20,7 @@ import androidx.core.graphics.drawable.DrawableCompat; import org.autojs.autojs.theme.internal.ScrollingViewEdgeGlowColorHelper; import org.autojs.autojs.util.ColorUtils; +import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs6.R; /** @@ -116,7 +117,7 @@ public class ThemeColorHelper { public static void setStatusBarColor(Activity activity, int color) { Window window = activity.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(color); + ViewUtils.setStatusBarBackgroundColor(activity, color); } public static void setBackgroundColor(View view, int color) { diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt index 6c3bc0f3..96f47b64 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectActivity.kt @@ -3,6 +3,12 @@ package org.autojs.autojs.theme.app import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View +import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.theme.ThemeChangeNotifier +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.util.StringUtils.key +import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R import org.autojs.autojs6.databinding.MtActivityColorSelectBinding @@ -13,6 +19,16 @@ class ColorSelectActivity : ColorSelectBaseActivity() { private lateinit var binding: MtActivityColorSelectBinding + private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerView + + private val mOnItemClickListener = object : OnItemClickListener { + override fun onItemClick(v: View?, position: Int) { + mColorSettingRecyclerView.selectedThemeColor?.let { + setColorWithAnimation(it.colorPrimary) + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MtActivityColorSelectBinding.inflate(layoutInflater).also { @@ -24,6 +40,23 @@ class ColorSelectActivity : ColorSelectBaseActivity() { } } + private fun setUpColorSettingRecyclerView(colorSettingRecyclerView: ColorSettingRecyclerView) { + mColorSettingRecyclerView = colorSettingRecyclerView.apply { + setSelectedColor(currentColor) + setOnItemClickListener(mOnItemClickListener) + ViewUtils.excludePaddingClippableViewFromNavigationBar(this) + } + } + + override fun finish() { + mColorSettingRecyclerView.selectedThemeColor?.let { + ThemeColorManager.setThemeColor(it.colorPrimary) + Pref.putString(key(R.string.key_theme_color), getCurrentColorSummary(this)) + ThemeChangeNotifier.notifyThemeChanged() + } + super.finish() + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_color_select, menu) return super.onCreateOptionsMenu(menu) @@ -31,18 +64,26 @@ class ColorSelectActivity : ColorSelectBaseActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { + R.id.action_color_palette -> { + ViewUtils.showToast(this, R.string.text_under_development_title) + } + R.id.action_search_color -> { + ViewUtils.showToast(this, R.string.text_under_development_title) + } + R.id.action_new_color_library -> { + ViewUtils.showToast(this, R.string.text_under_development_title) + } + R.id.action_locate_current_color -> { + ViewUtils.showToast(this, R.string.text_under_development_title) + } R.id.action_toggle_color_select_layout -> { isLegacyLayout = true startActivity(this) } - R.id.action_locate_current_color -> { - - } - R.id.action_search_color -> { - - } } return true } + override fun getSubtitle() = getCurrentColorSummary(this) + } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt index 88a8c40e..0897b505 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectBaseActivity.kt @@ -9,13 +9,12 @@ import android.view.ViewAnimationUtils import androidx.appcompat.widget.Toolbar import com.google.android.material.appbar.AppBarLayout import io.codetail.widget.RevealFrameLayout +import org.autojs.autojs.core.image.ColorItems import org.autojs.autojs.core.pref.Pref -import org.autojs.autojs.theme.ThemeChangeNotifier import org.autojs.autojs.theme.ThemeColor import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.util.ColorUtils -import org.autojs.autojs.util.StringUtils.key import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByColorLuminance import org.autojs.autojs.util.ViewUtils.setNavigationIconColorByColorLuminance @@ -36,59 +35,36 @@ abstract class ColorSelectBaseActivity : BaseActivity() { private lateinit var mToolbar: Toolbar private lateinit var mAppBarLayout: AppBarLayout private lateinit var mAppBarContainer: RevealFrameLayout - private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerView private lateinit var mTitle: String - private val mOnItemClickListener = object : OnItemClickListener { - override fun onItemClick(v: View?, position: Int) { - mColorSettingRecyclerView.selectedThemeColor?.let { - setColorWithAnimation(mAppBarLayout, it.colorPrimary) - } - } - } - - private var currentColor by Delegates.notNull() + protected var currentColor by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mTitle = this.intent.getStringExtra("title") ?: this.getString(R.string.mt_color_picker_title) - currentColor = this.intent.getIntExtra("currentColor", ThemeColorManager.colorPrimary) + mTitle = intent.getStringExtra("title") ?: getString(R.string.text_theme_color) + currentColor = intent.getIntExtra("currentColor", ThemeColorManager.colorPrimary) } protected fun setUpToolbar(toolbar: Toolbar) { toolbar.apply { title = mTitle + subtitle = this@ColorSelectBaseActivity.getSubtitle() setSupportActionBar(this) setNavigationOnClickListener { finish() } setTitleTextAppearance(this@ColorSelectBaseActivity, R.style.TextAppearanceMainTitle) + setSubtitleTextAppearance(this@ColorSelectBaseActivity, R.style.TextAppearanceMainSubtitle) mToolbar = this } supportActionBar?.setDisplayHomeAsUpEnabled(true) } - protected fun setUpColorSettingRecyclerView(colorSettingRecyclerView: ColorSettingRecyclerView) { - mColorSettingRecyclerView = colorSettingRecyclerView.apply { - setCustomColor() - setSelectedColor(currentColor) - setOnItemClickListener(mOnItemClickListener) - ViewUtils.excludePaddingClippableViewFromNavigationBar(this) - } - } - - override fun finish() { - mColorSettingRecyclerView.selectedThemeColor?.let { - ThemeColorManager.setThemeColor(it.colorPrimary) - Pref.putString(key(R.string.key_theme_color), getColorString(this)) - ThemeChangeNotifier.notifyThemeChanged() - } - super.finish() - } - protected fun finishWithoutSaving() { super.finish() } + protected open fun getSubtitle(): String? = null + override fun initThemeColors() { super.initThemeColors() mToolbar.setTitlesTextColorByColorLuminance(this, currentColor) @@ -105,20 +81,22 @@ abstract class ColorSelectBaseActivity : BaseActivity() { mToolbar.setMenuIconsColorByColorLuminance(this, currentColor) } - private fun setColorWithAnimation(view: View, colorTo: Int) { + protected fun setColorWithAnimation(colorTo: Int) { + val view = mAppBarLayout mAppBarContainer.setBackgroundColor(currentColor) view.setBackgroundColor(colorTo) currentColor = colorTo initThemeColors() updateToolbarIconsColor() + mToolbar.subtitle = getSubtitle() ViewAnimationUtils.createCircularReveal( /* view = */ view, /* centerX = */ view.left, /* centerY = */ view.bottom, /* startRadius = */ 0f, - /* endRadius = */ hypot(view.width.toDouble(), view.height.toDouble()).toFloat() + /* endRadius = */ hypot(view.width.toDouble(), view.height.toDouble()).toFloat(), ).apply { duration = 500L start() @@ -155,14 +133,26 @@ abstract class ColorSelectBaseActivity : BaseActivity() { get() = Pref.getBoolean(R.string.key_color_select_activity_legacy_layout, false) set(value) = Pref.putBoolean(R.string.key_color_select_activity_legacy_layout, value) + val colorItems by lazy { + mutableListOf>().apply { + add(customColorPosition, 0 to R.string.mt_custom) + add(defaultColorPosition, R.color.theme_color_default to R.string.theme_color_default) + addAll(ColorItems.MATERIAL_COLORS) + } + } + @JvmStatic fun startActivity(context: Context) { val cls = when (isLegacyLayout) { true -> ColorSelectLegacyActivity::class.java else -> ColorSelectActivity::class.java } + val titleRes = when (isLegacyLayout) { + true -> R.string.mt_color_picker_title + else -> R.string.text_theme_color + } val intent = Intent(context, cls).apply { - putExtra("title", context.getString(R.string.mt_color_picker_title)) + putExtra("title", context.getString(titleRes)) } if (context is ColorSelectBaseActivity) { intent.putExtra("currentColor", context.currentColor) @@ -171,19 +161,18 @@ abstract class ColorSelectBaseActivity : BaseActivity() { context.startActivity(intent) } - fun getColorString(context: Context): String { + @JvmStatic + fun getCurrentColorSummary(context: Context): String { val index = Pref.getInt(KEY_SELECTED_COLOR_INDEX, defaultColorPosition) - val colorItem = getColorItems(context)[index] - return "${colorItem.name} [${ColorUtils.toString(colorItem.themeColor.colorPrimary).uppercase()}]" - } - - internal fun getColorItems(context: Context): List = ArrayList>() - .apply { - add(customColorPosition, Pair(Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800)), R.string.mt_custom)) - add(defaultColorPosition, Pair(context.getColor(R.color.theme_color_default), R.string.theme_color_default)) - addAll(ColorUtils.MATERIAL_COLOR_ITEMS.map { pair -> Pair(context.getColor(pair.first), pair.second) }) + val colorItem = colorItems[index] + val (colorRes, nameRes) = colorItem + val name = context.getString(nameRes) + val colorInt = when (index) { + customColorPosition -> Pref.getInt(KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800)) + else -> context.getColor(colorRes) } - .map { (colorInt, nameRes) -> ColorItem(context.getString(nameRes), colorInt) } + return "$name [${ColorUtils.toString(colorInt).uppercase()}]" + } } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt index f2475e3e..69f0498e 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSelectLegacyActivity.kt @@ -3,6 +3,12 @@ package org.autojs.autojs.theme.app import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View +import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.theme.ThemeChangeNotifier +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.util.StringUtils.key +import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R import org.autojs.autojs6.databinding.MtActivityColorSelectLegacyBinding @@ -13,6 +19,16 @@ class ColorSelectLegacyActivity : ColorSelectBaseActivity() { private lateinit var binding: MtActivityColorSelectLegacyBinding + private lateinit var mColorSettingRecyclerView: ColorSettingRecyclerViewLegacy + + private val mOnItemClickListener = object : OnItemClickListener { + override fun onItemClick(v: View?, position: Int) { + mColorSettingRecyclerView.selectedThemeColor?.let { + setColorWithAnimation(it.colorPrimary) + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MtActivityColorSelectLegacyBinding.inflate(layoutInflater).also { @@ -24,6 +40,23 @@ class ColorSelectLegacyActivity : ColorSelectBaseActivity() { } } + private fun setUpColorSettingRecyclerView(colorSettingRecyclerView: ColorSettingRecyclerViewLegacy) { + mColorSettingRecyclerView = colorSettingRecyclerView.apply { + setSelectedColor(currentColor) + setOnItemClickListener(mOnItemClickListener) + ViewUtils.excludePaddingClippableViewFromNavigationBar(this) + } + } + + override fun finish() { + mColorSettingRecyclerView.selectedThemeColor?.let { + ThemeColorManager.setThemeColor(it.colorPrimary) + Pref.putString(key(R.string.key_theme_color), getCurrentColorSummary(this)) + ThemeChangeNotifier.notifyThemeChanged() + } + super.finish() + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_color_select_legacy, menu) return super.onCreateOptionsMenu(menu) diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt index 3fbadbac..65eac1fe 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerView.kt @@ -9,17 +9,15 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import androidx.annotation.ColorInt -import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.ThemeColorRecyclerView import com.jaredrummler.android.colorpicker.ColorPickerDialog -import com.jaredrummler.android.colorpicker.ColorPickerDialogListener import org.autojs.autojs.core.pref.Pref import org.autojs.autojs.theme.ThemeColor import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.customColorPosition import org.autojs.autojs.util.ColorUtils import org.autojs.autojs6.R @@ -36,19 +34,23 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { private var mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE val selectedThemeColor: ThemeColor? - get() = ColorSelectBaseActivity.getColorItems(context)[mSelectedPosition].themeColor.takeUnless { mSelectedPosition < 0 } + get() = when { + mSelectedPosition < 0 -> null + mSelectedPosition == customColorPosition -> customColor + else -> context.getColor(ColorSelectBaseActivity.colorItems[mSelectedPosition].first) + }?.let { ThemeColor(it) } private val customColor: Int get() = Pref.getInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800)) private val mActualOnItemClickListener = OnClickListener { v -> getChildViewHolder(v)?.let { holder -> - val pos = holder.bindingAdapterPosition - if (pos == ColorSelectBaseActivity.customColorPosition) { - showColorPicker(v) - } else { - setSelectedPosition(pos) - mOnItemClickListener?.onItemClick(v, pos) + when (val pos = holder.bindingAdapterPosition) { + customColorPosition -> showColorPicker(v) + else -> { + setSelectedPosition(pos) + mOnItemClickListener?.onItemClick(v, pos) + } } } } @@ -73,8 +75,12 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { } fun setSelectedColor(colorPrimary: Int) { - for ((i, colorItem) in ColorSelectBaseActivity.getColorItems(context).withIndex()) { - if (colorItem.themeColor.colorPrimary == colorPrimary) { + for ((i, colorItem) in ColorSelectBaseActivity.colorItems.withIndex()) { + val color = when (i) { + customColorPosition -> customColor + else -> context.getColor(colorItem.first) + } + if (color == colorPrimary) { setSelectedPosition(i) return } @@ -82,14 +88,6 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE } - private fun setCustomColor(color: Int) { - ColorSelectBaseActivity.getColorItems(context)[ColorSelectBaseActivity.customColorPosition].themeColor.colorPrimary = color - } - - fun setCustomColor() { - setCustomColor(customColor) - } - private fun showColorPicker(v: View) { ColorPickerDialog.newBuilder() .setAllowCustom(true) @@ -99,20 +97,13 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { .setDialogTitle(R.string.mt_color_picker_title) .setColor(customColor) .create() - .apply { - setColorPickerDialogListener(object : ColorPickerDialogListener { - override fun onColorSelected(dialogId: Int, @ColorInt color: Int) { - val c = color or -0x1000000 - Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, c) - setCustomColor(c) - setSelectedPosition(ColorSelectBaseActivity.customColorPosition) - mOnItemClickListener?.onItemClick(v, ColorSelectBaseActivity.customColorPosition) - } - - override fun onDialogDismissed(dialogId: Int) {} - }) + .setColorPickerDialogListener { _: Int, color: Int -> + val customColor = color or -0x1000000 + Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, customColor) + setSelectedPosition(customColorPosition) + mOnItemClickListener?.onItemClick(v, customColorPosition) } - .show((context as FragmentActivity).supportFragmentManager, "Tag") + .show((context as ColorSelectBaseActivity).supportFragmentManager, "ColorPickerTag") } fun setOnItemClickListener(onItemClickListener: ColorSelectBaseActivity.OnItemClickListener?) { @@ -126,16 +117,21 @@ class ColorSettingRecyclerView : ThemeColorRecyclerView { } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val item = ColorSelectBaseActivity.getColorItems(context)[position] + val colorItem = ColorSelectBaseActivity.colorItems[position] + val (colorRes, nameRes) = colorItem + val color = when (position) { + customColorPosition -> customColor + else -> context.getColor(colorRes) + } holder.apply { - setColor(item.themeColor.colorPrimary) - nameView.text = item.name + setColor(color) + nameView.text = context.getString(nameRes) nameView.setTextColor(context.getColor(R.color.color_selector_item_text)) setChecked(mSelectedPosition == position) } } - override fun getItemCount() = ColorSelectBaseActivity.getColorItems(context).size + override fun getItemCount() = ColorSelectBaseActivity.colorItems.size } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt new file mode 100644 index 00000000..a3562b19 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorSettingRecyclerViewLegacy.kt @@ -0,0 +1,174 @@ +package org.autojs.autojs.theme.app + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.ThemeColorRecyclerView +import com.jaredrummler.android.colorpicker.ColorPickerDialog +import com.jaredrummler.android.colorpicker.ColorPickerDialogListener +import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.app.ColorSelectBaseActivity.Companion.customColorPosition +import org.autojs.autojs.util.ColorUtils +import org.autojs.autojs6.R + +class ColorSettingRecyclerViewLegacy : ThemeColorRecyclerView { + + constructor(context: Context) : super(context) + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + + constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) + + private var mOnItemClickListener: ColorSelectBaseActivity.OnItemClickListener? = null + + private var mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE + + val selectedThemeColor: ThemeColor? + get() = when { + mSelectedPosition < 0 -> null + mSelectedPosition == customColorPosition -> customColor + else -> context.getColor(ColorSelectBaseActivity.colorItems[mSelectedPosition].first) + }?.let { ThemeColor(it) } + + private val customColor: Int + get() = Pref.getInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, context.getColor(R.color.md_blue_grey_800)) + + private val mActualOnItemClickListener = OnClickListener { v -> + getChildViewHolder(v)?.let { holder -> + when (val pos = holder.bindingAdapterPosition) { + customColorPosition -> showColorPicker(v) + else -> { + setSelectedPosition(pos) + mOnItemClickListener?.onItemClick(v, pos) + } + } + } + } + + init { + adapter = Adapter() + layoutManager = LinearLayoutManager(context) + addItemDecoration(DividerItemDecoration(context, VERTICAL)) + } + + @SuppressLint("NotifyDataSetChanged") + fun setSelectedPosition(currentPosition: Int) { + if (mSelectedPosition != ColorSelectBaseActivity.SELECT_NONE) { + adapter!!.notifyItemChanged(mSelectedPosition) + mSelectedPosition = currentPosition + adapter!!.notifyItemChanged(currentPosition) + } else { + mSelectedPosition = currentPosition + adapter!!.notifyDataSetChanged() + } + Pref.putInt(ColorSelectBaseActivity.KEY_SELECTED_COLOR_INDEX, mSelectedPosition) + } + + fun setSelectedColor(colorPrimary: Int) { + for ((i, colorItem) in ColorSelectBaseActivity.colorItems.withIndex()) { + val color = when (i) { + customColorPosition -> customColor + else -> context.getColor(colorItem.first) + } + if (color == colorPrimary) { + setSelectedPosition(i) + return + } + } + mSelectedPosition = ColorSelectBaseActivity.SELECT_NONE + } + + private fun showColorPicker(v: View) { + ColorPickerDialog.newBuilder() + .setAllowCustom(true) + .setAllowPresets(false) + .setDialogType(ColorPickerDialog.TYPE_CUSTOM) + .setShowAlphaSlider(false) + .setDialogTitle(R.string.mt_color_picker_title) + .setColor(customColor) + .create() + .apply { + setColorPickerDialogListener(object : ColorPickerDialogListener { + override fun onColorSelected(dialogId: Int, @ColorInt color: Int) { + val c = color or -0x1000000 + Pref.putInt(ColorSelectBaseActivity.KEY_CUSTOM_COLOR, c) + setSelectedPosition(customColorPosition) + mOnItemClickListener?.onItemClick(v, customColorPosition) + } + + override fun onDialogDismissed(dialogId: Int) {} + }) + } + .show((context as FragmentActivity).supportFragmentManager, "Tag") + } + + fun setOnItemClickListener(onItemClickListener: ColorSelectBaseActivity.OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + private inner class Adapter : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(context).inflate(R.layout.mt_color_setting_recycler_view_item, parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val colorItem = ColorSelectBaseActivity.colorItems[position] + val (colorRes, nameRes) = colorItem + val color = when (position) { + customColorPosition -> customColor + else -> context.getColor(colorRes) + } + holder.apply { + setColor(color) + nameView.text = context.getString(nameRes) + nameView.setTextColor(context.getColor(R.color.color_selector_item_text)) + setChecked(mSelectedPosition == position) + } + } + + override fun getItemCount() = ColorSelectBaseActivity.colorItems.size + + } + + private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + + var colorView: ImageView + var nameView: TextView + + init { + itemView.setOnClickListener(mActualOnItemClickListener) + colorView = itemView.findViewById(R.id.color) + nameView = itemView.findViewById(R.id.name) + } + + fun setChecked(checked: Boolean) { + if (checked) { + colorView.setImageResource(R.drawable.mt_ic_check_white_36dp) + val selectedThemeColorRes = selectedThemeColor?.colorPrimary?.let { + if (ColorUtils.isLuminanceLight(it)) R.color.day else R.color.night + } ?: R.color.night_day + colorView.imageTintList = ColorStateList.valueOf(context.getColor(selectedThemeColorRes)) + } else { + colorView.setImageDrawable(null) + } + } + + fun setColor(c: Int) = ThemeColorHelper.setBackgroundColor(colorView, c) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt index c35c1d93..f3eae77d 100644 --- a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorToolbar.kt @@ -2,7 +2,6 @@ package org.autojs.autojs.theme.widget import android.content.Context import android.util.AttributeSet -import android.view.ViewTreeObserver.OnGlobalLayoutListener import androidx.appcompat.widget.Toolbar import org.autojs.autojs.theme.ThemeColor import org.autojs.autojs.theme.ThemeColorManager.add @@ -10,6 +9,7 @@ import org.autojs.autojs.theme.ThemeColorManager.getDayOrNightColorByLuminance import org.autojs.autojs.theme.ThemeColorManager.isThemeColorLuminanceLight import org.autojs.autojs.theme.ThemeColorMutable import org.autojs.autojs.util.ViewUtils.applyColorFilterWith +import org.autojs.autojs.util.ViewUtils.onceGlobalLayout import org.autojs.autojs6.R /** @@ -37,7 +37,7 @@ open class ThemeColorToolbar : Toolbar, ThemeColorMutable { } override fun setThemeColor(color: ThemeColor) { - viewTreeObserver.addOnGlobalLayoutListener(OnGlobalLayoutListener { applyThemeColor(color) }) + onceGlobalLayout { applyThemeColor(color) } } private fun applyThemeColor(color: ThemeColor) { diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt index 52f11b11..e658cac8 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.ui.edit +import android.animation.ValueAnimator import android.annotation.SuppressLint import android.app.Activity import android.content.Context @@ -14,7 +15,6 @@ import android.util.TypedValue import android.view.ActionMode import android.view.Menu import android.view.MenuItem -import android.view.ViewTreeObserver import android.widget.TextView import androidx.appcompat.widget.Toolbar import com.afollestad.materialdialogs.MaterialDialog @@ -32,6 +32,7 @@ import org.autojs.autojs.theme.widget.ThemeColorToolbar import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.main.MainActivity import org.autojs.autojs.util.Observers +import org.autojs.autojs.util.ViewUtils.onceGlobalLayout import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance import org.autojs.autojs6.R import org.autojs.autojs6.databinding.ActivityEditBinding @@ -71,99 +72,6 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc setUpToolbar() } - // @Created by JetBrains AI Assistant on Mar 24, 2025. - private fun adjustTitleTextView(textView: TextView) { - textView.post { - // 可用宽度, 排除内边距 - val availableWidth = textView.width - textView.paddingLeft - textView.paddingRight - if (availableWidth <= 0) return@post - - val textStr = textView.text.toString() - val isNonAscii = textStr.any { it.code >= 0x80 } - val paint: TextPaint = textView.paint - val originTextSizePx = textView.textSize - val step = resources.getDimension(R.dimen.editor_title_text_size_step) - - /* ---------- 尝试一行显示 (单行) ---------- */ - - textView.isSingleLine = true - textView.maxLines = 1 - - var oneLineTextSizePx = originTextSizePx - val minOneLineSizePx = resources.getDimension(R.dimen.editor_title_min_text_size_single_line) - - // 测量一行文字宽度 - paint.textSize = oneLineTextSizePx - var measuredWidth = paint.measureText(textStr) - // 当文字宽度超出可用宽度并且字号还高于下限的时候逐步降低字号 - while (measuredWidth > availableWidth && oneLineTextSizePx > minOneLineSizePx) { - oneLineTextSizePx -= step - paint.textSize = oneLineTextSizePx - measuredWidth = paint.measureText(textStr) - } - - // 如果一行能够显示文字, 则直接应用修改 - if (measuredWidth <= availableWidth) { - textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, oneLineTextSizePx) - return@post - } - - /* ---------- 切换为两行显示 ---------- */ - - textView.isSingleLine = false - textView.maxLines = 2 - - // 重置字号 - var twoLineTextSize = when (isNonAscii) { - true -> resources.getDimension(R.dimen.editor_title_text_size_double_line_non_ascii) - else -> resources.getDimension(R.dimen.editor_title_text_size_double_line_ascii) - } - - val minTwoLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_double_line) - paint.textSize = twoLineTextSize - - // 检查两行显示是否足够: 利用 StaticLayout 测量文字显示效果 - fun createStaticLayout(textSize: Float): StaticLayout { - paint.textSize = textSize - return StaticLayout.Builder - .obtain(textStr, 0, textStr.length, paint, availableWidth) - .setAlignment(Layout.Alignment.ALIGN_NORMAL) - .setLineSpacing(0f, 1f) - .build() - } - - var layout = createStaticLayout(twoLineTextSize) - // 当行数超出了两行且字号尚未到达最低要求, 则逐步降低字号 - while (layout.lineCount > 2 && twoLineTextSize > minTwoLineSize) { - twoLineTextSize -= step - layout = createStaticLayout(twoLineTextSize) - } - if (layout.lineCount <= 2) { - textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, twoLineTextSize) - return@post - } - - /* ---------- 切换为三行显示 ---------- */ - - textView.maxLines = 3 - - var threeLineSize = when (isNonAscii) { - true -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_non_ascii) - else -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_ascii) - } - - val minThreeLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_triple_line) - - paint.textSize = threeLineSize - layout = createStaticLayout(threeLineSize) - while (layout.lineCount > 3 && threeLineSize > minThreeLineSize) { - threeLineSize -= step - layout = createStaticLayout(threeLineSize) - } - textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, threeLineSize) - } - } - private fun onLoadFileError(message: String?) { MaterialDialog.Builder(this) .title(getString(R.string.text_cannot_read_file)) @@ -182,19 +90,112 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc menuInflater.inflate(R.menu.menu_editor, menu) mToolbar?.let { toolbar -> toolbar.setMenuIconsColorByThemeColorLuminance(this) - toolbar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - val titleView = toolbar.findViewById(com.google.android.material.R.id.action_bar_title) ?: run { - Toolbar::class.java.getDeclaredField("mTitleTextView").apply { isAccessible = true }.get(toolbar) as TextView? - } - titleView?.let { adjustTitleTextView(it) } - toolbar.viewTreeObserver.removeOnGlobalLayoutListener(this) + toolbar.onceGlobalLayout { + val titleView = toolbar.findViewById(com.google.android.material.R.id.action_bar_title) ?: run { + Toolbar::class.java.getDeclaredField("mTitleTextView").apply { isAccessible = true }.get(toolbar) as TextView? } - }) + titleView?.adjustTitleTextView() + } } return true } + private fun TextView.adjustTitleTextView() = this.post { + ValueAnimator.ofFloat(this.textSize, calculatedTextSize(this) ?: return@post).let { + it.duration = 120L + it.addUpdateListener { this.setTextSize(TypedValue.COMPLEX_UNIT_PX, it.animatedValue as Float) } + it.start() + } + } + + // @Created by JetBrains AI Assistant on Mar 24, 2025. + private fun calculatedTextSize(textView: TextView): Float? { + // 可用宽度, 排除内边距 + val availableWidth = textView.width - textView.paddingLeft - textView.paddingRight + if (availableWidth <= 0) return null + + val textStr = textView.text.toString() + val isNonAscii = textStr.any { it.code >= 0x80 } + val paint: TextPaint = textView.paint + val step = resources.getDimension(R.dimen.editor_title_text_size_step) + + /* ---------- 尝试一行显示 (单行) ---------- */ + + textView.isSingleLine = true + textView.maxLines = 1 + + var oneLineTextSizePx = textView.textSize + val minOneLineSizePx = resources.getDimension(R.dimen.editor_title_min_text_size_single_line) + + // 测量一行文字宽度 + paint.textSize = oneLineTextSizePx + var measuredWidth = paint.measureText(textStr) + // 当文字宽度超出可用宽度并且字号还高于下限的时候逐步降低字号 + while (measuredWidth > availableWidth && oneLineTextSizePx > minOneLineSizePx) { + oneLineTextSizePx -= step + paint.textSize = oneLineTextSizePx + measuredWidth = paint.measureText(textStr) + } + + // 如果一行能够显示文字, 则直接应用修改 + if (measuredWidth <= availableWidth) { + return oneLineTextSizePx + } + + /* ---------- 切换为两行显示 ---------- */ + + textView.isSingleLine = false + textView.maxLines = 2 + + // 重置字号 + var twoLineTextSize = when (isNonAscii) { + true -> resources.getDimension(R.dimen.editor_title_text_size_double_line_non_ascii) + else -> resources.getDimension(R.dimen.editor_title_text_size_double_line_ascii) + } + + val minTwoLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_double_line) + paint.textSize = twoLineTextSize + + // 检查两行显示是否足够: 利用 StaticLayout 测量文字显示效果 + fun createStaticLayout(textSize: Float): StaticLayout { + paint.textSize = textSize + return StaticLayout.Builder + .obtain(textStr, 0, textStr.length, paint, availableWidth) + .setAlignment(Layout.Alignment.ALIGN_NORMAL) + .setLineSpacing(0f, 1f) + .build() + } + + var layout = createStaticLayout(twoLineTextSize) + // 当行数超出了两行且字号尚未到达最低要求, 则逐步降低字号 + while (layout.lineCount > 2 && twoLineTextSize > minTwoLineSize) { + twoLineTextSize -= step + layout = createStaticLayout(twoLineTextSize) + } + if (layout.lineCount <= 2) { + return twoLineTextSize + } + + /* ---------- 切换为三行显示 ---------- */ + + textView.maxLines = 3 + + var threeLineSize = when (isNonAscii) { + true -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_non_ascii) + else -> resources.getDimension(R.dimen.editor_title_text_size_triple_line_ascii) + } + + val minThreeLineSize = resources.getDimension(R.dimen.editor_title_min_text_size_triple_line) + + paint.textSize = threeLineSize + layout = createStaticLayout(threeLineSize) + while (layout.lineCount > 3 && threeLineSize > minThreeLineSize) { + threeLineSize -= step + layout = createStaticLayout(threeLineSize) + } + return threeLineSize + } + override fun onOptionsItemSelected(item: MenuItem): Boolean { return mEditorMenu.onOptionsItemSelected(item) } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt index 6c7092c7..8dde8bac 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerFragment.kt @@ -367,6 +367,7 @@ open class DrawerFragment : Fragment() { mThemeColorItem = DrawerMenuShortcutItem(R.drawable.ic_personalize, R.string.text_theme_color) .setAction(Runnable { ColorSelectBaseActivity.startActivity(mContext) }) + .apply { subtitle = ColorSelectBaseActivity.getCurrentColorSummary(mContext) } mAboutAppAndDevItem = DrawerMenuShortcutItem(R.drawable.ic_about, R.string.text_about_app_and_developer) .setAction(Runnable { AboutActivity.startActivity(mContext) }) diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt index 5c4747b4..48e9ac53 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt @@ -78,7 +78,6 @@ object MediaInfoDialogManager { launch(Dispatchers.IO) { mediaInfo(filePath, AUDIO, "BitRate/String").let { binding.bitRateForAudioValue.bindWith(it) } } - launch(Dispatchers.IO) { mediaInfo(filePath, VIDEO, "BitRate/String").let { binding.bitRateForVideoValue.bindWith(it) } } diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/ThemeColorPreference.kt b/app/src/main/java/org/autojs/autojs/ui/settings/ThemeColorPreference.kt index 8cb57934..e03995ae 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/ThemeColorPreference.kt +++ b/app/src/main/java/org/autojs/autojs/ui/settings/ThemeColorPreference.kt @@ -19,7 +19,7 @@ class ThemeColorPreference : MaterialPreference, SharedPreferences.OnSharedPrefe init { Pref.registerOnSharedPreferenceChangeListener(this) - summaryProvider = SummaryProvider { ColorSelectBaseActivity.getColorString(prefContext) } + summaryProvider = SummaryProvider { ColorSelectBaseActivity.getCurrentColorSummary(prefContext) } } override fun onClick() { diff --git a/app/src/main/java/org/autojs/autojs/ui/widget/AppWithStatusBarLayout.java b/app/src/main/java/org/autojs/autojs/ui/widget/AppWithStatusBarLayout.java index ddef5a0c..b382f5c1 100644 --- a/app/src/main/java/org/autojs/autojs/ui/widget/AppWithStatusBarLayout.java +++ b/app/src/main/java/org/autojs/autojs/ui/widget/AppWithStatusBarLayout.java @@ -7,12 +7,11 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.util.AttributeSet; import android.util.TypedValue; -import android.view.ViewTreeObserver; import android.view.Window; - import androidx.annotation.Nullable; - import com.google.android.material.appbar.AppBarLayout; +import kotlin.Unit; +import org.autojs.autojs.util.ViewUtils; /** * Created by Stardust on Aug 22, 2017. @@ -42,12 +41,9 @@ public class AppWithStatusBarLayout extends AppBarLayout { } private void setPadding() { - getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - setPadding(getPaddingLeft(), getStatusBarHeight(), getPaddingRight(), getPaddingBottom()); - getViewTreeObserver().removeOnGlobalLayoutListener(this); - } + ViewUtils.onceViewGlobalLayout(this, () -> { + setPadding(getPaddingLeft(), getStatusBarHeight(), getPaddingRight(), getPaddingBottom()); + return Unit.INSTANCE; }); } diff --git a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt index fd16048b..86f9b844 100644 --- a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt @@ -22,323 +22,6 @@ import kotlin.text.RegexOption.IGNORE_CASE @Suppress("FunctionName") object ColorUtils { - @JvmField - val MATERIAL_COLOR_ITEMS: List> = listOf( - - /* reds */ - - R.color.md_red_50 to R.string.md_red_50, - R.color.md_red_100 to R.string.md_red_100, - R.color.md_red_200 to R.string.md_red_200, - R.color.md_red_300 to R.string.md_red_300, - R.color.md_red_400 to R.string.md_red_400, - R.color.md_red_500 to R.string.md_red_500, - R.color.md_red_600 to R.string.md_red_600, - R.color.md_red_700 to R.string.md_red_700, - R.color.md_red_800 to R.string.md_red_800, - R.color.md_red_900 to R.string.md_red_900, - R.color.md_red_a100 to R.string.md_red_a100, - R.color.md_red_a200 to R.string.md_red_a200, - R.color.md_red_a400 to R.string.md_red_a400, - R.color.md_red_a700 to R.string.md_red_a700, - - /* pinks */ - - R.color.md_pink_50 to R.string.md_pink_50, - R.color.md_pink_100 to R.string.md_pink_100, - R.color.md_pink_200 to R.string.md_pink_200, - R.color.md_pink_300 to R.string.md_pink_300, - R.color.md_pink_400 to R.string.md_pink_400, - R.color.md_pink_500 to R.string.md_pink_500, - R.color.md_pink_600 to R.string.md_pink_600, - R.color.md_pink_700 to R.string.md_pink_700, - R.color.md_pink_800 to R.string.md_pink_800, - R.color.md_pink_900 to R.string.md_pink_900, - R.color.md_pink_a100 to R.string.md_pink_a100, - R.color.md_pink_a200 to R.string.md_pink_a200, - R.color.md_pink_a400 to R.string.md_pink_a400, - R.color.md_pink_a700 to R.string.md_pink_a700, - - /* purples */ - - R.color.md_purple_50 to R.string.md_purple_50, - R.color.md_purple_100 to R.string.md_purple_100, - R.color.md_purple_200 to R.string.md_purple_200, - R.color.md_purple_300 to R.string.md_purple_300, - R.color.md_purple_400 to R.string.md_purple_400, - R.color.md_purple_500 to R.string.md_purple_500, - R.color.md_purple_600 to R.string.md_purple_600, - R.color.md_purple_700 to R.string.md_purple_700, - R.color.md_purple_800 to R.string.md_purple_800, - R.color.md_purple_900 to R.string.md_purple_900, - R.color.md_purple_a100 to R.string.md_purple_a100, - R.color.md_purple_a200 to R.string.md_purple_a200, - R.color.md_purple_a400 to R.string.md_purple_a400, - R.color.md_purple_a700 to R.string.md_purple_a700, - - /* deep purples */ - - R.color.md_deep_purple_50 to R.string.md_deep_purple_50, - R.color.md_deep_purple_100 to R.string.md_deep_purple_100, - R.color.md_deep_purple_200 to R.string.md_deep_purple_200, - R.color.md_deep_purple_300 to R.string.md_deep_purple_300, - R.color.md_deep_purple_400 to R.string.md_deep_purple_400, - R.color.md_deep_purple_500 to R.string.md_deep_purple_500, - R.color.md_deep_purple_600 to R.string.md_deep_purple_600, - R.color.md_deep_purple_700 to R.string.md_deep_purple_700, - R.color.md_deep_purple_800 to R.string.md_deep_purple_800, - R.color.md_deep_purple_900 to R.string.md_deep_purple_900, - R.color.md_deep_purple_a100 to R.string.md_deep_purple_a100, - R.color.md_deep_purple_a200 to R.string.md_deep_purple_a200, - R.color.md_deep_purple_a400 to R.string.md_deep_purple_a400, - R.color.md_deep_purple_a700 to R.string.md_deep_purple_a700, - - /* indigo */ - - R.color.md_indigo_50 to R.string.md_indigo_50, - R.color.md_indigo_100 to R.string.md_indigo_100, - R.color.md_indigo_200 to R.string.md_indigo_200, - R.color.md_indigo_300 to R.string.md_indigo_300, - R.color.md_indigo_400 to R.string.md_indigo_400, - R.color.md_indigo_500 to R.string.md_indigo_500, - R.color.md_indigo_600 to R.string.md_indigo_600, - R.color.md_indigo_700 to R.string.md_indigo_700, - R.color.md_indigo_800 to R.string.md_indigo_800, - R.color.md_indigo_900 to R.string.md_indigo_900, - R.color.md_indigo_a100 to R.string.md_indigo_a100, - R.color.md_indigo_a200 to R.string.md_indigo_a200, - R.color.md_indigo_a400 to R.string.md_indigo_a400, - R.color.md_indigo_a700 to R.string.md_indigo_a700, - - /* blue */ - - R.color.md_blue_50 to R.string.md_blue_50, - R.color.md_blue_100 to R.string.md_blue_100, - R.color.md_blue_200 to R.string.md_blue_200, - R.color.md_blue_300 to R.string.md_blue_300, - R.color.md_blue_400 to R.string.md_blue_400, - R.color.md_blue_500 to R.string.md_blue_500, - R.color.md_blue_600 to R.string.md_blue_600, - R.color.md_blue_700 to R.string.md_blue_700, - R.color.md_blue_800 to R.string.md_blue_800, - R.color.md_blue_900 to R.string.md_blue_900, - R.color.md_blue_a100 to R.string.md_blue_a100, - R.color.md_blue_a200 to R.string.md_blue_a200, - R.color.md_blue_a400 to R.string.md_blue_a400, - R.color.md_blue_a700 to R.string.md_blue_a700, - - /* light blue */ - - R.color.md_light_blue_50 to R.string.md_light_blue_50, - R.color.md_light_blue_100 to R.string.md_light_blue_100, - R.color.md_light_blue_200 to R.string.md_light_blue_200, - R.color.md_light_blue_300 to R.string.md_light_blue_300, - R.color.md_light_blue_400 to R.string.md_light_blue_400, - R.color.md_light_blue_500 to R.string.md_light_blue_500, - R.color.md_light_blue_600 to R.string.md_light_blue_600, - R.color.md_light_blue_700 to R.string.md_light_blue_700, - R.color.md_light_blue_800 to R.string.md_light_blue_800, - R.color.md_light_blue_900 to R.string.md_light_blue_900, - R.color.md_light_blue_a100 to R.string.md_light_blue_a100, - R.color.md_light_blue_a200 to R.string.md_light_blue_a200, - R.color.md_light_blue_a400 to R.string.md_light_blue_a400, - R.color.md_light_blue_a700 to R.string.md_light_blue_a700, - - /* cyan */ - - R.color.md_cyan_50 to R.string.md_cyan_50, - R.color.md_cyan_100 to R.string.md_cyan_100, - R.color.md_cyan_200 to R.string.md_cyan_200, - R.color.md_cyan_300 to R.string.md_cyan_300, - R.color.md_cyan_400 to R.string.md_cyan_400, - R.color.md_cyan_500 to R.string.md_cyan_500, - R.color.md_cyan_600 to R.string.md_cyan_600, - R.color.md_cyan_700 to R.string.md_cyan_700, - R.color.md_cyan_800 to R.string.md_cyan_800, - R.color.md_cyan_900 to R.string.md_cyan_900, - R.color.md_cyan_a100 to R.string.md_cyan_a100, - R.color.md_cyan_a200 to R.string.md_cyan_a200, - R.color.md_cyan_a400 to R.string.md_cyan_a400, - R.color.md_cyan_a700 to R.string.md_cyan_a700, - - /* teal */ - - R.color.md_teal_50 to R.string.md_teal_50, - R.color.md_teal_100 to R.string.md_teal_100, - R.color.md_teal_200 to R.string.md_teal_200, - R.color.md_teal_300 to R.string.md_teal_300, - R.color.md_teal_400 to R.string.md_teal_400, - R.color.md_teal_500 to R.string.md_teal_500, - R.color.md_teal_600 to R.string.md_teal_600, - R.color.md_teal_700 to R.string.md_teal_700, - R.color.md_teal_800 to R.string.md_teal_800, - R.color.md_teal_900 to R.string.md_teal_900, - R.color.md_teal_a100 to R.string.md_teal_a100, - R.color.md_teal_a200 to R.string.md_teal_a200, - R.color.md_teal_a400 to R.string.md_teal_a400, - R.color.md_teal_a700 to R.string.md_teal_a700, - - /* green */ - - R.color.md_green_50 to R.string.md_green_50, - R.color.md_green_100 to R.string.md_green_100, - R.color.md_green_200 to R.string.md_green_200, - R.color.md_green_300 to R.string.md_green_300, - R.color.md_green_400 to R.string.md_green_400, - R.color.md_green_500 to R.string.md_green_500, - R.color.md_green_600 to R.string.md_green_600, - R.color.md_green_700 to R.string.md_green_700, - R.color.md_green_800 to R.string.md_green_800, - R.color.md_green_900 to R.string.md_green_900, - R.color.md_green_a100 to R.string.md_green_a100, - R.color.md_green_a200 to R.string.md_green_a200, - R.color.md_green_a400 to R.string.md_green_a400, - R.color.md_green_a700 to R.string.md_green_a700, - - /* light green */ - - R.color.md_light_green_50 to R.string.md_light_green_50, - R.color.md_light_green_100 to R.string.md_light_green_100, - R.color.md_light_green_200 to R.string.md_light_green_200, - R.color.md_light_green_300 to R.string.md_light_green_300, - R.color.md_light_green_400 to R.string.md_light_green_400, - R.color.md_light_green_500 to R.string.md_light_green_500, - R.color.md_light_green_600 to R.string.md_light_green_600, - R.color.md_light_green_700 to R.string.md_light_green_700, - R.color.md_light_green_800 to R.string.md_light_green_800, - R.color.md_light_green_900 to R.string.md_light_green_900, - R.color.md_light_green_a100 to R.string.md_light_green_a100, - R.color.md_light_green_a200 to R.string.md_light_green_a200, - R.color.md_light_green_a400 to R.string.md_light_green_a400, - R.color.md_light_green_a700 to R.string.md_light_green_a700, - - /* lime */ - - R.color.md_lime_50 to R.string.md_lime_50, - R.color.md_lime_100 to R.string.md_lime_100, - R.color.md_lime_200 to R.string.md_lime_200, - R.color.md_lime_300 to R.string.md_lime_300, - R.color.md_lime_400 to R.string.md_lime_400, - R.color.md_lime_500 to R.string.md_lime_500, - R.color.md_lime_600 to R.string.md_lime_600, - R.color.md_lime_700 to R.string.md_lime_700, - R.color.md_lime_800 to R.string.md_lime_800, - R.color.md_lime_900 to R.string.md_lime_900, - R.color.md_lime_a100 to R.string.md_lime_a100, - R.color.md_lime_a200 to R.string.md_lime_a200, - R.color.md_lime_a400 to R.string.md_lime_a400, - R.color.md_lime_a700 to R.string.md_lime_a700, - - /* yellow */ - - R.color.md_yellow_50 to R.string.md_yellow_50, - R.color.md_yellow_100 to R.string.md_yellow_100, - R.color.md_yellow_200 to R.string.md_yellow_200, - R.color.md_yellow_300 to R.string.md_yellow_300, - R.color.md_yellow_400 to R.string.md_yellow_400, - R.color.md_yellow_500 to R.string.md_yellow_500, - R.color.md_yellow_600 to R.string.md_yellow_600, - R.color.md_yellow_700 to R.string.md_yellow_700, - R.color.md_yellow_800 to R.string.md_yellow_800, - R.color.md_yellow_900 to R.string.md_yellow_900, - R.color.md_yellow_a100 to R.string.md_yellow_a100, - R.color.md_yellow_a200 to R.string.md_yellow_a200, - R.color.md_yellow_a400 to R.string.md_yellow_a400, - R.color.md_yellow_a700 to R.string.md_yellow_a700, - - /* amber */ - - R.color.md_amber_50 to R.string.md_amber_50, - R.color.md_amber_100 to R.string.md_amber_100, - R.color.md_amber_200 to R.string.md_amber_200, - R.color.md_amber_300 to R.string.md_amber_300, - R.color.md_amber_400 to R.string.md_amber_400, - R.color.md_amber_500 to R.string.md_amber_500, - R.color.md_amber_600 to R.string.md_amber_600, - R.color.md_amber_700 to R.string.md_amber_700, - R.color.md_amber_800 to R.string.md_amber_800, - R.color.md_amber_900 to R.string.md_amber_900, - R.color.md_amber_a100 to R.string.md_amber_a100, - R.color.md_amber_a200 to R.string.md_amber_a200, - R.color.md_amber_a400 to R.string.md_amber_a400, - R.color.md_amber_a700 to R.string.md_amber_a700, - - /* orange */ - - R.color.md_orange_50 to R.string.md_orange_50, - R.color.md_orange_100 to R.string.md_orange_100, - R.color.md_orange_200 to R.string.md_orange_200, - R.color.md_orange_300 to R.string.md_orange_300, - R.color.md_orange_400 to R.string.md_orange_400, - R.color.md_orange_500 to R.string.md_orange_500, - R.color.md_orange_600 to R.string.md_orange_600, - R.color.md_orange_700 to R.string.md_orange_700, - R.color.md_orange_800 to R.string.md_orange_800, - R.color.md_orange_900 to R.string.md_orange_900, - R.color.md_orange_a100 to R.string.md_orange_a100, - R.color.md_orange_a200 to R.string.md_orange_a200, - R.color.md_orange_a400 to R.string.md_orange_a400, - R.color.md_orange_a700 to R.string.md_orange_a700, - - /* deep orange */ - - R.color.md_deep_orange_50 to R.string.md_deep_orange_50, - R.color.md_deep_orange_100 to R.string.md_deep_orange_100, - R.color.md_deep_orange_200 to R.string.md_deep_orange_200, - R.color.md_deep_orange_300 to R.string.md_deep_orange_300, - R.color.md_deep_orange_400 to R.string.md_deep_orange_400, - R.color.md_deep_orange_500 to R.string.md_deep_orange_500, - R.color.md_deep_orange_600 to R.string.md_deep_orange_600, - R.color.md_deep_orange_700 to R.string.md_deep_orange_700, - R.color.md_deep_orange_800 to R.string.md_deep_orange_800, - R.color.md_deep_orange_900 to R.string.md_deep_orange_900, - R.color.md_deep_orange_a100 to R.string.md_deep_orange_a100, - R.color.md_deep_orange_a200 to R.string.md_deep_orange_a200, - R.color.md_deep_orange_a400 to R.string.md_deep_orange_a400, - R.color.md_deep_orange_a700 to R.string.md_deep_orange_a700, - - /* brown */ - - R.color.md_brown_50 to R.string.md_brown_50, - R.color.md_brown_100 to R.string.md_brown_100, - R.color.md_brown_200 to R.string.md_brown_200, - R.color.md_brown_300 to R.string.md_brown_300, - R.color.md_brown_400 to R.string.md_brown_400, - R.color.md_brown_500 to R.string.md_brown_500, - R.color.md_brown_600 to R.string.md_brown_600, - R.color.md_brown_700 to R.string.md_brown_700, - R.color.md_brown_800 to R.string.md_brown_800, - R.color.md_brown_900 to R.string.md_brown_900, - - /* grey */ - - R.color.md_grey_50 to R.string.md_grey_50, - R.color.md_grey_100 to R.string.md_grey_100, - R.color.md_grey_200 to R.string.md_grey_200, - R.color.md_grey_300 to R.string.md_grey_300, - R.color.md_grey_400 to R.string.md_grey_400, - R.color.md_grey_500 to R.string.md_grey_500, - R.color.md_grey_600 to R.string.md_grey_600, - R.color.md_grey_700 to R.string.md_grey_700, - R.color.md_grey_800 to R.string.md_grey_800, - R.color.md_grey_900 to R.string.md_grey_900, - R.color.md_black_1000 to R.string.md_black_1000, - R.color.md_white_1000 to R.string.md_white_1000, - - /* blue grey */ - - R.color.md_blue_grey_50 to R.string.md_blue_grey_50, - R.color.md_blue_grey_100 to R.string.md_blue_grey_100, - R.color.md_blue_grey_200 to R.string.md_blue_grey_200, - R.color.md_blue_grey_300 to R.string.md_blue_grey_300, - R.color.md_blue_grey_400 to R.string.md_blue_grey_400, - R.color.md_blue_grey_500 to R.string.md_blue_grey_500, - R.color.md_blue_grey_600 to R.string.md_blue_grey_600, - R.color.md_blue_grey_700 to R.string.md_blue_grey_700, - R.color.md_blue_grey_800 to R.string.md_blue_grey_800, - R.color.md_blue_grey_900 to R.string.md_blue_grey_900, - ) - @JvmStatic fun toString(color: Int): String { diff --git a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt index ccb0384e..c1a167db 100644 --- a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt @@ -22,6 +22,7 @@ import android.util.TypedValue import android.view.Gravity import android.view.View import android.view.ViewGroup +import android.view.ViewTreeObserver import android.view.Window import android.view.WindowInsets import android.view.WindowManager @@ -194,6 +195,7 @@ object ViewUtils { setStatusBarAppearanceLight(activity, shouldBeLight) } + @JvmStatic fun setStatusBarBackgroundColor(activity: Activity, color: Int) { val window = activity.window val decorView = window.decorView @@ -408,6 +410,44 @@ object ViewUtils { this.navigationIcon?.let { this.navigationIcon = it.applyColorFilterWith(color) } } + @JvmStatic + fun onceViewGlobalLayout(view: View, listener: () -> Unit) { + view.onceGlobalLayout(listener) + } + + fun View.onceGlobalLayout(listener: () -> Unit) { + val view = this + val viewTreeObserver = view.viewTreeObserver + if (viewTreeObserver.isAlive) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + listener.invoke() + val viewTreeObserver = view.viewTreeObserver + if (viewTreeObserver.isAlive) { + viewTreeObserver.removeOnGlobalLayoutListener(this) + } + } + }) + } + } + + @JvmStatic + fun onViewGlobalLayout(view: View, listener: () -> Unit) { + view.onGlobalLayout(listener) + } + + fun View.onGlobalLayout(listener: () -> Unit) { + val view = this + val viewTreeObserver = view.viewTreeObserver + if (viewTreeObserver.isAlive) { + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + listener.invoke() + } + }) + } + } + fun Drawable.applyColorFilterWith(color: Int): Drawable { return this.applyColorFilterWith(PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)) } diff --git a/app/src/main/res/drawable/ic_color_palette_vector.xml b/app/src/main/res/drawable/ic_color_palette_vector.xml new file mode 100644 index 00000000..a073bc4c --- /dev/null +++ b/app/src/main/res/drawable/ic_color_palette_vector.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/mt_activity_color_select_legacy.xml b/app/src/main/res/layout/mt_activity_color_select_legacy.xml index 24c77906..d50ec451 100644 --- a/app/src/main/res/layout/mt_activity_color_select_legacy.xml +++ b/app/src/main/res/layout/mt_activity_color_select_legacy.xml @@ -34,7 +34,7 @@ diff --git a/app/src/main/res/menu/menu_color_select.xml b/app/src/main/res/menu/menu_color_select.xml index cbb7a05a..a57de813 100644 --- a/app/src/main/res/menu/menu_color_select.xml +++ b/app/src/main/res/menu/menu_color_select.xml @@ -4,17 +4,29 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-en/android_colors_string.xml b/app/src/main/res/values-en/android_colors_string.xml new file mode 100644 index 00000000..eab1f650 --- /dev/null +++ b/app/src/main/res/values-en/android_colors_string.xml @@ -0,0 +1,28 @@ + + + + Black + Blue + Cyan + Aqua + Dark gray + Dark grey + Gray + Grey + Green + Lime + Light gray + Light grey + Magenta + Fuchsia + Maroon + Navy + Olive + Purple + Red + Silver + Teal + White + Yellow + + \ No newline at end of file diff --git a/app/src/main/res/values-en/css_colors_string.xml b/app/src/main/res/values-en/css_colors_string.xml new file mode 100644 index 00000000..3a5ad1c4 --- /dev/null +++ b/app/src/main/res/values-en/css_colors_string.xml @@ -0,0 +1,153 @@ + + + + Alice blue + Antique white + Aquamarine + Azure + Beige + Bisque + Black + Blanched almond + Blue + Blue violet + Brown + Burly wood + Cadet blue + Chartreuse + Chocolate + Coral + Cornflower blue + Corn silk + Crimson + Cyan + Aqua + Dark blue + Dark cyan + Dark goldenrod + Dark gray + Dark grey + Dark green + Dark khaki + Dark magenta + Dark olive green + Dark orange + Dark orchid + Dark red + Dark salmon + Dark sea green + Dark slate blue + Dark slate gray + Dark slate grey + Dark turquoise + Dark violet + Deep pink + Deep sky blue + Dim gray + Dim grey + Dodger blue + Fire brick + Floral white + Forest green + Gainsboro + Ghost white + Gold + Goldenrod + Gray + Grey + Green + Green yellow + Honeydew + Hot pink + Indian red + Indigo + Ivory + Khaki + Lavender + Lavender blush + Lawn green + Lemon chiffon + Light blue + Light coral + Light cyan + Light goldenrod yellow + Light gray + Light grey + Light green + Light pink + Light salmon + Light sea green + Light sky blue + Light slate gray + Light slate grey + Light steel blue + Light yellow + Lime + Lime green + Linen + Magenta + Fuchsia + Maroon + Medium aquamarine + Medium blue + Medium lavender magenta + Medium orchid + Medium purple + Medium sea green + Medium slate blue + Medium spring green + Medium turquoise + Medium violet red + Midnight blue + Mint cream + Misty rose + Moccasin + Navajo white + Navy + Old lace + Olive + Olive drab + Orange + Orange red + Orchid + Pale goldenrod + Pale green + Pale turquoise + Pale violet red + Papaya whip + Patriarch + Peach puff + Peru + Pink + Powder blue + Rebecca purple + Red + Rosy brown + Royal blue + Saddle brown + Salmon + Sand brown + Seashell + Sea green + Sienna + Silver + Sky blue + Slate blue + Slate gray + Slate grey + Snow + Spring green + Steel blue + Tan + Teal + Thistle + Tomato + Turquoise + Violet + Wheat + White + White smoke + Yellow + Yellow green + + \ No newline at end of file diff --git a/app/src/main/res/values-en/android_material_design_colors_string.xml b/app/src/main/res/values-en/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-en/android_material_design_colors_string.xml rename to app/src/main/res/values-en/material_design_colors_string.xml diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 5590dd49..22cd61cf 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -900,5 +900,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-en/web_colors_string.xml b/app/src/main/res/values-en/web_colors_string.xml new file mode 100644 index 00000000..bf0689ad --- /dev/null +++ b/app/src/main/res/values-en/web_colors_string.xml @@ -0,0 +1,253 @@ + + + + Alice blue + Alizarin crimson + Amber + Amethyst + Antique white + Apple green + Apricot + Aqua + Aquamarine + Aqua blue + Azure + Baby blue + Baby pink + Beige + Bisque + Black + Blanched almond + Blue + Blue violet + Bright green + Bronze + Brown + Burgundy + Burly wood + Burnt orange + Cadet blue + Camel + Camellia + Canary yellow + Cardinal red + Carmine + Celadon + Cerise + Cerulean blue + Champagne yellow + Chartreuse + Chocolate + Chrome yellow + Clematis + Cobalt blue + Cobalt green + Coconut brown + Coffee + Coral + Coral pink + Cornflower blue + Corn silk + Cream + Crimson + Cyan + Cyan blue + Dark blue + Dark cyan + Dark goldenrod + Dark gray + Dark green + Dark khaki + Dark magenta + Dark mineral blue + Dark olive green + Dark orange + Dark orchid + Dark powder blue + Dark red + Dark salmon + Dark sea green + Dark slate blue + Dark slate gray + Dark turquoise + Dark violet + Deep pink + Deep sky blue + Dim gray + Dodger blue + Emerald + Fire brick + Flamingo + Floral white + Foliage green + Forest green + Fresh leaves + Fuchsia + Gainsboro + Ghost white + Golden + Goldenrod + Grass green + Gray + Grayish purple + Green + Green yellow + Heliotrope + Honeydew + Honey orange + Horizon blue + Hot pink + Indian red + Indigo + International klein blue + Iron gray + Ivory + Ivy green + Jasmine + Khaki + Lapis lazuli + Lavender + Lavender blue + Lavender blush + Lavender magenta + Lavender mist + Lawn green + Lemon chiffon + Light blue + Light coral + Light cyan + Light goldenrod yellow + Light gray + Light green + Light khaki + Light pink + Light salmon + Light sea green + Light sky blue + Light slate gray + Light steel blue + Light violet + Light yellow + Lilac + Lime + Lime green + Linen + Magenta + Magenta rose + Malachite + Mallow + Marigold + Marine blue + Maroon + Mauve + Medium aquamarine + Medium blue + Medium lavender magenta + Medium orchid + Medium purple + Medium sea green + Medium slate blue + Medium spring green + Medium turquoise + Medium violet red + Midnight blue + Mimosa + Mineral blue + Mineral violet + Mint + Mint cream + Misty rose + Moccasin + Moon yellow + Moss green + Mustard + Navajo white + Navy + Ocher + Old lace + Old rose + Olive + Olive drab + Opera mauve + Orange + Orange red + Orchid + Pail lilac + Pale blue + Pale denim + Pale goldenrod + Pale green + Pale ochre + Pale turquoise + Pale violet red + Pansy + Papaya whip + Patriarch + Peach + Peach pearl + Peach puff + Peacock blue + Peacock green + Pearl pink + Persimmon + Peru + Pink + Plum + Powder blue + Prussian blue + Purple + Red + Rose + Rose pink + Rosy brown + Royal blue + Ruby + Saddle brown + Salmon + Salmon pink + Salvia blue + Sand beige + Sand brown + Sapphire + Saxe blue + Scarlet + Seashell + Sea green + Sepia + Shell pink + Sienna + Silver + Sky blue + Slate blue + Slate gray + Snow + Spinel red + Spring green + Steel blue + Strong blue + Strong red + Sun orange + Tan + Tangerine + Tangerine yellow + Teal + Thistle + Tomato + Tropical orange + Turquoise + Turquoise blue + Turquoise green + Ultramarine + Vermilion + Very light malachite green + Violet + Viridian + Wedgwood blue + Wheat + White + White smoke + Wisteria + Yellow + Yellow green + + \ No newline at end of file diff --git a/app/src/main/res/values-es/android_material_design_colors_string.xml b/app/src/main/res/values-es/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-es/android_material_design_colors_string.xml rename to app/src/main/res/values-es/material_design_colors_string.xml diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 23d85fd1..0c2055d5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -903,5 +903,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-fr/android_material_design_colors_string.xml b/app/src/main/res/values-fr/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-fr/android_material_design_colors_string.xml rename to app/src/main/res/values-fr/material_design_colors_string.xml diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 273b6459..10da6968 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -903,5 +903,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-ja/android_material_design_colors_string.xml b/app/src/main/res/values-ja/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-ja/android_material_design_colors_string.xml rename to app/src/main/res/values-ja/material_design_colors_string.xml diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 6a37836b..e25fd111 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -903,5 +903,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-ko/android_material_design_colors_string.xml b/app/src/main/res/values-ko/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-ko/android_material_design_colors_string.xml rename to app/src/main/res/values-ko/material_design_colors_string.xml diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index dc3df64f..412c5e9d 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -904,5 +904,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-ru/android_material_design_colors_string.xml b/app/src/main/res/values-ru/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-ru/android_material_design_colors_string.xml rename to app/src/main/res/values-ru/material_design_colors_string.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 163c92eb..85cfdc7b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -903,5 +903,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-zh-rHK/android_material_design_colors_string.xml b/app/src/main/res/values-zh-rHK/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-zh-rHK/android_material_design_colors_string.xml rename to app/src/main/res/values-zh-rHK/material_design_colors_string.xml diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index dc6d7a6d..623625e8 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -902,5 +902,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-zh-rTW/android_material_design_colors_string.xml b/app/src/main/res/values-zh-rTW/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-zh-rTW/android_material_design_colors_string.xml rename to app/src/main/res/values-zh-rTW/material_design_colors_string.xml diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 07608ba5..6520e3f9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -902,5 +902,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values-zh/android_colors_string.xml b/app/src/main/res/values-zh/android_colors_string.xml new file mode 100644 index 00000000..deccc9c9 --- /dev/null +++ b/app/src/main/res/values-zh/android_colors_string.xml @@ -0,0 +1,28 @@ + + + + + + + + 暗灰 + 暗灰 + + + 绿 + 绿 + 亮灰 + 亮灰 + 品红 / 洋红 + 品红 / 洋红 + + 海军蓝 / 藏青 + 橄榄 + + + + 鸭绿 / 凫绿 + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/css_colors_string.xml b/app/src/main/res/values-zh/css_colors_string.xml new file mode 100644 index 00000000..1bad55d2 --- /dev/null +++ b/app/src/main/res/values-zh/css_colors_string.xml @@ -0,0 +1,153 @@ + + + + 爱丽丝蓝 + 古董白 + 蓝绿 / 碧蓝 + 湛蓝 + 米黄 + 陶坯黄 + + 杏仁白 + + 蓝紫 + + 硬木 + 军服蓝 + 查特酒绿 + 巧克力 + 珊瑚红 + 矢车菊蓝 + 玉米丝 + 绯红 + + + 暗蓝 + 暗青 + 暗金菊 + 暗灰 + 暗灰 + 暗绿 + 暗卡其 + 暗洋红 + 暗橄榄绿 + 暗橙 + 暗兰紫 + 暗红 + 暗鲑红 + 暗海绿 + 暗岩蓝 + 暗岩灰 + 暗岩灰 + 暗绿松石 + 暗紫 + 深粉红 + 深天蓝 + 昏灰 + 昏灰 + 道奇蓝 + 砖红 + 花卉白 + 森林绿 + 庚斯博罗灰 + 幽灵白 + + 金菊 + + + 绿 + 绿黄 + 蜜瓜绿 + 暖粉红 + 印度红 + + 象牙 + 卡其 + 薰衣草 + 薰衣草紫红 + 草坪绿 + 柠檬绸 + 亮蓝 + 亮珊瑚 + 亮青 + 亮金菊黄 + 亮灰 + 亮灰 + 亮绿 + 亮粉红 + 亮鲑红 + 亮海绿 + 浅天蓝 + 亮岩灰 + 亮岩灰 + 亮钢蓝 + 亮黄 + 鲜绿 / 莱姆 + 柠檬绿 + 亚麻 + 洋红 / 品红 + 洋红 / 品红 + + 中碧蓝 + 中蓝 + 梅红 + 中兰紫 + 中紫 + 中海绿 + 中岩蓝 + 中春绿 + 中绿松石 + 中青紫红 + 午夜蓝 + 薄荷奶油 + 雾玫瑰 + 鹿皮鞋 + 那瓦霍白 + 海军蓝 / 深蓝 + 旧蕾丝 + 橄榄 + 橄榄军服绿 + + 橙红 + 兰花 / 兰紫 + 灰金菊 + 灰绿 + 灰绿松石 + 灰紫红 + 蕃木瓜 + 宗主教 + 粉扑桃 + 秘鲁 + 粉红 + 粉蓝 + 丽贝卡紫 + + 玫瑰褐 + 品蓝 / 皇室蓝 + 鞍褐 + 鲑红 + 沙褐 + 海贝 + 海绿 + 赭黄 + + 天空蓝 + 岩蓝 + 岩灰 + 岩灰 + + 春绿 + 钢青 + 日晒 + 鸭绿 / 凫绿 + 蓟紫 + 蕃茄红 + 绿松 + 紫罗兰 + 小麦 + + 白烟 + + 黄绿 + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/android_material_design_colors_string.xml b/app/src/main/res/values-zh/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values-zh/android_material_design_colors_string.xml rename to app/src/main/res/values-zh/material_design_colors_string.xml diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 9d57992d..18dba29a 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -902,5 +902,7 @@ 切换至传统布局 搜索颜色 定位当前颜色 + 新建颜色库 + 调色盘 diff --git a/app/src/main/res/values-zh/web_colors_string.xml b/app/src/main/res/values-zh/web_colors_string.xml new file mode 100644 index 00000000..3a536c81 --- /dev/null +++ b/app/src/main/res/values-zh/web_colors_string.xml @@ -0,0 +1,253 @@ + + + + 爱丽丝蓝 + 茜红 / 深茜红 + 琥珀 + 紫水晶 + 古董白 + 苹果绿 + 杏黄 + + 蓝绿 / 碧蓝 + 水蓝 + 蔚蓝 / 湛蓝 + 浅蓝 + 浅粉红 + 米黄 + 陶坯黄 + + 杏仁白 + + 蓝紫 + 黄绿 / 明绿 + + + 勃艮第酒红 + 硬木 + 燃橙 + 军服蓝 + + 山茶红 + 鲜黄 + 枢机红 + 胭脂红 + 青瓷绿 + 樱桃红 / 樱桃 + 蔚蓝 / 天青蓝 + 香槟黄 + 查特酒绿 + 巧克力 + 铬黄 + 铁线莲紫 + 钴蓝 + 钴绿 + 椰褐 + 咖啡 + 珊瑚红 + 浅珊瑚红 + 矢车菊蓝 + 玉米丝 + 奶油 + 绯红 + + 青蓝 + 暗蓝 + 暗青 + 暗金菊 + 暗灰 + 暗绿 + 暗卡其 + 暗洋红 + 暗矿蓝 + 暗橄榄绿 + 暗橙 + 暗兰紫 + 暗粉蓝 + 暗红 + 暗鲑红 + 暗海绿 + 暗岩蓝 + 暗岩灰 + 暗绿松石 + 暗紫 + 深粉红 + 深天蓝 + 昏灰 + 道奇蓝 + 碧绿 + 砖红 + 火鹤红 + 花卉白 + 叶绿 + 森林绿 + 嫩绿 + 紫红 + 庚斯博罗灰 + 幽灵白 + / GOLD 金 + 金菊 + 草绿 + + 浅灰紫 + 绿 + 绿黄 + 缬草紫 + 蜜瓜绿 + 蜜橙 + + 暖粉红 + 印度红 + + 国际奇连蓝 + 铁灰 + 象牙 + 常春藤绿 + 茉莉黄 + 卡其 + 天青石蓝 + 薰衣草紫 + / PERIWINKLE 薰衣草蓝 / 长春花 + 薰衣草紫红 + 亮紫 + 薰衣草雾 + 草坪绿 + 柠檬绸 + 亮蓝 + 亮珊瑚 + 亮青 + 亮金菊黄 + 亮灰 + 亮绿 + 亮卡其 + 亮粉红 + 亮鲑红 + 亮海绿 + 浅天蓝 + 亮岩灰 + 亮钢蓝 + 亮紫 + 亮黄 + 紫丁香 + / LIGHT_LIME 柠檬绿 / 亮柠檬绿 + 柠檬绿 + 亚麻 + 洋红 / 品红 + 洋玫瑰红 + 孔雀石绿 + 锦葵紫 + 万寿菊黄 + 水手蓝 + + 木槿紫 + 中碧蓝 + 中蓝 + 梅红 + 中兰紫 + 中紫 + 中海绿 + 中岩蓝 + 中春绿 + 中绿松石 + 中青紫红 + 午夜蓝 + 含羞草黄 + 矿蓝 + 矿紫 + 薄荷绿 + 薄荷奶油 + 雾玫瑰 + 鹿皮鞋 + 月黄 + 苔藓绿 + 芥末黄 + 那瓦霍白 + / NAVY_BLUE 海军蓝 / 藏青 + + 旧蕾丝 + 陈玫红 + 橄榄 + 橄榄军服绿 + 优品紫红 + + 橙红 + 兰花 / 兰紫 + 淡紫丁香 + 灰蓝 + 灰丁宁蓝 / 白牛仔布 + 灰金菊 + 灰绿 + 灰土 + 灰绿松石 + 灰紫红 + 三色堇紫 + 蕃木瓜 + 宗主教 + + 珍珠桃 + 粉扑桃 + 孔雀蓝 + 孔雀绿 + 浅珍珠红 + 柿子橙 + 秘鲁 + 粉红 + 梅红 + 粉蓝 + 普鲁士蓝 + + + 玫瑰红 + 浅玫瑰红 + 玫瑰褐 + 品蓝 / 皇室蓝 + 红宝石 + 鞍褐 + 鲑红 + 浅鲑红 + 鼠尾草蓝 + 沙棕 + 沙褐 + 蓝宝石 / 青玉 + 萨克斯蓝 + 猩红 / 腥红 + 海贝 + 海绿 + 深褐 / 乌贼墨 + 壳黄红 + 赭黄 + + 天空蓝 + 岩蓝 + 岩灰 + + 尖晶石红 + 春绿 + 钢青 + 浓蓝 + 鲜红 + 阳橙 + 日晒 + + 橙黄 + 鸭绿 / 凫绿 + 蓟紫 + 蕃茄红 + 热带橙 + 绿松 / 绿松石 + 土耳其蓝 + 绿松石绿 + 极浓海蓝 + 朱红 + 孔雀石绿 + 堇紫 + 铬绿 + 韦奇伍德瓷蓝 + 小麦 + + 白烟 + 紫藤 + + 黄绿 + + \ No newline at end of file diff --git a/app/src/main/res/values/android_colors.xml b/app/src/main/res/values/android_colors.xml new file mode 100644 index 00000000..7dde875b --- /dev/null +++ b/app/src/main/res/values/android_colors.xml @@ -0,0 +1,28 @@ + + + + #000000 + #0000FF + #00FFFF + #00FFFF + #444444 + #444444 + #888888 + #888888 + #00FF00 + #00FF00 + #CCCCCC + #CCCCCC + #FF00FF + #FF00FF + #800000 + #000080 + #808000 + #800080 + #FF0000 + #C0C0C0 + #008080 + #FFFFFF + #FFFF00 + + \ No newline at end of file diff --git a/app/src/main/res/values/android_colors_string.xml b/app/src/main/res/values/android_colors_string.xml new file mode 100644 index 00000000..eab1f650 --- /dev/null +++ b/app/src/main/res/values/android_colors_string.xml @@ -0,0 +1,28 @@ + + + + Black + Blue + Cyan + Aqua + Dark gray + Dark grey + Gray + Grey + Green + Lime + Light gray + Light grey + Magenta + Fuchsia + Maroon + Navy + Olive + Purple + Red + Silver + Teal + White + Yellow + + \ No newline at end of file diff --git a/app/src/main/res/values/css_colors.xml b/app/src/main/res/values/css_colors.xml new file mode 100644 index 00000000..0db0396c --- /dev/null +++ b/app/src/main/res/values/css_colors.xml @@ -0,0 +1,153 @@ + + + + #F0F8FF + #FAEBD7 + #7FFFD4 + #F0FFFF + #F5F5DC + #FFE4C4 + #000000 + #FFEBCD + #0000FF + #8A2BE2 + #A52A2A + #DEB887 + #5F9EA0 + #7FFF00 + #D2691E + #FF7F50 + #6495ED + #FFF8DC + #DC143C + #00FFFF + #00FFFF + #00008B + #008B8B + #B8860B + #A9A9A9 + #A9A9A9 + #006400 + #BDB76B + #8B008B + #556B2F + #FF8C00 + #9932CC + #8B0000 + #E9967A + #8FBC8F + #483D8B + #2F4F4F + #2F4F4F + #00CED1 + #9400D3 + #FF1493 + #00BFFF + #696969 + #696969 + #1E90FF + #B22222 + #FFFAF0 + #228B22 + #DCDCDC + #F8F8FF + #FFD700 + #DAA520 + #808080 + #808080 + #008000 + #ADFF2F + #F0FFF0 + #FF69B4 + #CD5C5C + #4B0082 + #FFFFF0 + #F0E68C + #E6E6FA + #FFF0F5 + #7CFC00 + #FFFACD + #ADD8E6 + #F08080 + #E0FFFF + #FAFAD2 + #D3D3D3 + #D3D3D3 + #90EE90 + #FFB6C1 + #FFA07A + #20B2AA + #87CEFA + #778899 + #778899 + #B0C4DE + #FFFFE0 + #00FF00 + #32CD32 + #FAF0E6 + #FF00FF + #FF00FF + #800000 + #66CDAA + #0000CD + #DDA0DD + #BA55D3 + #9370DB + #3CB371 + #7B68EE + #00FA9A + #48D1CC + #C71585 + #191970 + #F5FFFA + #FFE4E1 + #FFE4B5 + #FFDEAD + #000080 + #FDF5E6 + #808000 + #6B8E23 + #FFA500 + #FF4500 + #DA70D6 + #EEE8AA + #98FB98 + #AFEEEE + #DB7093 + #FFEFD5 + #800080 + #FFDAB9 + #CD853F + #FFC0CB + #B0E0E6 + #663399 + #FF0000 + #BC8F8F + #4169E1 + #8B4513 + #FA8072 + #F4A460 + #FFF5EE + #2E8B57 + #A0522D + #C0C0C0 + #87CEEB + #6A5ACD + #708090 + #708090 + #FFFAFA + #00FF7F + #4682B4 + #D2B48C + #008080 + #D8BFD8 + #FF6347 + #40E0D0 + #EE82EE + #F5DEB3 + #FFFFFF + #F5F5F5 + #FFFF00 + #9ACD32 + + \ No newline at end of file diff --git a/app/src/main/res/values/css_colors_string.xml b/app/src/main/res/values/css_colors_string.xml new file mode 100644 index 00000000..3a5ad1c4 --- /dev/null +++ b/app/src/main/res/values/css_colors_string.xml @@ -0,0 +1,153 @@ + + + + Alice blue + Antique white + Aquamarine + Azure + Beige + Bisque + Black + Blanched almond + Blue + Blue violet + Brown + Burly wood + Cadet blue + Chartreuse + Chocolate + Coral + Cornflower blue + Corn silk + Crimson + Cyan + Aqua + Dark blue + Dark cyan + Dark goldenrod + Dark gray + Dark grey + Dark green + Dark khaki + Dark magenta + Dark olive green + Dark orange + Dark orchid + Dark red + Dark salmon + Dark sea green + Dark slate blue + Dark slate gray + Dark slate grey + Dark turquoise + Dark violet + Deep pink + Deep sky blue + Dim gray + Dim grey + Dodger blue + Fire brick + Floral white + Forest green + Gainsboro + Ghost white + Gold + Goldenrod + Gray + Grey + Green + Green yellow + Honeydew + Hot pink + Indian red + Indigo + Ivory + Khaki + Lavender + Lavender blush + Lawn green + Lemon chiffon + Light blue + Light coral + Light cyan + Light goldenrod yellow + Light gray + Light grey + Light green + Light pink + Light salmon + Light sea green + Light sky blue + Light slate gray + Light slate grey + Light steel blue + Light yellow + Lime + Lime green + Linen + Magenta + Fuchsia + Maroon + Medium aquamarine + Medium blue + Medium lavender magenta + Medium orchid + Medium purple + Medium sea green + Medium slate blue + Medium spring green + Medium turquoise + Medium violet red + Midnight blue + Mint cream + Misty rose + Moccasin + Navajo white + Navy + Old lace + Olive + Olive drab + Orange + Orange red + Orchid + Pale goldenrod + Pale green + Pale turquoise + Pale violet red + Papaya whip + Patriarch + Peach puff + Peru + Pink + Powder blue + Rebecca purple + Red + Rosy brown + Royal blue + Saddle brown + Salmon + Sand brown + Seashell + Sea green + Sienna + Silver + Sky blue + Slate blue + Slate gray + Slate grey + Snow + Spring green + Steel blue + Tan + Teal + Thistle + Tomato + Turquoise + Violet + Wheat + White + White smoke + Yellow + Yellow green + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 4c9acf17..bc84cdc0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -31,8 +31,9 @@ 16sp 13sp 11sp - 1sp + 0.5sp 20sp + 12sp 14sp 2dp 280dp diff --git a/app/src/main/res/values/android_material_design_colors.xml b/app/src/main/res/values/material_design_colors.xml similarity index 100% rename from app/src/main/res/values/android_material_design_colors.xml rename to app/src/main/res/values/material_design_colors.xml diff --git a/app/src/main/res/values/android_material_design_colors_string.xml b/app/src/main/res/values/material_design_colors_string.xml similarity index 100% rename from app/src/main/res/values/android_material_design_colors_string.xml rename to app/src/main/res/values/material_design_colors_string.xml diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ac431d0c..f6b9d27c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1141,5 +1141,7 @@ Switch to legacy layout Search color Locate current color + New color library + Color palette diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 58c46a94..efce8c09 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -179,6 +179,10 @@ end + + diff --git a/app/src/main/res/values/web_colors.xml b/app/src/main/res/values/web_colors.xml new file mode 100644 index 00000000..cd3361f6 --- /dev/null +++ b/app/src/main/res/values/web_colors.xml @@ -0,0 +1,253 @@ + + + + #F0F8FF + #E32636 + #FFBF00 + #9966CC + #FAEBD7 + #8CE600 + #E69966 + #AFDFE4 + #7FFFD4 + #66FFE6 + #007FFF + #89CFF0 + #FFD9E6 + #F5F5DC + #FFE4C4 + #000000 + #FFEBCD + #0000FF + #8A2BE2 + #66FF00 + #CD7F32 + #A52A2A + #800020 + #DEB887 + #CC5500 + #5F9EA0 + #A16B47 + #E63995 + #FFEF00 + #990036 + #E6005C + #ACE1AF + #DE3163 + #2A52BE + #FFFF99 + #7FFF00 + #D2691E + #E6B800 + #CCA3CC + #0047AB + #66FF59 + #4D1F00 + #4D3900 + #FF7F50 + #FF80BF + #6495ED + #FFF8DC + #FFFDD0 + #DC143C + #00FFFF + #0DBF8C + #00008B + #008B8B + #B8860B + #A9A9A9 + #006400 + #BDB76B + #8B008B + #24367D + #556B2F + #FF8C00 + #9932CC + #003399 + #8B0000 + #E9967A + #8FBC8F + #483D8B + #2F4F4F + #00CED1 + #9400D3 + #FF1493 + #00BFFF + #696969 + #1E90FF + #50C878 + #B22222 + #E68AB8 + #FFFAF0 + #73B839 + #228B22 + #99FF4D + #F400A1 + #DCDCDC + #F8F8FF + #FFD700 + #DAA520 + #99E64D + #808080 + #8674A1 + #008000 + #ADFF2F + #DF73FF + #F0FFF0 + #FFB366 + #B8DDC8 + #FF69B4 + #CD5C5C + #4B0080 + #002FA7 + #625B57 + #FFFFF0 + #36BF36 + #E6C35C + #996B1F + #26619C + #B57EDC + #CCCCFF + #FFF0F5 + #EE82EE + #E6E6FA + #7CFC00 + #FFFACD + #ADD8E6 + #F08080 + #E0FFFF + #FAFAD2 + #D3D3D3 + #90EE90 + #F0E68C + #FFB6C1 + #FFA07A + #20B2AA + #87CEFA + #778899 + #B0C4DE + #B09DB9 + #FFFFE0 + #C8A2C8 + #CCFF00 + #32CD32 + #FAF0E6 + #FF00FF + #FF0DA6 + #22C32E + #D94DFF + #FF9900 + #00477D + #800000 + #E0B0FF + #66CDAA + #0000CD + #DDA0DD + #BA55D3 + #9370DB + #3CB371 + #7B68EE + #00FA9A + #48D1CC + #C71585 + #191970 + #E6D933 + #004D99 + #A39DAE + #16982B + #F5FFFA + #FFE4E1 + #FFE4B5 + #FFFF4D + #697723 + #CCCC4D + #FFDEAD + #000080 + #CC7722 + #FDF5E6 + #C08081 + #808000 + #6B8E23 + #B784A7 + #FFA500 + #FF4500 + #DA70D6 + #E6CFE6 + #D1EDF2 + #5E86C1 + #EEE8AA + #98FB98 + #CCB38C + #AFEEEE + #DB7093 + #7400A1 + #FFEFD5 + #800080 + #FFE5B4 + #FBBEA1 + #FFDAB9 + #00808C + #00A15C + #FFB3E6 + #FF4D40 + #CD853F + #FFC0CB + #8E4585 + #B0E0E6 + #003153 + #6A0DAD + #FF0000 + #FF007F + #FF66CC + #BC8F8F + #4169E1 + #CC0080 + #8B4513 + #FA8072 + #FF8099 + #4D80E6 + #E6C3C3 + #F4A460 + #082567 + #4798B3 + #FF2400 + #FFF5EE + #2E8B57 + #704214 + #FFB3BF + #A0522D + #C0C0C0 + #87CEEB + #6A5ACD + #708090 + #FFFAFA + #FF73B3 + #00FF80 + #4682B4 + #006374 + #E60000 + #FF7300 + #D2B48C + #F28500 + #FFCC00 + #008080 + #D8BFD8 + #FF6347 + #FF8033 + #30D5C8 + #00FFEF + #4DE680 + #0033FF + #E34234 + #73E68C + #8000FF + #127436 + #5686BF + #F5DEB3 + #FFFFFF + #F5F5F5 + #C9A0DC + #FFFF00 + #9ACD32 + + \ No newline at end of file diff --git a/app/src/main/res/values/web_colors_string.xml b/app/src/main/res/values/web_colors_string.xml new file mode 100644 index 00000000..bf0689ad --- /dev/null +++ b/app/src/main/res/values/web_colors_string.xml @@ -0,0 +1,253 @@ + + + + Alice blue + Alizarin crimson + Amber + Amethyst + Antique white + Apple green + Apricot + Aqua + Aquamarine + Aqua blue + Azure + Baby blue + Baby pink + Beige + Bisque + Black + Blanched almond + Blue + Blue violet + Bright green + Bronze + Brown + Burgundy + Burly wood + Burnt orange + Cadet blue + Camel + Camellia + Canary yellow + Cardinal red + Carmine + Celadon + Cerise + Cerulean blue + Champagne yellow + Chartreuse + Chocolate + Chrome yellow + Clematis + Cobalt blue + Cobalt green + Coconut brown + Coffee + Coral + Coral pink + Cornflower blue + Corn silk + Cream + Crimson + Cyan + Cyan blue + Dark blue + Dark cyan + Dark goldenrod + Dark gray + Dark green + Dark khaki + Dark magenta + Dark mineral blue + Dark olive green + Dark orange + Dark orchid + Dark powder blue + Dark red + Dark salmon + Dark sea green + Dark slate blue + Dark slate gray + Dark turquoise + Dark violet + Deep pink + Deep sky blue + Dim gray + Dodger blue + Emerald + Fire brick + Flamingo + Floral white + Foliage green + Forest green + Fresh leaves + Fuchsia + Gainsboro + Ghost white + Golden + Goldenrod + Grass green + Gray + Grayish purple + Green + Green yellow + Heliotrope + Honeydew + Honey orange + Horizon blue + Hot pink + Indian red + Indigo + International klein blue + Iron gray + Ivory + Ivy green + Jasmine + Khaki + Lapis lazuli + Lavender + Lavender blue + Lavender blush + Lavender magenta + Lavender mist + Lawn green + Lemon chiffon + Light blue + Light coral + Light cyan + Light goldenrod yellow + Light gray + Light green + Light khaki + Light pink + Light salmon + Light sea green + Light sky blue + Light slate gray + Light steel blue + Light violet + Light yellow + Lilac + Lime + Lime green + Linen + Magenta + Magenta rose + Malachite + Mallow + Marigold + Marine blue + Maroon + Mauve + Medium aquamarine + Medium blue + Medium lavender magenta + Medium orchid + Medium purple + Medium sea green + Medium slate blue + Medium spring green + Medium turquoise + Medium violet red + Midnight blue + Mimosa + Mineral blue + Mineral violet + Mint + Mint cream + Misty rose + Moccasin + Moon yellow + Moss green + Mustard + Navajo white + Navy + Ocher + Old lace + Old rose + Olive + Olive drab + Opera mauve + Orange + Orange red + Orchid + Pail lilac + Pale blue + Pale denim + Pale goldenrod + Pale green + Pale ochre + Pale turquoise + Pale violet red + Pansy + Papaya whip + Patriarch + Peach + Peach pearl + Peach puff + Peacock blue + Peacock green + Pearl pink + Persimmon + Peru + Pink + Plum + Powder blue + Prussian blue + Purple + Red + Rose + Rose pink + Rosy brown + Royal blue + Ruby + Saddle brown + Salmon + Salmon pink + Salvia blue + Sand beige + Sand brown + Sapphire + Saxe blue + Scarlet + Seashell + Sea green + Sepia + Shell pink + Sienna + Silver + Sky blue + Slate blue + Slate gray + Snow + Spinel red + Spring green + Steel blue + Strong blue + Strong red + Sun orange + Tan + Tangerine + Tangerine yellow + Teal + Thistle + Tomato + Tropical orange + Turquoise + Turquoise blue + Turquoise green + Ultramarine + Vermilion + Very light malachite green + Violet + Viridian + Wedgwood blue + Wheat + White + White smoke + Wisteria + Yellow + Yellow green + + \ No newline at end of file diff --git a/apksigner/.gitignore b/modules/apk-signer/.gitignore similarity index 100% rename from apksigner/.gitignore rename to modules/apk-signer/.gitignore diff --git a/apksigner/build.gradle b/modules/apk-signer/build.gradle similarity index 100% rename from apksigner/build.gradle rename to modules/apk-signer/build.gradle diff --git a/apksigner/src/main/java/com/android/apksig/ApkSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/ApkSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/ApkSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java b/modules/apk-signer/src/main/java/com/android/apksig/ApkSignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java rename to modules/apk-signer/src/main/java/com/android/apksig/ApkSignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/ApkVerificationIssue.java b/modules/apk-signer/src/main/java/com/android/apksig/ApkVerificationIssue.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkVerificationIssue.java rename to modules/apk-signer/src/main/java/com/android/apksig/ApkVerificationIssue.java diff --git a/apksigner/src/main/java/com/android/apksig/ApkVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/ApkVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/ApkVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/Constants.java b/modules/apk-signer/src/main/java/com/android/apksig/Constants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/Constants.java rename to modules/apk-signer/src/main/java/com/android/apksig/Constants.java diff --git a/apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java b/modules/apk-signer/src/main/java/com/android/apksig/DefaultApkSignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java rename to modules/apk-signer/src/main/java/com/android/apksig/DefaultApkSignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/Hints.java b/modules/apk-signer/src/main/java/com/android/apksig/Hints.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/Hints.java rename to modules/apk-signer/src/main/java/com/android/apksig/Hints.java diff --git a/apksigner/src/main/java/com/android/apksig/JcaSignerEngine.java b/modules/apk-signer/src/main/java/com/android/apksig/JcaSignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/JcaSignerEngine.java rename to modules/apk-signer/src/main/java/com/android/apksig/JcaSignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/KeyConfig.java b/modules/apk-signer/src/main/java/com/android/apksig/KeyConfig.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/KeyConfig.java rename to modules/apk-signer/src/main/java/com/android/apksig/KeyConfig.java diff --git a/apksigner/src/main/java/com/android/apksig/SignerEngine.java b/modules/apk-signer/src/main/java/com/android/apksig/SignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/SignerEngine.java rename to modules/apk-signer/src/main/java/com/android/apksig/SignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/SignerEngineFactory.java b/modules/apk-signer/src/main/java/com/android/apksig/SignerEngineFactory.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/SignerEngineFactory.java rename to modules/apk-signer/src/main/java/com/android/apksig/SignerEngineFactory.java diff --git a/apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java b/modules/apk-signer/src/main/java/com/android/apksig/SigningCertificateLineage.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java rename to modules/apk-signer/src/main/java/com/android/apksig/SigningCertificateLineage.java diff --git a/apksigner/src/main/java/com/android/apksig/SourceStampVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/SourceStampVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/SourceStampVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/SourceStampVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/ApkFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/ApkFormatException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/ApkUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/ApkUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkUtilsLite.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/ApkUtilsLite.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkUtilsLite.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/ApkUtilsLite.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java b/modules/apk-signer/src/main/java/com/android/apksig/apk/MinSdkVersionException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java rename to modules/apk-signer/src/main/java/com/android/apksig/apk/MinSdkVersionException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigResult.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigResult.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigResult.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigResult.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSignerInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtilsLite.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtilsLite.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtilsLite.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtilsLite.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSupportedSignature.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSupportedSignature.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSupportedSignature.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ApkSupportedSignature.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/NoApkSupportedSignaturesException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/NoApkSupportedSignaturesException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/NoApkSupportedSignaturesException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/NoApkSupportedSignaturesException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureNotFoundException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureNotFoundException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/SignatureNotFoundException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/SignatureNotFoundException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampCertificateLineage.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampCertificateLineage.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampCertificateLineage.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampCertificateLineage.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampConstants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/SourceStampVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V1SourceStampVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/stamp/V2SourceStampVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeConstants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeConstants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeConstants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeConstants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeConstants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeConstants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeConstants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeConstants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeConstants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/apk/v4/V4Signature.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/jar/ManifestParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/jar/ManifestParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/oid/OidConstants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/oid/OidConstants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/oid/OidConstants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/oid/OidConstants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteStreams.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ByteStreams.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/Pair.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/Pair.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/Pair.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/Pair.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/TeeDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/TeeDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Extension.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Extension.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Name.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Name.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Name.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Name.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Time.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Time.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Time.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Time.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Validity.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/x509/Validity.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/zip/EocdRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/zip/EocdRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java b/modules/apk-signer/src/main/java/com/android/apksig/internal/zip/ZipUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java rename to modules/apk-signer/src/main/java/com/android/apksig/internal/zip/ZipUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/kms/KmsException.java b/modules/apk-signer/src/main/java/com/android/apksig/kms/KmsException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/kms/KmsException.java rename to modules/apk-signer/src/main/java/com/android/apksig/kms/KmsException.java diff --git a/apksigner/src/main/java/com/android/apksig/kms/KmsSignerEngineProvider.java b/modules/apk-signer/src/main/java/com/android/apksig/kms/KmsSignerEngineProvider.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/kms/KmsSignerEngineProvider.java rename to modules/apk-signer/src/main/java/com/android/apksig/kms/KmsSignerEngineProvider.java diff --git a/apksigner/src/main/java/com/android/apksig/kms/KmsType.java b/modules/apk-signer/src/main/java/com/android/apksig/kms/KmsType.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/kms/KmsType.java rename to modules/apk-signer/src/main/java/com/android/apksig/kms/KmsType.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/util/DataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/DataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSinks.java b/modules/apk-signer/src/main/java/com/android/apksig/util/DataSinks.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSinks.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/DataSinks.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSource.java b/modules/apk-signer/src/main/java/com/android/apksig/util/DataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSource.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/DataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSources.java b/modules/apk-signer/src/main/java/com/android/apksig/util/DataSources.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSources.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/DataSources.java diff --git a/apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java b/modules/apk-signer/src/main/java/com/android/apksig/util/ReadableDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/ReadableDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java b/modules/apk-signer/src/main/java/com/android/apksig/util/RunnablesExecutor.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/RunnablesExecutor.java diff --git a/apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java b/modules/apk-signer/src/main/java/com/android/apksig/util/RunnablesProvider.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java rename to modules/apk-signer/src/main/java/com/android/apksig/util/RunnablesProvider.java diff --git a/apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java b/modules/apk-signer/src/main/java/com/android/apksig/zip/ZipFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java rename to modules/apk-signer/src/main/java/com/android/apksig/zip/ZipFormatException.java diff --git a/apksigner/src/main/java/com/android/apksig/zip/ZipSections.java b/modules/apk-signer/src/main/java/com/android/apksig/zip/ZipSections.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/zip/ZipSections.java rename to modules/apk-signer/src/main/java/com/android/apksig/zip/ZipSections.java diff --git a/apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java b/modules/apk-signer/src/main/java/com/android/apksigner/ApkSignerTool.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java rename to modules/apk-signer/src/main/java/com/android/apksigner/ApkSignerTool.java diff --git a/apksigner/src/main/java/com/android/apksigner/HexEncoding.java b/modules/apk-signer/src/main/java/com/android/apksigner/HexEncoding.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/HexEncoding.java rename to modules/apk-signer/src/main/java/com/android/apksigner/HexEncoding.java diff --git a/apksigner/src/main/java/com/android/apksigner/OptionsParser.java b/modules/apk-signer/src/main/java/com/android/apksigner/OptionsParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/OptionsParser.java rename to modules/apk-signer/src/main/java/com/android/apksigner/OptionsParser.java diff --git a/apksigner/src/main/java/com/android/apksigner/ParameterException.java b/modules/apk-signer/src/main/java/com/android/apksigner/ParameterException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/ParameterException.java rename to modules/apk-signer/src/main/java/com/android/apksigner/ParameterException.java diff --git a/apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java b/modules/apk-signer/src/main/java/com/android/apksigner/PasswordRetriever.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java rename to modules/apk-signer/src/main/java/com/android/apksigner/PasswordRetriever.java diff --git a/apksigner/src/main/java/com/android/apksigner/SignerParams.java b/modules/apk-signer/src/main/java/com/android/apksigner/SignerParams.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/SignerParams.java rename to modules/apk-signer/src/main/java/com/android/apksigner/SignerParams.java diff --git a/apksigner/src/main/java/com/android/apksigner/help.txt b/modules/apk-signer/src/main/java/com/android/apksigner/help.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help.txt rename to modules/apk-signer/src/main/java/com/android/apksigner/help.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_lineage.txt b/modules/apk-signer/src/main/java/com/android/apksigner/help_lineage.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_lineage.txt rename to modules/apk-signer/src/main/java/com/android/apksigner/help_lineage.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_rotate.txt b/modules/apk-signer/src/main/java/com/android/apksigner/help_rotate.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_rotate.txt rename to modules/apk-signer/src/main/java/com/android/apksigner/help_rotate.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_sign.txt b/modules/apk-signer/src/main/java/com/android/apksigner/help_sign.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_sign.txt rename to modules/apk-signer/src/main/java/com/android/apksigner/help_sign.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_verify.txt b/modules/apk-signer/src/main/java/com/android/apksigner/help_verify.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_verify.txt rename to modules/apk-signer/src/main/java/com/android/apksigner/help_verify.txt diff --git a/apksigner/src/main/java/com/android/apksigner/utils/FileUtils.java b/modules/apk-signer/src/main/java/com/android/apksigner/utils/FileUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/utils/FileUtils.java rename to modules/apk-signer/src/main/java/com/android/apksigner/utils/FileUtils.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/ApkSigner.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/ApkSigner.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/ApkSigner.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/ApkSigner.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/CertConverter.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/CertConverter.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/CertConverter.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/CertConverter.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/CertCreator.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/CertCreator.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/CertCreator.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/CertCreator.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/app/filepicker/FilePickHelper.java b/modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/FilePickHelper.java similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/app/filepicker/FilePickHelper.java rename to modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/FilePickHelper.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/app/filepicker/MimeTypeUtil.java b/modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/MimeTypeUtil.java similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/app/filepicker/MimeTypeUtil.java rename to modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/MimeTypeUtil.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/app/filepicker/RequestFile.java b/modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/RequestFile.java similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/app/filepicker/RequestFile.java rename to modules/apk-signer/src/main/java/com/mcal/apksigner/app/filepicker/RequestFile.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/Base64.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/Base64.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/Base64.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/Base64.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/DistinguishedNameValues.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/DistinguishedNameValues.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/DistinguishedNameValues.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/DistinguishedNameValues.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/JKS.java b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/JKS.java similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/JKS.java rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/JKS.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/JksKeyStore.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/JksKeyStore.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/JksKeyStore.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/JksKeyStore.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/KeySet.java b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/KeySet.java similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/KeySet.java rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/KeySet.java diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/KeyStoreHelper.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/KeyStoreHelper.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/KeyStoreHelper.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/KeyStoreHelper.kt diff --git a/apksigner/src/main/java/com/mcal/apksigner/utils/LoadKeystoreException.kt b/modules/apk-signer/src/main/java/com/mcal/apksigner/utils/LoadKeystoreException.kt similarity index 100% rename from apksigner/src/main/java/com/mcal/apksigner/utils/LoadKeystoreException.kt rename to modules/apk-signer/src/main/java/com/mcal/apksigner/utils/LoadKeystoreException.kt diff --git a/apksigner/src/main/resources/keystore/testkey.pk8 b/modules/apk-signer/src/main/resources/keystore/testkey.pk8 similarity index 100% rename from apksigner/src/main/resources/keystore/testkey.pk8 rename to modules/apk-signer/src/main/resources/keystore/testkey.pk8 diff --git a/apksigner/src/main/resources/keystore/testkey.x509.pem b/modules/apk-signer/src/main/resources/keystore/testkey.x509.pem similarity index 100% rename from apksigner/src/main/resources/keystore/testkey.x509.pem rename to modules/apk-signer/src/main/resources/keystore/testkey.x509.pem diff --git a/modules/color-picker/.gitignore b/modules/color-picker/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/modules/color-picker/.gitignore @@ -0,0 +1 @@ +/build diff --git a/modules/color-picker/build.gradle b/modules/color-picker/build.gradle new file mode 100644 index 00000000..13ee0e73 --- /dev/null +++ b/modules/color-picker/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + namespace = 'com.jaredrummler.android.colorpicker' + compileSdk = project.ext.compileSdk + + resourcePrefix "cpv_" + + defaultConfig { + minSdk = project.ext.minSdk + targetSdk = project.ext.targetSdk + + versionName '1.1.0' + } + + compileOptions { + sourceCompatibility = JavaVersion.toVersion(project.ext.javaVersion) + targetCompatibility = JavaVersion.toVersion(project.ext.javaVersion) + } + + kotlinOptions { + jvmTarget = project.ext.javaVersion + } + + lintOptions { + abortOnError false + } +} + +repositories { + mavenCentral() + google() +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'androidx.preference:preference-ktx:1.2.1' +} diff --git a/modules/color-picker/src/main/AndroidManifest.xml b/modules/color-picker/src/main/AndroidManifest.xml new file mode 100644 index 00000000..b7ccac77 --- /dev/null +++ b/modules/color-picker/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/AlphaPatternDrawable.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/AlphaPatternDrawable.java new file mode 100644 index 00000000..aab1f74a --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/AlphaPatternDrawable.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; + +/** + * This drawable will draw a simple white and gray chessboard pattern. + * It's the pattern you will often see as a background behind a partly transparent image in many applications. + */ +class AlphaPatternDrawable extends Drawable { + + private int rectangleSize = 10; + + private Paint paint = new Paint(); + private Paint paintWhite = new Paint(); + private Paint paintGray = new Paint(); + + private int numRectanglesHorizontal; + private int numRectanglesVertical; + + /** + * Bitmap in which the pattern will be cached. + * This is so the pattern will not have to be recreated each time draw() gets called. + * Because recreating the pattern i rather expensive. I will only be recreated if the size changes. + */ + private Bitmap bitmap; + + AlphaPatternDrawable(int rectangleSize) { + this.rectangleSize = rectangleSize; + paintWhite.setColor(0xFFFFFFFF); + paintGray.setColor(0xFFCBCBCB); + } + + @Override public void draw(Canvas canvas) { + if (bitmap != null && !bitmap.isRecycled()) { + canvas.drawBitmap(bitmap, null, getBounds(), paint); + } + } + + @Override public int getOpacity() { + return 0; + } + + @Override public void setAlpha(int alpha) { + throw new UnsupportedOperationException("Alpha is not supported by this drawable."); + } + + @Override public void setColorFilter(ColorFilter cf) { + throw new UnsupportedOperationException("ColorFilter is not supported by this drawable."); + } + + @Override protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + int height = bounds.height(); + int width = bounds.width(); + numRectanglesHorizontal = (int) Math.ceil((width / rectangleSize)); + numRectanglesVertical = (int) Math.ceil(height / rectangleSize); + generatePatternBitmap(); + } + + /** + * This will generate a bitmap with the pattern as big as the rectangle we were allow to draw on. + * We do this to chache the bitmap so we don't need to recreate it each time draw() is called since it takes a few + * milliseconds + */ + private void generatePatternBitmap() { + if (getBounds().width() <= 0 || getBounds().height() <= 0) { + return; + } + + bitmap = Bitmap.createBitmap(getBounds().width(), getBounds().height(), Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + Rect r = new Rect(); + boolean verticalStartWhite = true; + for (int i = 0; i <= numRectanglesVertical; i++) { + boolean isWhite = verticalStartWhite; + for (int j = 0; j <= numRectanglesHorizontal; j++) { + r.top = i * rectangleSize; + r.left = j * rectangleSize; + r.bottom = r.top + rectangleSize; + r.right = r.left + rectangleSize; + canvas.drawRect(r, isWhite ? paintWhite : paintGray); + isWhite = !isWhite; + } + verticalStartWhite = !verticalStartWhite; + } + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPaletteAdapter.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPaletteAdapter.java new file mode 100644 index 00000000..bb11ba05 --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPaletteAdapter.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import androidx.core.graphics.ColorUtils; + +class ColorPaletteAdapter extends BaseAdapter { + + /*package*/ final OnColorSelectedListener listener; + /*package*/ final int[] colors; + /*package*/ int selectedPosition; + /*package*/ int colorShape; + + ColorPaletteAdapter(OnColorSelectedListener listener, int[] colors, int selectedPosition, + @ColorShape int colorShape) { + this.listener = listener; + this.colors = colors; + this.selectedPosition = selectedPosition; + this.colorShape = colorShape; + } + + @Override public int getCount() { + return colors.length; + } + + @Override public Object getItem(int position) { + return colors[position]; + } + + @Override public long getItemId(int position) { + return position; + } + + @Override public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder holder; + if (convertView == null) { + holder = new ViewHolder(parent.getContext()); + convertView = holder.view; + } else { + holder = (ViewHolder) convertView.getTag(); + } + holder.setup(position); + return convertView; + } + + void selectNone() { + selectedPosition = -1; + notifyDataSetChanged(); + } + + interface OnColorSelectedListener { + + void onColorSelected(int color); + } + + private final class ViewHolder { + + View view; + ColorPanelView colorPanelView; + ImageView imageView; + int originalBorderColor; + + ViewHolder(Context context) { + int layoutResId; + if (colorShape == ColorShape.SQUARE) { + layoutResId = R.layout.cpv_color_item_square; + } else { + layoutResId = R.layout.cpv_color_item_circle; + } + view = View.inflate(context, layoutResId, null); + colorPanelView = (ColorPanelView) view.findViewById(R.id.cpv_color_panel_view); + imageView = (ImageView) view.findViewById(R.id.cpv_color_image_view); + originalBorderColor = colorPanelView.getBorderColor(); + view.setTag(this); + } + + void setup(int position) { + int color = colors[position]; + int alpha = Color.alpha(color); + colorPanelView.setColor(color); + imageView.setImageResource(selectedPosition == position ? R.drawable.cpv_preset_checked : 0); + if (alpha != 255) { + if (alpha <= ColorPickerDialog.ALPHA_THRESHOLD) { + colorPanelView.setBorderColor(color | 0xFF000000); + imageView.setColorFilter(/*color | 0xFF000000*/Color.BLACK, PorterDuff.Mode.SRC_IN); + } else { + colorPanelView.setBorderColor(originalBorderColor); + imageView.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); + } + } else { + setColorFilter(position); + } + setOnClickListener(position); + } + + private void setOnClickListener(final int position) { + colorPanelView.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { + if (selectedPosition != position) { + selectedPosition = position; + notifyDataSetChanged(); + } + listener.onColorSelected(colors[position]); + } + }); + colorPanelView.setOnLongClickListener(new View.OnLongClickListener() { + @Override public boolean onLongClick(View v) { + colorPanelView.showHint(); + return true; + } + }); + } + + private void setColorFilter(int position) { + if (position == selectedPosition && ColorUtils.calculateLuminance(colors[position]) >= 0.65) { + imageView.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + } else { + imageView.setColorFilter(null); + } + } + } +} \ No newline at end of file diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPanelView.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPanelView.java new file mode 100644 index 00000000..4945f012 --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPanelView.java @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.widget.Toast; +import androidx.annotation.ColorInt; +import androidx.core.view.GravityCompat; +import androidx.core.view.ViewCompat; +import java.util.Locale; + +/** + * This class draws a panel which which will be filled with a color which can be set. It can be used to show the + * currently selected color which you will get from the {@link ColorPickerView}. + */ +public class ColorPanelView extends View { + + private final static int DEFAULT_BORDER_COLOR = 0xFF6E6E6E; + + private Drawable alphaPattern; + private Paint borderPaint; + private Paint colorPaint; + private Paint alphaPaint; + private Paint originalPaint; + private Rect drawingRect; + private Rect colorRect; + private RectF centerRect = new RectF(); + private boolean showOldColor; + + /* The width in pixels of the border surrounding the color panel. */ + private int borderWidthPx; + private int borderColor = DEFAULT_BORDER_COLOR; + private int color = Color.BLACK; + private int shape; + + public ColorPanelView(Context context) { + this(context, null); + } + + public ColorPanelView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ColorPanelView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + @Override public Parcelable onSaveInstanceState() { + Bundle state = new Bundle(); + state.putParcelable("instanceState", super.onSaveInstanceState()); + state.putInt("color", color); + return state; + } + + @Override public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { + Bundle bundle = (Bundle) state; + color = bundle.getInt("color"); + state = bundle.getParcelable("instanceState"); + } + super.onRestoreInstanceState(state); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ColorPanelView); + shape = a.getInt(R.styleable.ColorPanelView_cpv_colorShape, ColorShape.CIRCLE); + showOldColor = a.getBoolean(R.styleable.ColorPanelView_cpv_showOldColor, false); + if (showOldColor && shape != ColorShape.CIRCLE) { + throw new IllegalStateException("Color preview is only available in circle mode"); + } + borderColor = a.getColor(R.styleable.ColorPanelView_cpv_borderColor, DEFAULT_BORDER_COLOR); + a.recycle(); + if (borderColor == DEFAULT_BORDER_COLOR) { + // If no specific border color has been set we take the default secondary text color as border/slider color. + // Thus it will adopt to theme changes automatically. + final TypedValue value = new TypedValue(); + TypedArray typedArray = + context.obtainStyledAttributes(value.data, new int[] { android.R.attr.textColorSecondary }); + borderColor = typedArray.getColor(0, borderColor); + typedArray.recycle(); + } + borderWidthPx = DrawingUtils.dpToPx(context, 1); + borderPaint = new Paint(); + borderPaint.setAntiAlias(true); + colorPaint = new Paint(); + colorPaint.setAntiAlias(true); + if (showOldColor) { + originalPaint = new Paint(); + } + if (shape == ColorShape.CIRCLE) { + Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(R.drawable.cpv_alpha)).getBitmap(); + alphaPaint = new Paint(); + alphaPaint.setAntiAlias(true); + BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); + alphaPaint.setShader(shader); + } + } + + @Override protected void onDraw(Canvas canvas) { + borderPaint.setColor(borderColor); + colorPaint.setColor(color); + if (shape == ColorShape.SQUARE) { + if (borderWidthPx > 0) { + canvas.drawRect(drawingRect, borderPaint); + } + if (alphaPattern != null) { + alphaPattern.draw(canvas); + } + canvas.drawRect(colorRect, colorPaint); + } else if (shape == ColorShape.CIRCLE) { + final int outerRadius = getMeasuredWidth() / 2; + if (borderWidthPx > 0) { + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, outerRadius, borderPaint); + } + if (Color.alpha(color) < 255) { + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, outerRadius - borderWidthPx, alphaPaint); + } + if (showOldColor) { + canvas.drawArc(centerRect, 90, 180, true, originalPaint); + canvas.drawArc(centerRect, 270, 180, true, colorPaint); + } else { + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, outerRadius - borderWidthPx, colorPaint); + } + } + } + + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (shape == ColorShape.SQUARE) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(width, height); + } else if (shape == ColorShape.CIRCLE) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec); + setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (shape == ColorShape.SQUARE || showOldColor) { + drawingRect = new Rect(); + drawingRect.left = getPaddingLeft(); + drawingRect.right = w - getPaddingRight(); + drawingRect.top = getPaddingTop(); + drawingRect.bottom = h - getPaddingBottom(); + if (showOldColor) { + setUpCenterRect(); + } else { + setUpColorRect(); + } + } + } + + private void setUpCenterRect() { + final Rect dRect = drawingRect; + int left = dRect.left + borderWidthPx; + int top = dRect.top + borderWidthPx; + int bottom = dRect.bottom - borderWidthPx; + int right = dRect.right - borderWidthPx; + centerRect = new RectF(left, top, right, bottom); + } + + private void setUpColorRect() { + final Rect dRect = drawingRect; + int left = dRect.left + borderWidthPx; + int top = dRect.top + borderWidthPx; + int bottom = dRect.bottom - borderWidthPx; + int right = dRect.right - borderWidthPx; + colorRect = new Rect(left, top, right, bottom); + alphaPattern = new AlphaPatternDrawable(DrawingUtils.dpToPx(getContext(), 4)); + alphaPattern.setBounds(Math.round(colorRect.left), Math.round(colorRect.top), Math.round(colorRect.right), + Math.round(colorRect.bottom)); + } + + /** + * Get the color currently show by this view. + * + * @return the color value + */ + public int getColor() { + return color; + } + + /** + * Set the color that should be shown by this view. + * + * @param color the color value + */ + public void setColor(int color) { + this.color = color; + invalidate(); + } + + /** + * Set the original color. This is only used for previewing colors. + * + * @param color The original color + */ + public void setOriginalColor(@ColorInt int color) { + if (originalPaint != null) { + originalPaint.setColor(color); + } + } + + /** + * @return the color of the border surrounding the panel. + */ + public int getBorderColor() { + return borderColor; + } + + /** + * Set the color of the border surrounding the panel. + * + * @param color the color value + */ + public void setBorderColor(int color) { + borderColor = color; + invalidate(); + } + + /** + * Get the shape + * + * @return Either {@link ColorShape#SQUARE} or {@link ColorShape#CIRCLE}. + */ + @ColorShape public int getShape() { + return shape; + } + + /** + * Set the shape. + * + * @param shape Either {@link ColorShape#SQUARE} or {@link ColorShape#CIRCLE}. + */ + public void setShape(@ColorShape int shape) { + this.shape = shape; + invalidate(); + } + + /** + * Show a toast message with the hex color code below the view. + */ + public void showHint() { + final int[] screenPos = new int[2]; + final Rect displayFrame = new Rect(); + getLocationOnScreen(screenPos); + getWindowVisibleDisplayFrame(displayFrame); + final Context context = getContext(); + final int width = getWidth(); + final int height = getHeight(); + final int midy = screenPos[1] + height / 2; + int referenceX = screenPos[0] + width / 2; + if (ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_LTR) { + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + referenceX = screenWidth - referenceX; // mirror + } + StringBuilder hint = new StringBuilder("#"); + if (Color.alpha(color) != 255) { + hint.append(Integer.toHexString(color).toUpperCase(Locale.ENGLISH)); + } else { + hint.append(String.format("%06X", 0xFFFFFF & color).toUpperCase(Locale.ENGLISH)); + } + Toast cheatSheet = Toast.makeText(context, hint.toString(), Toast.LENGTH_SHORT); + if (midy < displayFrame.height()) { + // Show along the top; follow action buttons + cheatSheet.setGravity(Gravity.TOP | GravityCompat.END, referenceX, screenPos[1] + height - displayFrame.top); + } else { + // Show along the bottom center + cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); + } + cheatSheet.show(); + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialog.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialog.java new file mode 100644 index 00000000..c86fc61d --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialog.java @@ -0,0 +1,972 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.TextWatcher; +import android.util.Log; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; +import androidx.annotation.ColorInt; +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.appcompat.app.AlertDialog; +import androidx.core.graphics.ColorUtils; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Locale; + +/** + *

A dialog to pick a color.

+ * + *

The {@link Activity activity} that shows this dialog should implement {@link ColorPickerDialogListener}

+ * + *

Example usage:

+ * + *
+ *   ColorPickerDialog.newBuilder().show(activity);
+ * 
+ * + *

Modified by SuperMonster003 as of Mar 25, 2025.

+ */ +public class ColorPickerDialog extends DialogFragment implements ColorPickerView.OnColorChangedListener, TextWatcher { + + private static final String TAG = "ColorPickerDialog"; + + public static final int TYPE_CUSTOM = 0; + public static final int TYPE_PRESETS = 1; + + /** + * Material design colors used as the default color presets + */ + public static final int[] MATERIAL_COLORS = { + 0xFFF44336, // RED 500 + 0xFFE91E63, // PINK 500 + 0xFFFF2C93, // LIGHT PINK 500 + 0xFF9C27B0, // PURPLE 500 + 0xFF673AB7, // DEEP PURPLE 500 + 0xFF3F51B5, // INDIGO 500 + 0xFF2196F3, // BLUE 500 + 0xFF03A9F4, // LIGHT BLUE 500 + 0xFF00BCD4, // CYAN 500 + 0xFF009688, // TEAL 500 + 0xFF4CAF50, // GREEN 500 + 0xFF8BC34A, // LIGHT GREEN 500 + 0xFFCDDC39, // LIME 500 + 0xFFFFEB3B, // YELLOW 500 + 0xFFFFC107, // AMBER 500 + 0xFFFF9800, // ORANGE 500 + 0xFF795548, // BROWN 500 + 0xFF607D8B, // BLUE GREY 500 + 0xFF9E9E9E, // GREY 500 + }; + + static final int ALPHA_THRESHOLD = 165; + + private static final String ARG_ID = "id"; + private static final String ARG_TYPE = "dialogType"; + private static final String ARG_COLOR = "color"; + private static final String ARG_ALPHA = "alpha"; + private static final String ARG_PRESETS = "presets"; + private static final String ARG_ALLOW_PRESETS = "allowPresets"; + private static final String ARG_ALLOW_CUSTOM = "allowCustom"; + private static final String ARG_DIALOG_TITLE = "dialogTitle"; + private static final String ARG_SHOW_COLOR_SHADES = "showColorShades"; + private static final String ARG_COLOR_SHAPE = "colorShape"; + private static final String ARG_PRESETS_BUTTON_TEXT = "presetsButtonText"; + private static final String ARG_CUSTOM_BUTTON_TEXT = "customButtonText"; + private static final String ARG_SELECTED_BUTTON_TEXT = "selectedButtonText"; + private static final String ARG_USE_LEGACY_MODE = "useLegacyMode"; + + ColorPickerDialogListener colorPickerDialogListener; + FrameLayout rootView; + int[] presets; + @ColorInt + int color; + int dialogType; + int dialogId; + boolean showColorShades; + int colorShape; + + // -- PRESETS -------------------------- + ColorPaletteAdapter adapter; + LinearLayout shadesLayout; + SeekBar transparencySeekBar; + TextView transparencyPercText; + + // -- CUSTOM --------------------------- + ColorPickerView colorPicker; + ColorPanelView newColorPanel; + EditText hexEditText; + boolean showAlphaSlider; + private int presetsButtonStringRes; + private boolean fromEditText; + private int customButtonStringRes; + + private final OnTouchListener onPickerTouchListener = new OnTouchListener() { + @Override + @SuppressLint("ClickableViewAccessibility") + public boolean onTouch(View v, MotionEvent event) { + if (v != hexEditText && hexEditText.hasFocus()) { + hexEditText.clearFocus(); + InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(hexEditText.getWindowToken(), 0); + hexEditText.clearFocus(); + return true; + } + return false; + } + }; + + /** + * Create a new Builder for creating a {@link ColorPickerDialog} instance + * + * @return The {@link Builder builder} to create the {@link ColorPickerDialog}. + */ + public static Builder newBuilder() { + return new Builder(); + } + + @NotNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + dialogId = requireArguments().getInt(ARG_ID); + showAlphaSlider = requireArguments().getBoolean(ARG_ALPHA); + showColorShades = requireArguments().getBoolean(ARG_SHOW_COLOR_SHADES); + colorShape = requireArguments().getInt(ARG_COLOR_SHAPE); + if (savedInstanceState == null) { + color = requireArguments().getInt(ARG_COLOR); + dialogType = requireArguments().getInt(ARG_TYPE); + } else { + color = savedInstanceState.getInt(ARG_COLOR); + dialogType = savedInstanceState.getInt(ARG_TYPE); + } + + rootView = new FrameLayout(requireActivity()); + if (dialogType == TYPE_CUSTOM) { + rootView.addView(createPickerView()); + } else if (dialogType == TYPE_PRESETS) { + rootView.addView(createPresetsView()); + } + + int selectedButtonStringRes = requireArguments().getInt(ARG_SELECTED_BUTTON_TEXT); + if (selectedButtonStringRes == 0) { + selectedButtonStringRes = R.string.cpv_select; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity()).setView(rootView) + .setPositiveButton(selectedButtonStringRes, (dialog, which) -> onColorSelected(color)); + + int dialogTitleStringRes = requireArguments().getInt(ARG_DIALOG_TITLE); + if (dialogTitleStringRes != 0) { + builder.setTitle(dialogTitleStringRes); + } + + presetsButtonStringRes = requireArguments().getInt(ARG_PRESETS_BUTTON_TEXT); + customButtonStringRes = requireArguments().getInt(ARG_CUSTOM_BUTTON_TEXT); + + int neutralButtonStringRes; + if (dialogType == TYPE_CUSTOM && requireArguments().getBoolean(ARG_ALLOW_PRESETS)) { + neutralButtonStringRes = (presetsButtonStringRes != 0 ? presetsButtonStringRes : R.string.cpv_presets); + } else if (dialogType == TYPE_PRESETS && requireArguments().getBoolean(ARG_ALLOW_CUSTOM)) { + neutralButtonStringRes = (customButtonStringRes != 0 ? customButtonStringRes : R.string.cpv_custom); + } else { + neutralButtonStringRes = 0; + } + + if (neutralButtonStringRes != 0) { + builder.setNeutralButton(neutralButtonStringRes, null); + } + + return builder.create(); + } + + @Override + public void onStart() { + super.onStart(); + AlertDialog dialog = (AlertDialog) getDialog(); + + // http://stackoverflow.com/a/16972670/1048340 + // noinspection ConstantConditions + dialog.getWindow() + .clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + + // Do not dismiss the dialog when clicking the neutral button. + Button neutralButton = dialog.getButton(AlertDialog.BUTTON_NEUTRAL); + if (neutralButton != null) { + neutralButton.setOnClickListener(v -> { + rootView.removeAllViews(); + switch (dialogType) { + case TYPE_CUSTOM: + dialogType = TYPE_PRESETS; + ((Button) v).setText(customButtonStringRes != 0 ? customButtonStringRes : R.string.cpv_custom); + rootView.addView(createPresetsView()); + break; + case TYPE_PRESETS: + dialogType = TYPE_CUSTOM; + ((Button) v).setText(presetsButtonStringRes != 0 ? presetsButtonStringRes : R.string.cpv_presets); + rootView.addView(createPickerView()); + } + }); + } + } + + @Override + public void onDismiss(@NotNull DialogInterface dialog) { + super.onDismiss(dialog); + onDialogDismissed(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putInt(ARG_COLOR, color); + outState.putInt(ARG_TYPE, dialogType); + super.onSaveInstanceState(outState); + } + + /** + * Set the callback. + *

+ * Note: The preferred way to handle the callback is to have the calling Activity implement + * {@link ColorPickerDialogListener} as this will not survive an orientation change. + * + * @param colorPickerDialogListener The callback invoked when a color is selected or the dialog is dismissed. + */ + public ColorPickerDialog setColorPickerDialogListener(ColorPickerDialogListener colorPickerDialogListener) { + this.colorPickerDialogListener = colorPickerDialogListener; + return this; + } + + // region Custom Picker + + View createPickerView() { + View contentView = View.inflate(getActivity(), R.layout.cpv_dialog_color_picker, null); + colorPicker = contentView.findViewById(R.id.cpv_color_picker_view); + ColorPanelView oldColorPanel = contentView.findViewById(R.id.cpv_color_panel_old); + newColorPanel = contentView.findViewById(R.id.cpv_color_panel_new); + ImageView arrowRight = contentView.findViewById(R.id.cpv_arrow_right); + hexEditText = contentView.findViewById(R.id.cpv_hex); + + boolean useLegacyMode = requireArguments().getBoolean(ARG_USE_LEGACY_MODE, false); + + try { + final TypedValue value = new TypedValue(); + TypedArray typedArray = requireActivity().obtainStyledAttributes(value.data, new int[]{android.R.attr.textColorPrimary}); + int arrowColor = typedArray.getColor(0, Color.BLACK); + typedArray.recycle(); + arrowRight.setColorFilter(arrowColor); + } catch (Exception ignored) { + /* Ignored. */ + } + + colorPicker.setAlphaSliderVisible(showAlphaSlider); + oldColorPanel.setColor(requireArguments().getInt(ARG_COLOR)); + colorPicker.setColor(color, true); + newColorPanel.setColor(color); + setHex(color); + + if (!showAlphaSlider) { + hexEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); + } + + if (!useLegacyMode) { + oldColorPanel.setOnClickListener(v -> { + + }); + newColorPanel.setOnClickListener(v -> { + + }); + } else { + newColorPanel.setOnClickListener(v -> { + if (newColorPanel.getColor() == color) { + onColorSelected(color); + dismiss(); + } + }); + } + + contentView.setOnTouchListener(onPickerTouchListener); + colorPicker.setOnColorChangedListener(this); + hexEditText.addTextChangedListener(this); + + hexEditText.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus) { + InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(hexEditText, InputMethodManager.SHOW_IMPLICIT); + } + }); + + return contentView; + } + + @Override + public void onColorChanged(int newColor) { + color = newColor; + if (newColorPanel != null) { + newColorPanel.setColor(newColor); + } + if (!fromEditText && hexEditText != null) { + setHex(newColor); + if (hexEditText.hasFocus()) { + InputMethodManager imm = (InputMethodManager) requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(hexEditText.getWindowToken(), 0); + hexEditText.clearFocus(); + } + } + fromEditText = false; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (hexEditText.isFocused()) { + int color = parseColorString(s.toString()); + if (color != colorPicker.getColor()) { + fromEditText = true; + colorPicker.setColor(color, true); + } + } + } + + private void setHex(int color) { + if (showAlphaSlider) { + hexEditText.setText(String.format("%08X", (color))); + } else { + hexEditText.setText(String.format("%06X", (0xFFFFFF & color))); + } + } + + private int parseColorString(String colorString) throws NumberFormatException { + int a, r, g, b = 0; + if (colorString.startsWith("#")) { + colorString = colorString.substring(1); + } + if (colorString.isEmpty()) { + r = 0; + a = 255; + g = 0; + } else if (colorString.length() <= 2) { + a = 255; + r = 0; + b = Integer.parseInt(colorString, 16); + g = 0; + } else if (colorString.length() == 3) { + a = 255; + r = Integer.parseInt(colorString.substring(0, 1), 16); + g = Integer.parseInt(colorString.substring(1, 2), 16); + b = Integer.parseInt(colorString.substring(2, 3), 16); + } else if (colorString.length() == 4) { + a = 255; + r = Integer.parseInt(colorString.substring(0, 2), 16); + g = r; + r = 0; + b = Integer.parseInt(colorString.substring(2, 4), 16); + } else if (colorString.length() == 5) { + a = 255; + r = Integer.parseInt(colorString.substring(0, 1), 16); + g = Integer.parseInt(colorString.substring(1, 3), 16); + b = Integer.parseInt(colorString.substring(3, 5), 16); + } else if (colorString.length() == 6) { + a = 255; + r = Integer.parseInt(colorString.substring(0, 2), 16); + g = Integer.parseInt(colorString.substring(2, 4), 16); + b = Integer.parseInt(colorString.substring(4, 6), 16); + } else if (colorString.length() == 7) { + a = Integer.parseInt(colorString.substring(0, 1), 16); + r = Integer.parseInt(colorString.substring(1, 3), 16); + g = Integer.parseInt(colorString.substring(3, 5), 16); + b = Integer.parseInt(colorString.substring(5, 7), 16); + } else if (colorString.length() == 8) { + a = Integer.parseInt(colorString.substring(0, 2), 16); + r = Integer.parseInt(colorString.substring(2, 4), 16); + g = Integer.parseInt(colorString.substring(4, 6), 16); + b = Integer.parseInt(colorString.substring(6, 8), 16); + } else { + b = -1; + g = -1; + r = -1; + a = -1; + } + return Color.argb(a, r, g, b); + } + + // -- endregion -- + + // region Presets Picker + + View createPresetsView() { + View contentView = View.inflate(getActivity(), R.layout.cpv_dialog_presets, null); + shadesLayout = contentView.findViewById(R.id.shades_layout); + transparencySeekBar = contentView.findViewById(R.id.transparency_seekbar); + transparencyPercText = contentView.findViewById(R.id.transparency_text); + GridView gridView = contentView.findViewById(R.id.gridView); + + loadPresets(); + + if (showColorShades) { + createColorShades(color); + } else { + shadesLayout.setVisibility(View.GONE); + contentView.findViewById(R.id.shades_divider).setVisibility(View.GONE); + } + + adapter = new ColorPaletteAdapter(newColor -> { + if (color == newColor) { + // Double tab selects the color + ColorPickerDialog.this.onColorSelected(color); + dismiss(); + return; + } + color = newColor; + if (showColorShades) { + createColorShades(color); + } + }, presets, getSelectedItemPosition(), colorShape); + + gridView.setAdapter(adapter); + + if (showAlphaSlider) { + setupTransparency(); + } else { + contentView.findViewById(R.id.transparency_layout).setVisibility(View.GONE); + contentView.findViewById(R.id.transparency_title).setVisibility(View.GONE); + } + + return contentView; + } + + private void loadPresets() { + int alpha = Color.alpha(color); + presets = requireArguments().getIntArray(ARG_PRESETS); + if (presets == null) presets = MATERIAL_COLORS; + boolean isMaterialColors = presets == MATERIAL_COLORS; + presets = Arrays.copyOf(presets, presets.length); // don't update the original array when modifying alpha + if (alpha != 255) { + // add alpha to the presets + for (int i = 0; i < presets.length; i++) { + int color = presets[i]; + int red = Color.red(color); + int green = Color.green(color); + int blue = Color.blue(color); + presets[i] = Color.argb(alpha, red, green, blue); + } + } + presets = unshiftIfNotExists(presets, color); + int initialColor = requireArguments().getInt(ARG_COLOR); + if (initialColor != color) { + // The user clicked a color and a configuration change occurred. Make sure the initial color is in the presets + presets = unshiftIfNotExists(presets, initialColor); + } + if (isMaterialColors && presets.length == 19) { + // Add black to have a total of 20 colors if the current color is in the material color palette + presets = pushIfNotExists(presets, Color.argb(alpha, 0, 0, 0)); + } + } + + void createColorShades(@ColorInt final int color) { + final int[] colorShades = getColorShades(color); + + if (shadesLayout.getChildCount() != 0) { + for (int i = 0; i < shadesLayout.getChildCount(); i++) { + FrameLayout layout = (FrameLayout) shadesLayout.getChildAt(i); + final ColorPanelView cpv = layout.findViewById(R.id.cpv_color_panel_view); + ImageView iv = layout.findViewById(R.id.cpv_color_image_view); + cpv.setColor(colorShades[i]); + cpv.setTag(false); + iv.setImageDrawable(null); + } + return; + } + + final int horizontalPadding = getResources().getDimensionPixelSize(R.dimen.cpv_item_horizontal_padding); + + for (final int colorShade : colorShades) { + int layoutResId; + if (colorShape == ColorShape.SQUARE) { + layoutResId = R.layout.cpv_color_item_square; + } else { + layoutResId = R.layout.cpv_color_item_circle; + } + + final View view = View.inflate(getActivity(), layoutResId, null); + final ColorPanelView colorPanelView = view.findViewById(R.id.cpv_color_panel_view); + + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) colorPanelView.getLayoutParams(); + params.leftMargin = params.rightMargin = horizontalPadding; + colorPanelView.setLayoutParams(params); + colorPanelView.setColor(colorShade); + shadesLayout.addView(view); + + colorPanelView.post(() -> { + // The color is black when rotating the dialog. This is a dirty fix. WTF!? + colorPanelView.setColor(colorShade); + }); + + colorPanelView.setOnClickListener(v -> { + if (v.getTag() instanceof Boolean && (Boolean) v.getTag()) { + onColorSelected(ColorPickerDialog.this.color); + dismiss(); + return; // already selected + } + ColorPickerDialog.this.color = colorPanelView.getColor(); + adapter.selectNone(); + for (int i = 0; i < shadesLayout.getChildCount(); i++) { + FrameLayout layout = (FrameLayout) shadesLayout.getChildAt(i); + ColorPanelView cpv = layout.findViewById(R.id.cpv_color_panel_view); + ImageView iv = layout.findViewById(R.id.cpv_color_image_view); + iv.setImageResource(cpv == v ? R.drawable.cpv_preset_checked : 0); + if (cpv == v && ColorUtils.calculateLuminance(cpv.getColor()) >= 0.65 + || Color.alpha(cpv.getColor()) <= ALPHA_THRESHOLD) { + iv.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + } else { + iv.setColorFilter(null); + } + cpv.setTag(cpv == v); + } + }); + colorPanelView.setOnLongClickListener(v -> { + colorPanelView.showHint(); + return true; + }); + } + } + + private void onColorSelected(int color) { + if (colorPickerDialogListener != null) { + Log.w(TAG, "Using deprecated listener which may be remove in future releases"); + colorPickerDialogListener.onColorSelected(dialogId, color); + return; + } + Activity activity = getActivity(); + if (activity instanceof ColorPickerDialogListener) { + ((ColorPickerDialogListener) activity).onColorSelected(dialogId, color); + } else { + throw new IllegalStateException("The activity must implement ColorPickerDialogListener"); + } + } + + private void onDialogDismissed() { + if (colorPickerDialogListener != null) { + Log.w(TAG, "Using deprecated listener which may be remove in future releases"); + colorPickerDialogListener.onDialogDismissed(dialogId); + return; + } + Activity activity = getActivity(); + if (activity instanceof ColorPickerDialogListener) { + ((ColorPickerDialogListener) activity).onDialogDismissed(dialogId); + } + } + + private int shadeColor(@ColorInt int color, double percent) { + String hex = String.format("#%06X", (0xFFFFFF & color)); + long f = Long.parseLong(hex.substring(1), 16); + double t = percent < 0 ? 0 : 255; + double p = percent < 0 ? percent * -1 : percent; + long R = f >> 16; + long G = f >> 8 & 0x00FF; + long B = f & 0x0000FF; + int alpha = Color.alpha(color); + int red = (int) (Math.round((t - R) * p) + R); + int green = (int) (Math.round((t - G) * p) + G); + int blue = (int) (Math.round((t - B) * p) + B); + return Color.argb(alpha, red, green, blue); + } + + private int[] getColorShades(@ColorInt int color) { + return new int[]{ + shadeColor(color, 0.9), shadeColor(color, 0.7), shadeColor(color, 0.5), shadeColor(color, 0.333), + shadeColor(color, 0.166), shadeColor(color, -0.125), shadeColor(color, -0.25), shadeColor(color, -0.375), + shadeColor(color, -0.5), shadeColor(color, -0.675), shadeColor(color, -0.7), shadeColor(color, -0.775), + }; + } + + private void setupTransparency() { + int progress = 255 - Color.alpha(color); + transparencySeekBar.setMax(255); + transparencySeekBar.setProgress(progress); + int percentage = (int) ((double) progress * 100 / 255); + transparencyPercText.setText(String.format(Locale.ENGLISH, "%d%%", percentage)); + transparencySeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + int percentage = (int) ((double) progress * 100 / 255); + transparencyPercText.setText(String.format(Locale.ENGLISH, "%d%%", percentage)); + int alpha = 255 - progress; + // update items in GridView: + for (int i = 0; i < adapter.colors.length; i++) { + int color = adapter.colors[i]; + int red = Color.red(color); + int green = Color.green(color); + int blue = Color.blue(color); + adapter.colors[i] = Color.argb(alpha, red, green, blue); + } + adapter.notifyDataSetChanged(); + // update shades: + for (int i = 0; i < shadesLayout.getChildCount(); i++) { + FrameLayout layout = (FrameLayout) shadesLayout.getChildAt(i); + ColorPanelView cpv = layout.findViewById(R.id.cpv_color_panel_view); + ImageView iv = layout.findViewById(R.id.cpv_color_image_view); + if (layout.getTag() == null) { + // save the original border color + layout.setTag(cpv.getBorderColor()); + } + int color = cpv.getColor(); + color = Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color)); + if (alpha <= ALPHA_THRESHOLD) { + cpv.setBorderColor(color | 0xFF000000); + } else { + cpv.setBorderColor((int) layout.getTag()); + } + if (cpv.getTag() != null && (Boolean) cpv.getTag()) { + // The alpha changed on the selected shaded color. Update the checkmark color filter. + if (alpha <= ALPHA_THRESHOLD) { + iv.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + } else { + if (ColorUtils.calculateLuminance(color) >= 0.65) { + iv.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + } else { + iv.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); + } + } + } + cpv.setColor(color); + } + // update color: + int red = Color.red(color); + int green = Color.green(color); + int blue = Color.blue(color); + color = Color.argb(alpha, red, green, blue); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + } + + private int[] unshiftIfNotExists(int[] array, int value) { + boolean present = false; + for (int i : array) { + if (i == value) { + present = true; + break; + } + } + if (!present) { + int[] newArray = new int[array.length + 1]; + newArray[0] = value; + System.arraycopy(array, 0, newArray, 1, newArray.length - 1); + return newArray; + } + return array; + } + + private int[] pushIfNotExists(int[] array, int value) { + boolean present = false; + for (int i : array) { + if (i == value) { + present = true; + break; + } + } + if (!present) { + int[] newArray = new int[array.length + 1]; + newArray[newArray.length - 1] = value; + System.arraycopy(array, 0, newArray, 0, newArray.length - 1); + return newArray; + } + return array; + } + + private int getSelectedItemPosition() { + for (int i = 0; i < presets.length; i++) { + if (presets[i] == color) { + return i; + } + } + return -1; + } + + // endregion + + // region Builder + + @IntDef({TYPE_CUSTOM, TYPE_PRESETS}) + public @interface DialogType { + + } + + /** @noinspection unused */ + public static final class Builder { + + @StringRes + int dialogTitle = R.string.cpv_default_title; + @StringRes + int presetsButtonText = R.string.cpv_presets; + @StringRes + int customButtonText = R.string.cpv_custom; + @StringRes + int selectedButtonText = R.string.cpv_select; + @DialogType + int dialogType = TYPE_PRESETS; + int[] presets = MATERIAL_COLORS; + @ColorInt + int color = Color.BLACK; + int dialogId = 0; + boolean showAlphaSlider = false; + boolean allowPresets = true; + boolean allowCustom = true; + boolean showColorShades = true; + @ColorShape + int colorShape = ColorShape.CIRCLE; + boolean useLegacyMode = false; + + /*package*/ Builder() { + + } + + /** + * Set the dialog title string resource id + * + * @param dialogTitle The string resource used for the dialog title + * @return This builder object for chaining method calls + */ + public Builder setDialogTitle(@StringRes int dialogTitle) { + this.dialogTitle = dialogTitle; + return this; + } + + /** + * Set the selected button text string resource id + * + * @param selectedButtonText The string resource used for the selected button text + * @return This builder object for chaining method calls + */ + public Builder setSelectedButtonText(@StringRes int selectedButtonText) { + this.selectedButtonText = selectedButtonText; + return this; + } + + /** + * Set the presets button text string resource id + * + * @param presetsButtonText The string resource used for the presets button text + * @return This builder object for chaining method calls + */ + public Builder setPresetsButtonText(@StringRes int presetsButtonText) { + this.presetsButtonText = presetsButtonText; + return this; + } + + /** + * Set the custom button text string resource id + * + * @param customButtonText The string resource used for the custom button text + * @return This builder object for chaining method calls + */ + public Builder setCustomButtonText(@StringRes int customButtonText) { + this.customButtonText = customButtonText; + return this; + } + + /** + * Set which dialog view to show. + * + * @param dialogType Either {@link ColorPickerDialog#TYPE_CUSTOM} or {@link ColorPickerDialog#TYPE_PRESETS}. + * @return This builder object for chaining method calls + */ + public Builder setDialogType(@DialogType int dialogType) { + this.dialogType = dialogType; + return this; + } + + /** + * Set the colors used for the presets + * + * @param presets An array of color ints. + * @return This builder object for chaining method calls + */ + public Builder setPresets(@NonNull int[] presets) { + this.presets = presets; + return this; + } + + /** + * Set the original color + * + * @param color The default color for the color picker + * @return This builder object for chaining method calls + */ + public Builder setColor(int color) { + this.color = color; + return this; + } + + /** + * Set the dialog id used for callbacks + * + * @param dialogId The id that is sent back to the {@link ColorPickerDialogListener}. + * @return This builder object for chaining method calls + */ + public Builder setDialogId(int dialogId) { + this.dialogId = dialogId; + return this; + } + + /** + * Show the alpha slider + * + * @param showAlphaSlider {@code true} to show the alpha slider. Currently only supported with the {@link + * ColorPickerView}. + * @return This builder object for chaining method calls + */ + public Builder setShowAlphaSlider(boolean showAlphaSlider) { + this.showAlphaSlider = showAlphaSlider; + return this; + } + + /** + * Show/Hide a neutral button to select preset colors. + * + * @param allowPresets {@code false} to disable showing the presets button. + * @return This builder object for chaining method calls + */ + public Builder setAllowPresets(boolean allowPresets) { + this.allowPresets = allowPresets; + return this; + } + + /** + * Show/Hide the neutral button to select a custom color. + * + * @param allowCustom {@code false} to disable showing the custom button. + * @return This builder object for chaining method calls + */ + public Builder setAllowCustom(boolean allowCustom) { + this.allowCustom = allowCustom; + return this; + } + + /** + * Show/Hide the color shades in the presets picker + * + * @param showColorShades {@code false} to hide the color shades. + * @return This builder object for chaining method calls + */ + public Builder setShowColorShades(boolean showColorShades) { + this.showColorShades = showColorShades; + return this; + } + + /** + * Set the shape of the color panel view. + * + * @param colorShape Either {@link ColorShape#CIRCLE} or {@link ColorShape#SQUARE}. + * @return This builder object for chaining method calls + */ + public Builder setColorShape(int colorShape) { + this.colorShape = colorShape; + return this; + } + + public Builder setUseLegacyMode(boolean legacyMode) { + this.useLegacyMode = legacyMode; + return this; + } + + /** + * Create the {@link ColorPickerDialog} instance. + * + * @return A new {@link ColorPickerDialog}. + * @see #show(FragmentActivity) + */ + public ColorPickerDialog create() { + ColorPickerDialog dialog = new ColorPickerDialog(); + Bundle args = new Bundle(); + args.putInt(ARG_ID, dialogId); + args.putInt(ARG_TYPE, dialogType); + args.putInt(ARG_COLOR, color); + args.putIntArray(ARG_PRESETS, presets); + args.putBoolean(ARG_ALPHA, showAlphaSlider); + args.putBoolean(ARG_ALLOW_CUSTOM, allowCustom); + args.putBoolean(ARG_ALLOW_PRESETS, allowPresets); + args.putInt(ARG_DIALOG_TITLE, dialogTitle); + args.putBoolean(ARG_SHOW_COLOR_SHADES, showColorShades); + args.putInt(ARG_COLOR_SHAPE, colorShape); + args.putInt(ARG_PRESETS_BUTTON_TEXT, presetsButtonText); + args.putInt(ARG_CUSTOM_BUTTON_TEXT, customButtonText); + args.putInt(ARG_SELECTED_BUTTON_TEXT, selectedButtonText); + args.putBoolean(ARG_USE_LEGACY_MODE, useLegacyMode); + dialog.setArguments(args); + return dialog; + } + + /** + * Create and show the {@link ColorPickerDialog} created with this builder. + * + * @param activity The current activity. + */ + public void show(FragmentActivity activity) { + create().show(activity.getSupportFragmentManager(), "color-picker-dialog"); + } + } + + // endregion +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialogListener.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialogListener.java new file mode 100644 index 00000000..eda30201 --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialogListener.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import androidx.annotation.ColorInt; + +/** + * Callback used for getting the selected color from a color picker dialog. + */ +public interface ColorPickerDialogListener { + + /** + * Callback that is invoked when a color is selected from the color picker dialog. + * + * @param dialogId The dialog id used to create the dialog instance. + * @param color The selected color + */ + void onColorSelected(int dialogId, @ColorInt int color); + + /** + * Callback that is invoked when the color picker dialog was dismissed. + * + * @param dialogId The dialog id used to create the dialog instance. + */ + default void onDialogDismissed(int dialogId) { + /* Empty body. */ + } + +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerView.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerView.java new file mode 100644 index 00000000..2190e007 --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerView.java @@ -0,0 +1,962 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ComposeShader; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Paint.Align; +import android.graphics.Paint.Style; +import android.graphics.Point; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.Shader.TileMode; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.View; + +/** + * Displays a color picker to the user and allow them to select a color. A slider for the alpha channel is also + * available. + * Enable it by setting setAlphaSliderVisible(boolean) to true. + */ +public class ColorPickerView extends View { + + private final static int DEFAULT_BORDER_COLOR = 0xFF6E6E6E; + private final static int DEFAULT_SLIDER_COLOR = 0xFFBDBDBD; + + private final static int HUE_PANEL_WDITH_DP = 30; + private final static int ALPHA_PANEL_HEIGH_DP = 20; + private final static int PANEL_SPACING_DP = 10; + private final static int CIRCLE_TRACKER_RADIUS_DP = 5; + private final static int SLIDER_TRACKER_SIZE_DP = 4; + private final static int SLIDER_TRACKER_OFFSET_DP = 2; + + /** + * The width in pixels of the border + * surrounding all color panels. + */ + private final static int BORDER_WIDTH_PX = 1; + + /** + * The width in px of the hue panel. + */ + private int huePanelWidthPx; + /** + * The height in px of the alpha panel + */ + private int alphaPanelHeightPx; + /** + * The distance in px between the different + * color panels. + */ + private int panelSpacingPx; + /** + * The radius in px of the color palette tracker circle. + */ + private int circleTrackerRadiusPx; + /** + * The px which the tracker of the hue or alpha panel + * will extend outside of its bounds. + */ + private int sliderTrackerOffsetPx; + /** + * Height of slider tracker on hue panel, + * width of slider on alpha panel. + */ + private int sliderTrackerSizePx; + + private Paint satValPaint; + private Paint satValTrackerPaint; + + private Paint alphaPaint; + private Paint alphaTextPaint; + private Paint hueAlphaTrackerPaint; + + private Paint borderPaint; + + private Shader valShader; + private Shader satShader; + private Shader alphaShader; + + /* + * We cache a bitmap of the sat/val panel which is expensive to draw each time. + * We can reuse it when the user is sliding the circle picker as long as the hue isn't changed. + */ + private BitmapCache satValBackgroundCache; + /* We cache the hue background to since its also very expensive now. */ + private BitmapCache hueBackgroundCache; + + /* Current values */ + private int alpha = 0xff; + private float hue = 360f; + private float sat = 0f; + private float val = 0f; + + private boolean showAlphaPanel = false; + private String alphaSliderText = null; + private int sliderTrackerColor = DEFAULT_SLIDER_COLOR; + private int borderColor = DEFAULT_BORDER_COLOR; + + /** + * Minimum required padding. The offset from the + * edge we must have or else the finger tracker will + * get clipped when it's drawn outside of the view. + */ + private int mRequiredPadding; + + /** + * The Rect in which we are allowed to draw. + * Trackers can extend outside slightly, + * due to the required padding we have set. + */ + private Rect drawingRect; + + private Rect satValRect; + private Rect hueRect; + private Rect alphaRect; + + private Point startTouchPoint = null; + + private AlphaPatternDrawable alphaPatternDrawable; + private OnColorChangedListener onColorChangedListener; + + public ColorPickerView(Context context) { + this(context, null); + } + + public ColorPickerView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ColorPickerView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + @Override public Parcelable onSaveInstanceState() { + Bundle state = new Bundle(); + state.putParcelable("instanceState", super.onSaveInstanceState()); + state.putInt("alpha", alpha); + state.putFloat("hue", hue); + state.putFloat("sat", sat); + state.putFloat("val", val); + state.putBoolean("show_alpha", showAlphaPanel); + state.putString("alpha_text", alphaSliderText); + + return state; + } + + @Override public void onRestoreInstanceState(Parcelable state) { + + if (state instanceof Bundle) { + Bundle bundle = (Bundle) state; + + alpha = bundle.getInt("alpha"); + hue = bundle.getFloat("hue"); + sat = bundle.getFloat("sat"); + val = bundle.getFloat("val"); + showAlphaPanel = bundle.getBoolean("show_alpha"); + alphaSliderText = bundle.getString("alpha_text"); + + state = bundle.getParcelable("instanceState"); + } + super.onRestoreInstanceState(state); + } + + private void init(Context context, AttributeSet attrs) { + //Load those if set in xml resource file. + TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ColorPickerView); + showAlphaPanel = a.getBoolean(R.styleable.ColorPickerView_cpv_alphaChannelVisible, false); + alphaSliderText = a.getString(R.styleable.ColorPickerView_cpv_alphaChannelText); + sliderTrackerColor = a.getColor(R.styleable.ColorPickerView_cpv_sliderColor, 0xFFBDBDBD); + borderColor = a.getColor(R.styleable.ColorPickerView_cpv_borderColor, 0xFF6E6E6E); + a.recycle(); + + applyThemeColors(context); + + huePanelWidthPx = DrawingUtils.dpToPx(getContext(), HUE_PANEL_WDITH_DP); + alphaPanelHeightPx = DrawingUtils.dpToPx(getContext(), ALPHA_PANEL_HEIGH_DP); + panelSpacingPx = DrawingUtils.dpToPx(getContext(), PANEL_SPACING_DP); + circleTrackerRadiusPx = DrawingUtils.dpToPx(getContext(), CIRCLE_TRACKER_RADIUS_DP); + sliderTrackerSizePx = DrawingUtils.dpToPx(getContext(), SLIDER_TRACKER_SIZE_DP); + sliderTrackerOffsetPx = DrawingUtils.dpToPx(getContext(), SLIDER_TRACKER_OFFSET_DP); + + mRequiredPadding = getResources().getDimensionPixelSize(R.dimen.cpv_required_padding); + + initPaintTools(); + + //Needed for receiving trackball motion events. + setFocusable(true); + setFocusableInTouchMode(true); + } + + private void applyThemeColors(Context c) { + // If no specific border/slider color has been + // set we take the default secondary text color + // as border/slider color. Thus it will adopt + // to theme changes automatically. + + final TypedValue value = new TypedValue(); + TypedArray a = c.obtainStyledAttributes(value.data, new int[] { android.R.attr.textColorSecondary }); + + if (borderColor == DEFAULT_BORDER_COLOR) { + borderColor = a.getColor(0, DEFAULT_BORDER_COLOR); + } + + if (sliderTrackerColor == DEFAULT_SLIDER_COLOR) { + sliderTrackerColor = a.getColor(0, DEFAULT_SLIDER_COLOR); + } + + a.recycle(); + } + + private void initPaintTools() { + + satValPaint = new Paint(); + satValTrackerPaint = new Paint(); + hueAlphaTrackerPaint = new Paint(); + alphaPaint = new Paint(); + alphaTextPaint = new Paint(); + borderPaint = new Paint(); + + satValTrackerPaint.setStyle(Style.STROKE); + satValTrackerPaint.setStrokeWidth(DrawingUtils.dpToPx(getContext(), 2)); + satValTrackerPaint.setAntiAlias(true); + + hueAlphaTrackerPaint.setColor(sliderTrackerColor); + hueAlphaTrackerPaint.setStyle(Style.STROKE); + hueAlphaTrackerPaint.setStrokeWidth(DrawingUtils.dpToPx(getContext(), 2)); + hueAlphaTrackerPaint.setAntiAlias(true); + + alphaTextPaint.setColor(0xff1c1c1c); + alphaTextPaint.setTextSize(DrawingUtils.dpToPx(getContext(), 14)); + alphaTextPaint.setAntiAlias(true); + alphaTextPaint.setTextAlign(Align.CENTER); + alphaTextPaint.setFakeBoldText(true); + } + + @Override protected void onDraw(Canvas canvas) { + if (drawingRect.width() <= 0 || drawingRect.height() <= 0) { + return; + } + + drawSatValPanel(canvas); + drawHuePanel(canvas); + drawAlphaPanel(canvas); + } + + private void drawSatValPanel(Canvas canvas) { + final Rect rect = satValRect; + + if (BORDER_WIDTH_PX > 0) { + borderPaint.setColor(borderColor); + canvas.drawRect(drawingRect.left, drawingRect.top, rect.right + BORDER_WIDTH_PX, rect.bottom + BORDER_WIDTH_PX, + borderPaint); + } + + if (valShader == null) { + //Black gradient has either not been created or the view has been resized. + valShader = + new LinearGradient(rect.left, rect.top, rect.left, rect.bottom, 0xffffffff, 0xff000000, TileMode.CLAMP); + } + + //If the hue has changed we need to recreate the cache. + if (satValBackgroundCache == null || satValBackgroundCache.value != hue) { + + if (satValBackgroundCache == null) { + satValBackgroundCache = new BitmapCache(); + } + + //We create our bitmap in the cache if it doesn't exist. + if (satValBackgroundCache.bitmap == null) { + satValBackgroundCache.bitmap = Bitmap.createBitmap(rect.width(), rect.height(), Config.ARGB_8888); + } + + //We create the canvas once so we can draw on our bitmap and the hold on to it. + if (satValBackgroundCache.canvas == null) { + satValBackgroundCache.canvas = new Canvas(satValBackgroundCache.bitmap); + } + + int rgb = Color.HSVToColor(new float[] { hue, 1f, 1f }); + + satShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top, 0xffffffff, rgb, TileMode.CLAMP); + + ComposeShader mShader = new ComposeShader(valShader, satShader, PorterDuff.Mode.MULTIPLY); + satValPaint.setShader(mShader); + + // Finally we draw on our canvas, the result will be + // stored in our bitmap which is already in the cache. + // Since this is drawn on a canvas not rendered on + // screen it will automatically not be using the + // hardware acceleration. And this was the code that + // wasn't supported by hardware acceleration which mean + // there is no need to turn it of anymore. The rest of + // the view will still be hw accelerated. + satValBackgroundCache.canvas.drawRect(0, 0, satValBackgroundCache.bitmap.getWidth(), + satValBackgroundCache.bitmap.getHeight(), satValPaint); + + //We set the hue value in our cache to which hue it was drawn with, + //then we know that if it hasn't changed we can reuse our cached bitmap. + satValBackgroundCache.value = hue; + } + + // We draw our bitmap from the cached, if the hue has changed + // then it was just recreated otherwise the old one will be used. + canvas.drawBitmap(satValBackgroundCache.bitmap, null, rect, null); + + Point p = satValToPoint(sat, val); + + satValTrackerPaint.setColor(0xff000000); + canvas.drawCircle(p.x, p.y, circleTrackerRadiusPx - DrawingUtils.dpToPx(getContext(), 1), satValTrackerPaint); + + satValTrackerPaint.setColor(0xffdddddd); + canvas.drawCircle(p.x, p.y, circleTrackerRadiusPx, satValTrackerPaint); + } + + private void drawHuePanel(Canvas canvas) { + final Rect rect = hueRect; + + if (BORDER_WIDTH_PX > 0) { + borderPaint.setColor(borderColor); + + canvas.drawRect(rect.left - BORDER_WIDTH_PX, rect.top - BORDER_WIDTH_PX, rect.right + BORDER_WIDTH_PX, + rect.bottom + BORDER_WIDTH_PX, borderPaint); + } + + if (hueBackgroundCache == null) { + hueBackgroundCache = new BitmapCache(); + hueBackgroundCache.bitmap = Bitmap.createBitmap(rect.width(), rect.height(), Config.ARGB_8888); + hueBackgroundCache.canvas = new Canvas(hueBackgroundCache.bitmap); + + int[] hueColors = new int[(int) (rect.height() + 0.5f)]; + + // Generate array of all colors, will be drawn as individual lines. + float h = 360f; + for (int i = 0; i < hueColors.length; i++) { + hueColors[i] = Color.HSVToColor(new float[] { h, 1f, 1f }); + h -= 360f / hueColors.length; + } + + // Time to draw the hue color gradient, + // its drawn as individual lines which + // will be quite many when the resolution is high + // and/or the panel is large. + Paint linePaint = new Paint(); + linePaint.setStrokeWidth(0); + for (int i = 0; i < hueColors.length; i++) { + linePaint.setColor(hueColors[i]); + hueBackgroundCache.canvas.drawLine(0, i, hueBackgroundCache.bitmap.getWidth(), i, linePaint); + } + } + + canvas.drawBitmap(hueBackgroundCache.bitmap, null, rect, null); + + Point p = hueToPoint(hue); + + RectF r = new RectF(); + r.left = rect.left - sliderTrackerOffsetPx; + r.right = rect.right + sliderTrackerOffsetPx; + r.top = p.y - (sliderTrackerSizePx / 2); + r.bottom = p.y + (sliderTrackerSizePx / 2); + + canvas.drawRoundRect(r, 2, 2, hueAlphaTrackerPaint); + } + + private void drawAlphaPanel(Canvas canvas) { + /* + * Will be drawn with hw acceleration, very fast. + * Also the AlphaPatternDrawable is backed by a bitmap + * generated only once if the size does not change. + */ + + if (!showAlphaPanel || alphaRect == null || alphaPatternDrawable == null) return; + + final Rect rect = alphaRect; + + if (BORDER_WIDTH_PX > 0) { + borderPaint.setColor(borderColor); + canvas.drawRect(rect.left - BORDER_WIDTH_PX, rect.top - BORDER_WIDTH_PX, rect.right + BORDER_WIDTH_PX, + rect.bottom + BORDER_WIDTH_PX, borderPaint); + } + + alphaPatternDrawable.draw(canvas); + + float[] hsv = new float[] { hue, sat, val }; + int color = Color.HSVToColor(hsv); + int acolor = Color.HSVToColor(0, hsv); + + alphaShader = new LinearGradient(rect.left, rect.top, rect.right, rect.top, color, acolor, TileMode.CLAMP); + + alphaPaint.setShader(alphaShader); + + canvas.drawRect(rect, alphaPaint); + + if (alphaSliderText != null && !alphaSliderText.equals("")) { + canvas.drawText(alphaSliderText, rect.centerX(), rect.centerY() + DrawingUtils.dpToPx(getContext(), 4), + alphaTextPaint); + } + + Point p = alphaToPoint(alpha); + + RectF r = new RectF(); + r.left = p.x - (sliderTrackerSizePx / 2); + r.right = p.x + (sliderTrackerSizePx / 2); + r.top = rect.top - sliderTrackerOffsetPx; + r.bottom = rect.bottom + sliderTrackerOffsetPx; + + canvas.drawRoundRect(r, 2, 2, hueAlphaTrackerPaint); + } + + private Point hueToPoint(float hue) { + + final Rect rect = hueRect; + final float height = rect.height(); + + Point p = new Point(); + + p.y = (int) (height - (hue * height / 360f) + rect.top); + p.x = rect.left; + + return p; + } + + private Point satValToPoint(float sat, float val) { + + final Rect rect = satValRect; + final float height = rect.height(); + final float width = rect.width(); + + Point p = new Point(); + + p.x = (int) (sat * width + rect.left); + p.y = (int) ((1f - val) * height + rect.top); + + return p; + } + + private Point alphaToPoint(int alpha) { + + final Rect rect = alphaRect; + final float width = rect.width(); + + Point p = new Point(); + + p.x = (int) (width - (alpha * width / 0xff) + rect.left); + p.y = rect.top; + + return p; + } + + private float[] pointToSatVal(float x, float y) { + + final Rect rect = satValRect; + float[] result = new float[2]; + + float width = rect.width(); + float height = rect.height(); + + if (x < rect.left) { + x = 0f; + } else if (x > rect.right) { + x = width; + } else { + x = x - rect.left; + } + + if (y < rect.top) { + y = 0f; + } else if (y > rect.bottom) { + y = height; + } else { + y = y - rect.top; + } + + result[0] = 1.f / width * x; + result[1] = 1.f - (1.f / height * y); + + return result; + } + + private float pointToHue(float y) { + + final Rect rect = hueRect; + + float height = rect.height(); + + if (y < rect.top) { + y = 0f; + } else if (y > rect.bottom) { + y = height; + } else { + y = y - rect.top; + } + + float hue = 360f - (y * 360f / height); + + return hue; + } + + private int pointToAlpha(int x) { + + final Rect rect = alphaRect; + final int width = rect.width(); + + if (x < rect.left) { + x = 0; + } else if (x > rect.right) { + x = width; + } else { + x = x - rect.left; + } + + return 0xff - (x * 0xff / width); + } + + @Override public boolean onTouchEvent(MotionEvent event) { + boolean update = false; + + switch (event.getAction()) { + + case MotionEvent.ACTION_DOWN: + startTouchPoint = new Point((int) event.getX(), (int) event.getY()); + update = moveTrackersIfNeeded(event); + break; + case MotionEvent.ACTION_MOVE: + update = moveTrackersIfNeeded(event); + break; + case MotionEvent.ACTION_UP: + startTouchPoint = null; + update = moveTrackersIfNeeded(event); + break; + } + + if (update) { + if (onColorChangedListener != null) { + onColorChangedListener.onColorChanged(Color.HSVToColor(alpha, new float[] { hue, sat, val })); + } + invalidate(); + return true; + } + + return super.onTouchEvent(event); + } + + private boolean moveTrackersIfNeeded(MotionEvent event) { + if (startTouchPoint == null) { + return false; + } + + boolean update = false; + + int startX = startTouchPoint.x; + int startY = startTouchPoint.y; + + if (hueRect.contains(startX, startY)) { + hue = pointToHue(event.getY()); + + update = true; + } else if (satValRect.contains(startX, startY)) { + float[] result = pointToSatVal(event.getX(), event.getY()); + + sat = result[0]; + val = result[1]; + + update = true; + } else if (alphaRect != null && alphaRect.contains(startX, startY)) { + alpha = pointToAlpha((int) event.getX()); + + update = true; + } + + return update; + } + + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int finalWidth; + int finalHeight; + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + + int widthAllowed = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); + int heightAllowed = MeasureSpec.getSize(heightMeasureSpec) - getPaddingBottom() - getPaddingTop(); + + if (widthMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.EXACTLY) { + //A exact value has been set in either direction, we need to stay within this size. + + if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { + //The with has been specified exactly, we need to adopt the height to fit. + int h = (widthAllowed - panelSpacingPx - huePanelWidthPx); + + if (showAlphaPanel) { + h += panelSpacingPx + alphaPanelHeightPx; + } + + if (h > heightAllowed) { + //We can't fit the view in this container, set the size to whatever was allowed. + finalHeight = heightAllowed; + } else { + finalHeight = h; + } + + finalWidth = widthAllowed; + } else if (heightMode == MeasureSpec.EXACTLY && widthMode != MeasureSpec.EXACTLY) { + //The height has been specified exactly, we need to stay within this height and adopt the width. + + int w = (heightAllowed + panelSpacingPx + huePanelWidthPx); + + if (showAlphaPanel) { + w -= (panelSpacingPx + alphaPanelHeightPx); + } + + if (w > widthAllowed) { + //we can't fit within this container, set the size to whatever was allowed. + finalWidth = widthAllowed; + } else { + finalWidth = w; + } + + finalHeight = heightAllowed; + } else { + //If we get here the dev has set the width and height to exact sizes. For example match_parent or 300dp. + //This will mean that the sat/val panel will not be square but it doesn't matter. It will work anyway. + //In all other senarios our goal is to make that panel square. + + //We set the sizes to exactly what we were told. + finalWidth = widthAllowed; + finalHeight = heightAllowed; + } + } else { + //If no exact size has been set we try to make our view as big as possible + //within the allowed space. + + //Calculate the needed width to layout using max allowed height. + int widthNeeded = (heightAllowed + panelSpacingPx + huePanelWidthPx); + + //Calculate the needed height to layout using max allowed width. + int heightNeeded = (widthAllowed - panelSpacingPx - huePanelWidthPx); + + if (showAlphaPanel) { + widthNeeded -= (panelSpacingPx + alphaPanelHeightPx); + heightNeeded += panelSpacingPx + alphaPanelHeightPx; + } + + boolean widthOk = false; + boolean heightOk = false; + + if (widthNeeded <= widthAllowed) { + widthOk = true; + } + + if (heightNeeded <= heightAllowed) { + heightOk = true; + } + + if (widthOk && heightOk) { + finalWidth = widthAllowed; + finalHeight = heightNeeded; + } else if (!heightOk && widthOk) { + finalHeight = heightAllowed; + finalWidth = widthNeeded; + } else if (!widthOk && heightOk) { + finalHeight = heightNeeded; + finalWidth = widthAllowed; + } else { + finalHeight = heightAllowed; + finalWidth = widthAllowed; + } + } + + setMeasuredDimension(finalWidth + getPaddingLeft() + getPaddingRight(), + finalHeight + getPaddingTop() + getPaddingBottom()); + } + + private int getPreferredWidth() { + //Our preferred width and height is 200dp for the square sat / val rectangle. + int width = DrawingUtils.dpToPx(getContext(), 200); + + return (width + huePanelWidthPx + panelSpacingPx); + } + + private int getPreferredHeight() { + int height = DrawingUtils.dpToPx(getContext(), 200); + + if (showAlphaPanel) { + height += panelSpacingPx + alphaPanelHeightPx; + } + return height; + } + + @Override public int getPaddingTop() { + return Math.max(super.getPaddingTop(), mRequiredPadding); + } + + @Override public int getPaddingBottom() { + return Math.max(super.getPaddingBottom(), mRequiredPadding); + } + + @Override public int getPaddingLeft() { + return Math.max(super.getPaddingLeft(), mRequiredPadding); + } + + @Override public int getPaddingRight() { + return Math.max(super.getPaddingRight(), mRequiredPadding); + } + + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + drawingRect = new Rect(); + drawingRect.left = getPaddingLeft(); + drawingRect.right = w - getPaddingRight(); + drawingRect.top = getPaddingTop(); + drawingRect.bottom = h - getPaddingBottom(); + + //The need to be recreated because they depend on the size of the view. + valShader = null; + satShader = null; + alphaShader = null; + + // Clear those bitmap caches since the size may have changed. + satValBackgroundCache = null; + hueBackgroundCache = null; + + setUpSatValRect(); + setUpHueRect(); + setUpAlphaRect(); + } + + private void setUpSatValRect() { + //Calculate the size for the big color rectangle. + final Rect dRect = drawingRect; + + int left = dRect.left + BORDER_WIDTH_PX; + int top = dRect.top + BORDER_WIDTH_PX; + int bottom = dRect.bottom - BORDER_WIDTH_PX; + int right = dRect.right - BORDER_WIDTH_PX - panelSpacingPx - huePanelWidthPx; + + if (showAlphaPanel) { + bottom -= (alphaPanelHeightPx + panelSpacingPx); + } + + satValRect = new Rect(left, top, right, bottom); + } + + private void setUpHueRect() { + //Calculate the size for the hue slider on the left. + final Rect dRect = drawingRect; + + int left = dRect.right - huePanelWidthPx + BORDER_WIDTH_PX; + int top = dRect.top + BORDER_WIDTH_PX; + int bottom = dRect.bottom - BORDER_WIDTH_PX - (showAlphaPanel ? (panelSpacingPx + alphaPanelHeightPx) : 0); + int right = dRect.right - BORDER_WIDTH_PX; + + hueRect = new Rect(left, top, right, bottom); + } + + private void setUpAlphaRect() { + + if (!showAlphaPanel) return; + + final Rect dRect = drawingRect; + + int left = dRect.left + BORDER_WIDTH_PX; + int top = dRect.bottom - alphaPanelHeightPx + BORDER_WIDTH_PX; + int bottom = dRect.bottom - BORDER_WIDTH_PX; + int right = dRect.right - BORDER_WIDTH_PX; + + alphaRect = new Rect(left, top, right, bottom); + + alphaPatternDrawable = new AlphaPatternDrawable(DrawingUtils.dpToPx(getContext(), 4)); + alphaPatternDrawable.setBounds(Math.round(alphaRect.left), Math.round(alphaRect.top), Math.round(alphaRect.right), + Math.round(alphaRect.bottom)); + } + + /** + * Set a OnColorChangedListener to get notified when the color + * selected by the user has changed. + * + * @param listener the listener + */ + public void setOnColorChangedListener(OnColorChangedListener listener) { + onColorChangedListener = listener; + } + + /** + * Get the current color this view is showing. + * + * @return the current color. + */ + public int getColor() { + return Color.HSVToColor(alpha, new float[] { hue, sat, val }); + } + + /** + * Set the color the view should show. + * + * @param color The color that should be selected. #argb + */ + public void setColor(int color) { + setColor(color, false); + } + + /** + * Set the color this view should show. + * + * @param color The color that should be selected. #argb + * @param callback If you want to get a callback to your OnColorChangedListener. + */ + public void setColor(int color, boolean callback) { + + int alpha = Color.alpha(color); + int red = Color.red(color); + int blue = Color.blue(color); + int green = Color.green(color); + + float[] hsv = new float[3]; + + Color.RGBToHSV(red, green, blue, hsv); + + this.alpha = alpha; + hue = hsv[0]; + sat = hsv[1]; + val = hsv[2]; + + if (callback && onColorChangedListener != null) { + onColorChangedListener.onColorChanged(Color.HSVToColor(this.alpha, new float[] { hue, sat, val })); + } + + invalidate(); + } + + /** + * Set if the user is allowed to adjust the alpha panel. Default is false. + * If it is set to false no alpha will be set. + * + * @param visible {@code true} to show the alpha slider + */ + public void setAlphaSliderVisible(boolean visible) { + if (showAlphaPanel != visible) { + showAlphaPanel = visible; + + /* + * Force recreation. + */ + valShader = null; + satShader = null; + alphaShader = null; + hueBackgroundCache = null; + satValBackgroundCache = null; + + requestLayout(); + } + } + + /** + * Get color of the tracker slider on the hue and alpha panel. + * + * @return the color value + */ + public int getSliderTrackerColor() { + return sliderTrackerColor; + } + + /** + * Set the color of the tracker slider on the hue and alpha panel. + * + * @param color a color value + */ + public void setSliderTrackerColor(int color) { + sliderTrackerColor = color; + hueAlphaTrackerPaint.setColor(sliderTrackerColor); + invalidate(); + } + + /** + * Get the color of the border surrounding all panels. + */ + public int getBorderColor() { + return borderColor; + } + + /** + * Set the color of the border surrounding all panels. + * + * @param color a color value + */ + public void setBorderColor(int color) { + borderColor = color; + invalidate(); + } + + /** + * Set the text that should be shown in the + * alpha slider. Set to null to disable text. + * + * @param res string resource id. + */ + public void setAlphaSliderText(int res) { + String text = getContext().getString(res); + setAlphaSliderText(text); + } + + /** + * Get the current value of the text + * that will be shown in the alpha + * slider. + * + * @return the slider text + */ + public String getAlphaSliderText() { + return alphaSliderText; + } + + /** + * Set the text that should be shown in the + * alpha slider. Set to null to disable text. + * + * @param text Text that should be shown. + */ + public void setAlphaSliderText(String text) { + alphaSliderText = text; + invalidate(); + } + + public interface OnColorChangedListener { + + void onColorChanged(int newColor); + } + + private class BitmapCache { + + public Canvas canvas; + public Bitmap bitmap; + public float value; + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreference.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreference.java new file mode 100644 index 00000000..0021dd5b --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreference.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; + +/** + * A Preference to select a color + */ +public class ColorPreference extends Preference implements ColorPickerDialogListener { + + private static final int SIZE_NORMAL = 0; + private static final int SIZE_LARGE = 1; + + private OnShowDialogListener onShowDialogListener; + private int color = Color.BLACK; + private boolean showDialog; + @ColorPickerDialog.DialogType private int dialogType; + private int colorShape; + private boolean allowPresets; + private boolean allowCustom; + private boolean showAlphaSlider; + private boolean showColorShades; + private int previewSize; + private int[] presets; + private int dialogTitle; + + public ColorPreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(attrs); + } + + public ColorPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(attrs); + } + + private void init(AttributeSet attrs) { + setPersistent(true); + TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ColorPreference); + showDialog = a.getBoolean(R.styleable.ColorPreference_cpv_showDialog, true); + //noinspection WrongConstant + dialogType = a.getInt(R.styleable.ColorPreference_cpv_dialogType, ColorPickerDialog.TYPE_PRESETS); + colorShape = a.getInt(R.styleable.ColorPreference_cpv_colorShape, ColorShape.CIRCLE); + allowPresets = a.getBoolean(R.styleable.ColorPreference_cpv_allowPresets, true); + allowCustom = a.getBoolean(R.styleable.ColorPreference_cpv_allowCustom, true); + showAlphaSlider = a.getBoolean(R.styleable.ColorPreference_cpv_showAlphaSlider, false); + showColorShades = a.getBoolean(R.styleable.ColorPreference_cpv_showColorShades, true); + previewSize = a.getInt(R.styleable.ColorPreference_cpv_previewSize, SIZE_NORMAL); + final int presetsResId = a.getResourceId(R.styleable.ColorPreference_cpv_colorPresets, 0); + dialogTitle = a.getResourceId(R.styleable.ColorPreference_cpv_dialogTitle, R.string.cpv_default_title); + if (presetsResId != 0) { + presets = getContext().getResources().getIntArray(presetsResId); + } else { + presets = ColorPickerDialog.MATERIAL_COLORS; + } + if (colorShape == ColorShape.CIRCLE) { + setWidgetLayoutResource( + previewSize == SIZE_LARGE ? R.layout.cpv_preference_circle_large : R.layout.cpv_preference_circle); + } else { + setWidgetLayoutResource( + previewSize == SIZE_LARGE ? R.layout.cpv_preference_square_large : R.layout.cpv_preference_square); + } + a.recycle(); + } + + @Override protected void onClick() { + super.onClick(); + if (onShowDialogListener != null) { + onShowDialogListener.onShowColorPickerDialog((String) getTitle(), color); + } else if (showDialog) { + ColorPickerDialog dialog = ColorPickerDialog.newBuilder() + .setDialogType(dialogType) + .setDialogTitle(dialogTitle) + .setColorShape(colorShape) + .setPresets(presets) + .setAllowPresets(allowPresets) + .setAllowCustom(allowCustom) + .setShowAlphaSlider(showAlphaSlider) + .setShowColorShades(showColorShades) + .setColor(color) + .create(); + dialog.setColorPickerDialogListener(this); + FragmentActivity activity = (FragmentActivity) getContext(); + activity.getSupportFragmentManager() + .beginTransaction() + .add(dialog, getFragmentTag()) + .commitAllowingStateLoss(); + } + } + + @Override protected void onAttachedToActivity() { + super.onAttachedToActivity(); + + if (showDialog) { + FragmentActivity activity = (FragmentActivity) getContext(); + ColorPickerDialog fragment = + (ColorPickerDialog) activity.getSupportFragmentManager().findFragmentByTag(getFragmentTag()); + if (fragment != null) { + // re-bind preference to fragment + fragment.setColorPickerDialogListener(this); + } + } + } + + @Override protected void onBindView(View view) { + super.onBindView(view); + ColorPanelView preview = (ColorPanelView) view.findViewById(R.id.cpv_preference_preview_color_panel); + if (preview != null) { + preview.setColor(color); + } + } + + @Override protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { + if (restorePersistedValue) { + color = getPersistedInt(0xFF000000); + } else { + color = (Integer) defaultValue; + persistInt(color); + } + } + + @Override protected Object onGetDefaultValue(TypedArray a, int index) { + return a.getInteger(index, Color.BLACK); + } + + @Override public void onColorSelected(int dialogId, @ColorInt int color) { + saveValue(color); + } + + @Override public void onDialogDismissed(int dialogId) { + // no-op + } + + /** + * Set the new color + * + * @param color The newly selected color + */ + public void saveValue(@ColorInt int color) { + this.color = color; + persistInt(this.color); + notifyChanged(); + callChangeListener(color); + } + + /** + * Get the colors that will be shown in the {@link ColorPickerDialog}. + * + * @return An array of color ints + */ + public int[] getPresets() { + return presets; + } + + /** + * Set the colors shown in the {@link ColorPickerDialog}. + * + * @param presets An array of color ints + */ + public void setPresets(@NonNull int[] presets) { + this.presets = presets; + } + + /** + * The listener used for showing the {@link ColorPickerDialog}. + * Call {@link #saveValue(int)} after the user chooses a color. + * If this is set then it is up to you to show the dialog. + * + * @param listener The listener to show the dialog + */ + public void setOnShowDialogListener(OnShowDialogListener listener) { + onShowDialogListener = listener; + } + + /** + * The tag used for the {@link ColorPickerDialog}. + * + * @return The tag + */ + public String getFragmentTag() { + return "color_" + getKey(); + } + + public interface OnShowDialogListener { + + void onShowColorPickerDialog(String title, int currentColor); + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreferenceCompat.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreferenceCompat.java new file mode 100644 index 00000000..42e579e6 --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorPreferenceCompat.java @@ -0,0 +1,207 @@ +package com.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.util.AttributeSet; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +/** + * A Preference to select a color + */ +public class ColorPreferenceCompat extends Preference implements ColorPickerDialogListener { + + private static final int SIZE_NORMAL = 0; + private static final int SIZE_LARGE = 1; + + private OnShowDialogListener onShowDialogListener; + private int color = Color.BLACK; + private boolean showDialog; + @ColorPickerDialog.DialogType private int dialogType; + private int colorShape; + private boolean allowPresets; + private boolean allowCustom; + private boolean showAlphaSlider; + private boolean showColorShades; + private int previewSize; + private int[] presets; + private int dialogTitle; + + public ColorPreferenceCompat(Context context, AttributeSet attrs) { + super(context, attrs); + init(attrs); + } + + public ColorPreferenceCompat(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(attrs); + } + + private void init(AttributeSet attrs) { + setPersistent(true); + TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ColorPreference); + showDialog = a.getBoolean(R.styleable.ColorPreference_cpv_showDialog, true); + //noinspection WrongConstant + dialogType = a.getInt(R.styleable.ColorPreference_cpv_dialogType, ColorPickerDialog.TYPE_PRESETS); + colorShape = a.getInt(R.styleable.ColorPreference_cpv_colorShape, ColorShape.CIRCLE); + allowPresets = a.getBoolean(R.styleable.ColorPreference_cpv_allowPresets, true); + allowCustom = a.getBoolean(R.styleable.ColorPreference_cpv_allowCustom, true); + showAlphaSlider = a.getBoolean(R.styleable.ColorPreference_cpv_showAlphaSlider, false); + showColorShades = a.getBoolean(R.styleable.ColorPreference_cpv_showColorShades, true); + previewSize = a.getInt(R.styleable.ColorPreference_cpv_previewSize, SIZE_NORMAL); + final int presetsResId = a.getResourceId(R.styleable.ColorPreference_cpv_colorPresets, 0); + dialogTitle = a.getResourceId(R.styleable.ColorPreference_cpv_dialogTitle, R.string.cpv_default_title); + if (presetsResId != 0) { + presets = getContext().getResources().getIntArray(presetsResId); + } else { + presets = ColorPickerDialog.MATERIAL_COLORS; + } + if (colorShape == ColorShape.CIRCLE) { + setWidgetLayoutResource( + previewSize == SIZE_LARGE ? R.layout.cpv_preference_circle_large : R.layout.cpv_preference_circle); + } else { + setWidgetLayoutResource( + previewSize == SIZE_LARGE ? R.layout.cpv_preference_square_large : R.layout.cpv_preference_square); + } + a.recycle(); + } + + @Override protected void onClick() { + super.onClick(); + if (onShowDialogListener != null) { + onShowDialogListener.onShowColorPickerDialog((String) getTitle(), color); + } else if (showDialog) { + ColorPickerDialog dialog = ColorPickerDialog.newBuilder() + .setDialogType(dialogType) + .setDialogTitle(dialogTitle) + .setColorShape(colorShape) + .setPresets(presets) + .setAllowPresets(allowPresets) + .setAllowCustom(allowCustom) + .setShowAlphaSlider(showAlphaSlider) + .setShowColorShades(showColorShades) + .setColor(color) + .create(); + dialog.setColorPickerDialogListener(this); + getActivity().getSupportFragmentManager() + .beginTransaction() + .add(dialog, getFragmentTag()) + .commitAllowingStateLoss(); + } + } + + public FragmentActivity getActivity() { + Context context = getContext(); + if (context instanceof FragmentActivity) { + return (FragmentActivity) context; + } else if (context instanceof ContextWrapper) { + Context baseContext = ((ContextWrapper) context).getBaseContext(); + if (baseContext instanceof FragmentActivity) { + return (FragmentActivity) baseContext; + } + } + throw new IllegalStateException("Error getting activity from context"); + } + + @Override public void onAttached() { + super.onAttached(); + if (showDialog) { + ColorPickerDialog fragment = + (ColorPickerDialog) getActivity().getSupportFragmentManager().findFragmentByTag(getFragmentTag()); + if (fragment != null) { + // re-bind preference to fragment + fragment.setColorPickerDialogListener(this); + } + } + } + + @Override public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + ColorPanelView preview = (ColorPanelView) holder.itemView.findViewById(R.id.cpv_preference_preview_color_panel); + if (preview != null) { + preview.setColor(color); + } + } + + @Override protected void onSetInitialValue(Object defaultValue) { + super.onSetInitialValue(defaultValue); + if (defaultValue instanceof Integer) { + color = (Integer) defaultValue; + persistInt(color); + } else { + color = getPersistedInt(0xFF000000); + } + } + + @Override protected Object onGetDefaultValue(TypedArray a, int index) { + return a.getInteger(index, Color.BLACK); + } + + @Override public void onColorSelected(int dialogId, @ColorInt int color) { + saveValue(color); + } + + @Override public void onDialogDismissed(int dialogId) { + // no-op + } + + /** + * Set the new color + * + * @param color The newly selected color + */ + public void saveValue(@ColorInt int color) { + this.color = color; + persistInt(this.color); + notifyChanged(); + callChangeListener(color); + } + + /** + * Get the colors that will be shown in the {@link ColorPickerDialog}. + * + * @return An array of color ints + */ + public int[] getPresets() { + return presets; + } + + /** + * Set the colors shown in the {@link ColorPickerDialog}. + * + * @param presets An array of color ints + */ + public void setPresets(@NonNull int[] presets) { + this.presets = presets; + } + + /** + * The listener used for showing the {@link ColorPickerDialog}. + * Call {@link #saveValue(int)} after the user chooses a color. + * If this is set then it is up to you to show the dialog. + * + * @param listener The listener to show the dialog + */ + public void setOnShowDialogListener(OnShowDialogListener listener) { + onShowDialogListener = listener; + } + + /** + * The tag used for the {@link ColorPickerDialog}. + * + * @return The tag + */ + public String getFragmentTag() { + return "color_" + getKey(); + } + + public interface OnShowDialogListener { + + void onShowColorPickerDialog(String title, int currentColor); + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorShape.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorShape.java new file mode 100644 index 00000000..34fdf56c --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/ColorShape.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import androidx.annotation.IntDef; + +/** + * The shape of the color preview + */ +@IntDef({ ColorShape.SQUARE, ColorShape.CIRCLE }) public @interface ColorShape { + + int SQUARE = 0; + + int CIRCLE = 1; +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/DrawingUtils.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/DrawingUtils.java new file mode 100644 index 00000000..6401607d --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/DrawingUtils.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.util.DisplayMetrics; +import android.util.TypedValue; + +final class DrawingUtils { + + static int dpToPx(Context c, float dipValue) { + DisplayMetrics metrics = c.getResources().getDisplayMetrics(); + float val = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics); + int res = (int) (val + 0.5); // Round + // Ensure at least 1 pixel if val was > 0 + return res == 0 && val > 0 ? 1 : res; + } +} diff --git a/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/NestedGridView.java b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/NestedGridView.java new file mode 100644 index 00000000..a304015e --- /dev/null +++ b/modules/color-picker/src/main/java/com/jaredrummler/android/colorpicker/NestedGridView.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2017 Jared Rummler + * + * 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.jaredrummler.android.colorpicker; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.GridView; +import androidx.annotation.RestrictTo; + +@RestrictTo(RestrictTo.Scope.LIBRARY) public class NestedGridView extends GridView { + + public NestedGridView(Context context) { + super(context); + } + + public NestedGridView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NestedGridView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, expandSpec); + } +} diff --git a/modules/color-picker/src/main/res/drawable-hdpi/cpv_alpha.png b/modules/color-picker/src/main/res/drawable-hdpi/cpv_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fe9c850eff429f3843a22979d299d5ed97fb19 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UABs^UlLn;`P|D0!Fe7@j|1LvI9 dE(!iM3=HuJa)n0yuFpVfJzf1=);T3K0RXz#6omi) literal 0 HcmV?d00001 diff --git a/modules/color-picker/src/main/res/drawable-xhdpi/cpv_alpha.png b/modules/color-picker/src/main/res/drawable-xhdpi/cpv_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c51c6120bea99b5ac42981872a99b7d33f1e9297 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^A|T8GBp6maa=HklR6JcALn;`P|D0!FexAVNrgCtz pv;PO3m@5)`wka&<53=??Xky4%r^ff{!fqarK2KLamvv4FO#m2j8rA>+ literal 0 HcmV?d00001 diff --git a/modules/color-picker/src/main/res/drawable-xxhdpi/cpv_alpha.png b/modules/color-picker/src/main/res/drawable-xxhdpi/cpv_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..c81fc262365b18fc96c662c9e42335e4dd702023 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^av;nBBpBqPKh^;$9Zwg>kP61+Kj#~m&M6j4NP0}M xvwm=C@uhUh01=7B8gd*j178-exa6kd$;{wWW+_@}eWDSh-_zC4Wt~$(69COt96|s9 literal 0 HcmV?d00001 diff --git a/modules/color-picker/src/main/res/drawable/cpv_btn_background.xml b/modules/color-picker/src/main/res/drawable/cpv_btn_background.xml new file mode 100644 index 00000000..bf0d4e0e --- /dev/null +++ b/modules/color-picker/src/main/res/drawable/cpv_btn_background.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/drawable/cpv_btn_background_pressed.xml b/modules/color-picker/src/main/res/drawable/cpv_btn_background_pressed.xml new file mode 100644 index 00000000..65986ced --- /dev/null +++ b/modules/color-picker/src/main/res/drawable/cpv_btn_background_pressed.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/drawable/cpv_ic_arrow_right_black_24dp.xml b/modules/color-picker/src/main/res/drawable/cpv_ic_arrow_right_black_24dp.xml new file mode 100644 index 00000000..8f21d158 --- /dev/null +++ b/modules/color-picker/src/main/res/drawable/cpv_ic_arrow_right_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/modules/color-picker/src/main/res/drawable/cpv_preset_checked.xml b/modules/color-picker/src/main/res/drawable/cpv_preset_checked.xml new file mode 100644 index 00000000..46b020f9 --- /dev/null +++ b/modules/color-picker/src/main/res/drawable/cpv_preset_checked.xml @@ -0,0 +1,9 @@ + + + diff --git a/modules/color-picker/src/main/res/layout/cpv_color_item_circle.xml b/modules/color-picker/src/main/res/layout/cpv_color_item_circle.xml new file mode 100644 index 00000000..26539754 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_color_item_circle.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_color_item_square.xml b/modules/color-picker/src/main/res/layout/cpv_color_item_square.xml new file mode 100644 index 00000000..695626d9 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_color_item_square.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_dialog_color_picker.xml b/modules/color-picker/src/main/res/layout/cpv_dialog_color_picker.xml new file mode 100644 index 00000000..1d38f0ce --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_dialog_color_picker.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_dialog_presets.xml b/modules/color-picker/src/main/res/layout/cpv_dialog_presets.xml new file mode 100644 index 00000000..1811efa4 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_dialog_presets.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_preference_circle.xml b/modules/color-picker/src/main/res/layout/cpv_preference_circle.xml new file mode 100644 index 00000000..8b91cd62 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_preference_circle.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_preference_circle_large.xml b/modules/color-picker/src/main/res/layout/cpv_preference_circle_large.xml new file mode 100644 index 00000000..66774801 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_preference_circle_large.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_preference_square.xml b/modules/color-picker/src/main/res/layout/cpv_preference_square.xml new file mode 100644 index 00000000..15c8b1d3 --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_preference_square.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/layout/cpv_preference_square_large.xml b/modules/color-picker/src/main/res/layout/cpv_preference_square_large.xml new file mode 100644 index 00000000..5b4682bd --- /dev/null +++ b/modules/color-picker/src/main/res/layout/cpv_preference_square_large.xml @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-ar/strings.xml b/modules/color-picker/src/main/res/values-ar/strings.xml new file mode 100644 index 00000000..bfafba8d --- /dev/null +++ b/modules/color-picker/src/main/res/values-ar/strings.xml @@ -0,0 +1,23 @@ + + + + + اختر لونًا + ألوان جاهزة + ألوان معدلة + اختر + الشفافية + diff --git a/modules/color-picker/src/main/res/values-be/strings.xml b/modules/color-picker/src/main/res/values-be/strings.xml new file mode 100644 index 00000000..dfc8dae3 --- /dev/null +++ b/modules/color-picker/src/main/res/values-be/strings.xml @@ -0,0 +1,23 @@ + + + + + Вылучыце колер + Перадусталёўкі + Асаблівы + Выбраць + Празрыстасць + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-cs/strings.xml b/modules/color-picker/src/main/res/values-cs/strings.xml new file mode 100644 index 00000000..9dd0bf1c --- /dev/null +++ b/modules/color-picker/src/main/res/values-cs/strings.xml @@ -0,0 +1,23 @@ + + + + + Vyberte barvu + Přednastavené + Vlastní + Vybrat + Průhlednost + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-de/strings.xml b/modules/color-picker/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..187181a3 --- /dev/null +++ b/modules/color-picker/src/main/res/values-de/strings.xml @@ -0,0 +1,23 @@ + + + + + Farbe auswählen + Voreinstellungen + Benutzerdefiniert + Auswählen + Transparenz + diff --git a/modules/color-picker/src/main/res/values-es/strings.xml b/modules/color-picker/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..feedc7e1 --- /dev/null +++ b/modules/color-picker/src/main/res/values-es/strings.xml @@ -0,0 +1,9 @@ + + + + Selecciona un color + Predeterminados + Personalizar + Seleccionar + Transparencia + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-fr-rFR/strings.xml b/modules/color-picker/src/main/res/values-fr-rFR/strings.xml new file mode 100644 index 00000000..9bd07fc0 --- /dev/null +++ b/modules/color-picker/src/main/res/values-fr-rFR/strings.xml @@ -0,0 +1,20 @@ + + + + + Sélectionner une couleur + Présélections + Personnalisée + Valider + Transparence + diff --git a/modules/color-picker/src/main/res/values-it-rIT/strings.xml b/modules/color-picker/src/main/res/values-it-rIT/strings.xml new file mode 100644 index 00000000..276fa31c --- /dev/null +++ b/modules/color-picker/src/main/res/values-it-rIT/strings.xml @@ -0,0 +1,22 @@ + + + + Personalizzato + Seleziona un Colore + Predefiniti + Seleziona + Trasparenza + diff --git a/modules/color-picker/src/main/res/values-iw/strings.xml b/modules/color-picker/src/main/res/values-iw/strings.xml new file mode 100644 index 00000000..1eea7d44 --- /dev/null +++ b/modules/color-picker/src/main/res/values-iw/strings.xml @@ -0,0 +1,8 @@ + + + בחירת צבע + קבוע מראש + מותאם אישית + בחירה + שקיפות + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-ja/strings.xml b/modules/color-picker/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..e4aa741d --- /dev/null +++ b/modules/color-picker/src/main/res/values-ja/strings.xml @@ -0,0 +1,23 @@ + + + + + 色を選択 + プリセット + カスタム + 選択 + 透明度 + diff --git a/modules/color-picker/src/main/res/values-nl-rNL/strings.xml b/modules/color-picker/src/main/res/values-nl-rNL/strings.xml new file mode 100644 index 00000000..362de70d --- /dev/null +++ b/modules/color-picker/src/main/res/values-nl-rNL/strings.xml @@ -0,0 +1,20 @@ + + + + + Selecteer een kleur + Vooraf ingesteld + Aangepast + Kiezen + Transparantie + diff --git a/modules/color-picker/src/main/res/values-pl/strings.xml b/modules/color-picker/src/main/res/values-pl/strings.xml new file mode 100644 index 00000000..8ccbe8ef --- /dev/null +++ b/modules/color-picker/src/main/res/values-pl/strings.xml @@ -0,0 +1,23 @@ + + + + + Wybierz kolor + Kolory domyślne + Dostosuj + Wybierz + Przezroczystość + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-pt/strings.xml b/modules/color-picker/src/main/res/values-pt/strings.xml new file mode 100644 index 00000000..70e53716 --- /dev/null +++ b/modules/color-picker/src/main/res/values-pt/strings.xml @@ -0,0 +1,9 @@ + + + + Selecionar uma cor + Predefinidos + Personalizar + Selecionar + Transparência + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-ru/strings.xml b/modules/color-picker/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..1c085898 --- /dev/null +++ b/modules/color-picker/src/main/res/values-ru/strings.xml @@ -0,0 +1,23 @@ + + + + + Выберите цвет + Предустановки + Особый + Выбрать + Прозрачность + diff --git a/modules/color-picker/src/main/res/values-sk/strings.xml b/modules/color-picker/src/main/res/values-sk/strings.xml new file mode 100644 index 00000000..56a4273b --- /dev/null +++ b/modules/color-picker/src/main/res/values-sk/strings.xml @@ -0,0 +1,23 @@ + + + + + Vyberte farbu + Prednastavené + Vlastné + Vybrať + Priehľadnosť + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values-tr/strings.xml b/modules/color-picker/src/main/res/values-tr/strings.xml new file mode 100644 index 00000000..b4f559b2 --- /dev/null +++ b/modules/color-picker/src/main/res/values-tr/strings.xml @@ -0,0 +1,20 @@ + + + + + Renk Seçin + Ön Ayarlar + Özel + Seç + Şeffaflık + diff --git a/modules/color-picker/src/main/res/values-zh/strings.xml b/modules/color-picker/src/main/res/values-zh/strings.xml new file mode 100644 index 00000000..0799b695 --- /dev/null +++ b/modules/color-picker/src/main/res/values-zh/strings.xml @@ -0,0 +1,23 @@ + + + + + 选择颜色 + 预置颜色 + 自定义颜色 + 确认 + 透明度 + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values/attrs.xml b/modules/color-picker/src/main/res/values/attrs.xml new file mode 100644 index 00000000..13294500 --- /dev/null +++ b/modules/color-picker/src/main/res/values/attrs.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values/dimen.xml b/modules/color-picker/src/main/res/values/dimen.xml new file mode 100644 index 00000000..b79627d5 --- /dev/null +++ b/modules/color-picker/src/main/res/values/dimen.xml @@ -0,0 +1,11 @@ + + + 6dp + 66dp + 34dp + 58dp + 50dp + 8dp + 28dp + 40dp + diff --git a/modules/color-picker/src/main/res/values/ids.xml b/modules/color-picker/src/main/res/values/ids.xml new file mode 100644 index 00000000..88824f42 --- /dev/null +++ b/modules/color-picker/src/main/res/values/ids.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values/strings.xml b/modules/color-picker/src/main/res/values/strings.xml new file mode 100644 index 00000000..416b5d67 --- /dev/null +++ b/modules/color-picker/src/main/res/values/strings.xml @@ -0,0 +1,23 @@ + + + + + Select a Color + Presets + Custom + Select + Transparency + \ No newline at end of file diff --git a/modules/color-picker/src/main/res/values/styles.xml b/modules/color-picker/src/main/res/values/styles.xml new file mode 100644 index 00000000..77f9c8de --- /dev/null +++ b/modules/color-picker/src/main/res/values/styles.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/jieba-analysis/LICENSE b/modules/jieba-analysis/LICENSE similarity index 100% rename from jieba-analysis/LICENSE rename to modules/jieba-analysis/LICENSE diff --git a/jieba-analysis/README.md b/modules/jieba-analysis/README.md similarity index 100% rename from jieba-analysis/README.md rename to modules/jieba-analysis/README.md diff --git a/jieba-analysis/build.gradle b/modules/jieba-analysis/build.gradle similarity index 100% rename from jieba-analysis/build.gradle rename to modules/jieba-analysis/build.gradle diff --git a/jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip b/modules/jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip similarity index 100% rename from jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip rename to modules/jieba-analysis/src/main/assets/dict-chinese-chars.db.gzip diff --git a/jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip b/modules/jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip similarity index 100% rename from jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip rename to modules/jieba-analysis/src/main/assets/dict-chinese-phrases.db.gzip diff --git a/jieba-analysis/src/main/assets/dict-chinese-words.db.gzip b/modules/jieba-analysis/src/main/assets/dict-chinese-words.db.gzip similarity index 100% rename from jieba-analysis/src/main/assets/dict-chinese-words.db.gzip rename to modules/jieba-analysis/src/main/assets/dict-chinese-words.db.gzip diff --git a/jieba-analysis/src/main/assets/prob_emit.txt b/modules/jieba-analysis/src/main/assets/prob_emit.txt similarity index 100% rename from jieba-analysis/src/main/assets/prob_emit.txt rename to modules/jieba-analysis/src/main/assets/prob_emit.txt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharacterUtil.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharacterUtil.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharacterUtil.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharacterUtil.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharsDictionaryDatabase.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharsDictionaryDatabase.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharsDictionaryDatabase.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/CharsDictionaryDatabase.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictSegment.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictSegment.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictSegment.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictSegment.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictionaryDatabase.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictionaryDatabase.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictionaryDatabase.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/DictionaryDatabase.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Hit.java b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Hit.java similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/Hit.java rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Hit.java diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/JiebaSegmenter.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Log.java b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Log.java similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/Log.java rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Log.java diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Node.java b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Node.java similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/Node.java rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Node.java diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Pair.java b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Pair.java similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/Pair.java rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/Pair.java diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/PhrasesDictionaryDatabase.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/PhrasesDictionaryDatabase.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/PhrasesDictionaryDatabase.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/PhrasesDictionaryDatabase.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/SegToken.java b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/SegToken.java similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/SegToken.java rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/SegToken.java diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionary.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionary.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionary.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionary.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionaryDatabase.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionaryDatabase.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionaryDatabase.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/WordDictionaryDatabase.kt diff --git a/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt b/modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt similarity index 100% rename from jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt rename to modules/jieba-analysis/src/main/java/com/huaban/analysis/jieba/viterbi/FinalSeg.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index be05fe9a..ad0865f9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,7 +27,8 @@ private val modules = listOf( "jieba-analysis", - "apksigner", + "apk-signer", + "color-picker", ) private val libs = listOf( @@ -58,7 +59,7 @@ include( ) modules.forEach { - project(":modules:$it").projectDir = file(it) + project(":modules:$it").projectDir = File("modules", it) } pluginManagement { diff --git a/version.properties b/version.properties index b56c1a7b..a1eb73dd 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ -#Tue Mar 25 00:54:41 CST 2025 -BUILD_TIME=1742835281518 +#Tue Mar 25 22:54:07 CST 2025 +BUILD_TIME=1742914447380 COMPILE_SDK_VERSION=35 JAVA_VERSION=23 JAVA_VERSION_MIN_RADICAL=0 @@ -17,6 +17,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 TARGET_SDK_VERSION=35 TARGET_SDK_VERSION_INRT=29 -VERSION_BUILD=3053 +VERSION_BUILD=3057 VERSION_NAME=6.6.2 Alpha5 VSCODE_EXT_REQUIRED_VERSION=1.0.8