From c1051b5a333cd752011332a73a490d97899641c1 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Thu, 1 Aug 2024 22:19:31 +0300 Subject: [PATCH 01/46] Update README.md (APK verification added) --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 528ab3d3..b779f308 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,22 @@ _Currently the app is only available on Github, Fdroid is coming.._ - _Install from Github_: Click on the "Get it on GitHub" badge above, scroll down and download **book-story.apk** or download the last apk from GitHub [here](https://github.com/Acclorite/book-story/releases/latest/download/book-story.apk). After that, find downloaded file and install it. If you don't understand how to do so, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). - _Install from F-Droid_: Coming soon... +### 🗳️ APK Verification + - _APK Verification is an important step to ensure APK integrity and prevent risks from getting infected one._ + - Although it is recommended to verify APK before installing, it is not necessary. + +| APK SHA-256 certificate | +|-------------------------------------------------------------------| +| a661a0c81f138e53dff32f8fdc1dd19f8130523914027e2c0296fe245131a7d4 | + + - For verification you can use tool called [apksigner](https://developer.android.com/tools/apksigner). Which is the part of Android SDK Build Tools, so you need to install that first. + +To verify downloaded APK, you can write this command: +``` +path/to/android/build/tools/apksigner verify --print-certs path/to/downloaded/apk/file.apk +``` +In `Signer #1 certificate SHA-256 digest:` you should see exact certificate written in the table above. This way you can ensure, that the APK was signed directly by me. If the downloaded APK's certificate does not match, or gives an error, please do not install that APK, instead, create an [Issue](https://github.com/Acclorite/book-story/issues) along with downloaded APK. + ### 🧭 Afterwards - Open the app and follow basic instructions. - If you don't understand how to use the app, please read everything in the app's Help Screen. (You can find it in: Library, History, Browse → Three Dots → Help) From 309d780b079c7e5449aa999a306b4e160ee32ad7 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 17:48:18 +0300 Subject: [PATCH 02/46] Enabled Minify. --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c7140321..e43a8bcd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -41,7 +41,7 @@ android { } getByName("release") { - isMinifyEnabled = false + isMinifyEnabled = true // Enabling minify, test of reproducibility isShrinkResources = false proguardFiles( From 2a5e0e0f4aceda8b9c73c9b0704126c99386c3f5 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 18:31:21 +0300 Subject: [PATCH 03/46] Additional rules in "proguard-rules.pro". --- app/build.gradle.kts | 1 - app/proguard-rules.pro | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e43a8bcd..fa3321ef 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -140,7 +140,6 @@ dependencies { exclude("org.slf4j") exclude("xmlpull") } - implementation("org.slf4j:slf4j-android:latest.release") implementation("org.jsoup:jsoup:latest.release") // Fb2 parser diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index b9504bba..9ed70600 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -32,6 +32,9 @@ -dontwarn javax.lang.model.util.Types -dontwarn javax.tools.Diagnostic$Kind -dontwarn org.kxml2.io.** +-dontwarn android.content.res.** +-dontwarn org.slf4j.Logger +-dontwarn org.slf4j.LoggerFactory -keep class com.mikepenz.aboutlibraries.** { *; } -keep class org.xmlpull.** { *; } From 5a8f4d6e4359a87f730a920e7b1b26893ae76cf1 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 19:03:16 +0300 Subject: [PATCH 04/46] No classes are kept (proguard-rules.pro). --- app/proguard-rules.pro | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 9ed70600..2ac75832 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -36,9 +36,5 @@ -dontwarn org.slf4j.Logger -dontwarn org.slf4j.LoggerFactory --keep class com.mikepenz.aboutlibraries.** { *; } --keep class org.xmlpull.** { *; } --keepclassmembers class org.xmlpull.** { *; } - # Debug rule #-keepnames class ** { *; } From bf890fca6231d744356f3764345a31b2a91b4f9e Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 19:24:58 +0300 Subject: [PATCH 05/46] Changed proguard-rules.pro. --- app/build.gradle.kts | 5 +---- app/proguard-rules.pro | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fa3321ef..1cfc500b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,10 +44,7 @@ android { isMinifyEnabled = true // Enabling minify, test of reproducibility isShrinkResources = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) + proguardFiles("proguard-rules.pro") } } compileOptions { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 2ac75832..4cec6005 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,5 +1,5 @@ # Proguard-rules --dontwarn org.xmlpull.v1.** +-dontwarn android.content.res.** -dontwarn com.gemalto.jp2.JP2Decoder -dontwarn com.google.auto.service.AutoService -dontwarn javax.lang.model.SourceVersion @@ -31,10 +31,10 @@ -dontwarn javax.lang.model.util.SimpleTypeVisitor8 -dontwarn javax.lang.model.util.Types -dontwarn javax.tools.Diagnostic$Kind --dontwarn org.kxml2.io.** --dontwarn android.content.res.** +-dontwarn org.kxml2.io.KXml** -dontwarn org.slf4j.Logger -dontwarn org.slf4j.LoggerFactory +-dontwarn org.xmlpull.v1.XmlPullParserFactory # Debug rule #-keepnames class ** { *; } From 8cc0bf2947351638d5a2c1f2576aa9ef7561ff11 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 20:04:46 +0300 Subject: [PATCH 06/46] Keep All class names (proguard-rules.pro). --- app/proguard-rules.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 4cec6005..f0cb8a31 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -37,4 +37,4 @@ -dontwarn org.xmlpull.v1.XmlPullParserFactory # Debug rule -#-keepnames class ** { *; } +-keepnames class ** From 656dacb206cd7528029146491559ba5f71104691 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 20:29:33 +0300 Subject: [PATCH 07/46] Keep java.util class names (proguard-rules.pro). --- app/proguard-rules.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index f0cb8a31..cf17f063 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -36,5 +36,5 @@ -dontwarn org.slf4j.LoggerFactory -dontwarn org.xmlpull.v1.XmlPullParserFactory -# Debug rule --keepnames class ** +# Keeping names of classes that produce undeterministic results +-keepnames class java.util.* From d1962f77dbe30d7f9b4e213eb2447dcdc9db452c Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 20:44:11 +0300 Subject: [PATCH 08/46] Keep all class names (proguard-rules.pro) + ShrinkingEnabled. --- app/build.gradle.kts | 2 +- app/proguard-rules.pro | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1cfc500b..babcdedb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,7 +42,7 @@ android { getByName("release") { isMinifyEnabled = true // Enabling minify, test of reproducibility - isShrinkResources = false + isShrinkResources = true proguardFiles("proguard-rules.pro") } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index cf17f063..b7efb780 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -37,4 +37,4 @@ -dontwarn org.xmlpull.v1.XmlPullParserFactory # Keeping names of classes that produce undeterministic results --keepnames class java.util.* +-keepnames class ** From 7a405d1c1d669ed77f2e79512ad0610b179fac52 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 20:46:27 +0300 Subject: [PATCH 09/46] Disabled shrinkingResources. --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index babcdedb..6b4cf21c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -41,8 +41,8 @@ android { } getByName("release") { - isMinifyEnabled = true // Enabling minify, test of reproducibility - isShrinkResources = true + isMinifyEnabled = true + isShrinkResources = false proguardFiles("proguard-rules.pro") } From fd6a0913b8c08e2ca68380f47fb53308e7d07504 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 2 Aug 2024 21:16:17 +0300 Subject: [PATCH 10/46] Removed blank line. --- app/proguard-rules.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index b7efb780..c0af59e0 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -37,4 +37,4 @@ -dontwarn org.xmlpull.v1.XmlPullParserFactory # Keeping names of classes that produce undeterministic results --keepnames class ** +-keepnames class ** \ No newline at end of file From 0643ecd02221faf9ee809fa67b46a0debb8853ec Mon Sep 17 00:00:00 2001 From: acclorite Date: Sat, 3 Aug 2024 13:33:18 +0300 Subject: [PATCH 11/46] Tested reproducibility: success. --- app/build.gradle.kts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c7140321..0d279f5c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,5 @@ +import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties + plugins { id("com.android.application") id("org.jetbrains.kotlin.android") @@ -72,12 +74,7 @@ android { } aboutLibraries { - outputFileName = "aboutlibraries.json" - - gitHubApiToken = properties["github-key"] as? String - offlineMode = false - fetchRemoteLicense = true - fetchRemoteFunding = false + gitHubApiToken = gradleLocalProperties(rootDir, providers)["github-key"] as String filterVariants = arrayOf("debug", "release", "release-debug") excludeFields = arrayOf("generated", "funding", "description") From 9e446203557eec96c46c72c92d39ce4e4400c78a Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:30:31 +0300 Subject: [PATCH 12/46] Update README.md (Shorter APK verification step) --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b779f308..9a51a18e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ _You can find more screenshots in [assets](https://github.com/Acclorite/book-sto ## ✈️ Download - _Please note, that the app supports Android versions only from Android 8.0_ -
+
[Get it on GitHub](https://github.com/Acclorite/book-story/releases/latest)
@@ -40,20 +40,12 @@ _Currently the app is only available on Github, Fdroid is coming.._ ### 🗳️ APK Verification - _APK Verification is an important step to ensure APK integrity and prevent risks from getting infected one._ - - Although it is recommended to verify APK before installing, it is not necessary. + - For verification you can use tool called [apksigner](https://developer.android.com/tools/apksigner). Which is the part of Android SDK Build Tools, so you need to install that first. | APK SHA-256 certificate | |-------------------------------------------------------------------| | a661a0c81f138e53dff32f8fdc1dd19f8130523914027e2c0296fe245131a7d4 | - - For verification you can use tool called [apksigner](https://developer.android.com/tools/apksigner). Which is the part of Android SDK Build Tools, so you need to install that first. - -To verify downloaded APK, you can write this command: -``` -path/to/android/build/tools/apksigner verify --print-certs path/to/downloaded/apk/file.apk -``` -In `Signer #1 certificate SHA-256 digest:` you should see exact certificate written in the table above. This way you can ensure, that the APK was signed directly by me. If the downloaded APK's certificate does not match, or gives an error, please do not install that APK, instead, create an [Issue](https://github.com/Acclorite/book-story/issues) along with downloaded APK. - ### 🧭 Afterwards - Open the app and follow basic instructions. - If you don't understand how to use the app, please read everything in the app's Help Screen. (You can find it in: Library, History, Browse → Three Dots → Help) From f057a06069eac3105715f0b78865f2d75102a274 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:32:27 +0300 Subject: [PATCH 13/46] App icon for README --- assets/readme/app_iccon.png | Bin 0 -> 9247 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/readme/app_iccon.png diff --git a/assets/readme/app_iccon.png b/assets/readme/app_iccon.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a26f3f3112912fd27bd9b6150b244dc0fde4b9 GIT binary patch literal 9247 zcmeHt`9GBJ+xKP97NwGeR+2T!SYkq@5Ji`LnX)Ae+1D9S`iN4=APkkrShE{uLD?CZ zkQhsfjAaHR3^Vi0=YH;g;CX(!U-#>K{&JnKoha^5$I?=u@~Ks*WjjpV#0j^)Ca) zlI0BCOomQ9(z!ELM69~-`mNNoM9)y0LTFE@+&zQ51?YhuF=aJp-?xum7x`ZoJO1MF z^ylPd-Q?etY7b}B3BS?hmUNn^2ITMX%h1e_f%WaamJn&z>+=&K=y{e=3=h|l|Bpi4 zpQA^Ca zi$?mu>4DWA_&`6xLu5igd62U46!YUHbg_;2L3wb| z)}a%W2GHgY5k(kz(x{LvJ%6ARzh4)%7*xTR__W|QujQvZ6wREqIAiKR>ox-x4nIGJ3FyN)@rV)L>BcAP!-8E zX$f~5T5(#Fp8t`-8|#QCs6oez*%zYDYbW|m1Xu}xzBh8aI@1$r%hqQiweq3)mCYhQ zCow-VZw8&uAbvHr=CMq?P@*uGj75;F#2Hd!OM3mBLhM~@U6V*<{zNNkOe7Ohk@$sIlQ+r&m(l-hY zXKYW-MRg-Wu=LRzUug*Mo66-!9%a21wb^%6?!a98^&KHW+@AarOq%_0G1=sBJy6S= z#jm~Y#9SPz8Kq2Y79tuiPK~4J6A}XOYjNkq!`l1)IqnsMfW)Our!4S99uI4`j24qG z!&uKnpG8JED1DS3NC1MO*P9s)zXXvtK-bq5O>zrugo~8Waoa4Vw*mwg=7X-x#rli6 zhlumR>rT3sSt6E z@!_bYVHE@?kfwCzB3gfD_1iwP^@w57lluYuZTBpn^uY$NmH=BLnh5<_le%o}+GyiU ze)@*6oqf@7q*gnRb#PL0dfO zLSi=|w+YY2)no7{HriSz7z#H?Gd?zEOV%v9$=oTqZcY(AQka)Gyi#ob%|J!@}4>!9=}c4i968ot#1AVYjF6<`o>JF!%X)a!cX->U7~PP&JbUu z&ky^UC9qVz`QT{U%atxZy^I8wr^rsC@=|{P=QbrF3yBZNfvfIN2F{js zn5|-K=8~R+T-^9$?v%ld@}n*q`T|Q9l9924AzR7c4w?yWn2^IvQvxTlTlL3E*NU1> zLD|F?CN*C@6^1`lf z7Se%Z<@fyH$D3 z{5%TkI^yL|e-}DBX$QKalOM%sTMkMy=d}V0N=!)Z5q?N1F$^5qoclkGKRA+xpoOH~>-b?jx`L`@u5?{~D`7WGD-;N7qZ2PLHjoUV6kKH~W}N(!wn=W#$)8+; ziO$N6jct_6=)@vH)}4gbjMjtsxutrqiRZWai!35zl2R&2 zJAW4Xj<9EM14?-gI_H?onKxy7qi&pC_aomNlkY*Pi*2(m{d*PT^Lq4u=4h)oLU6ok&c>Q3Z^1h&)Nc|IAAEf5 zsY1H4e*5Js`!z4wOYdG!65Cm~FoGsq2rHci`c5SW+(_Zb);yw__@Yk_Rvue`ADyxV z-SgbyH;ZKH3;x>7++$Tgy@xUghBM0}VtkXi8OL-M?wkwg^85Kt{VyI~q@@T2sVT3&R|-*z+HkzNcG9^(UN zM*Q|5v`C|DkhSZJwi+#`#UDlZsDJ(1s>ko)`cKC#g2e7h-*?v90ebJLXuH7yhCT(Y z8Euc{u&XgfZ-f)=Bvi}6MD;OevQ(tAljryaF$W%396dsNsn)=hFTdw(LgMU2GuQ;Y zhy{14?E9Pt@e!k)@Q6%J&Yp;e_c*MNS4VZltgYHAGZKhDsgRYZ8}+}IWd)>*GY3&E zWrc_=rn9zZWMGmg^!2k&v`nY|9T#3AweX`#NZW|4O_zrC+b0jcDcr2pma?VwB6t^cXTD}H%zwrXSt^AJa6=vbr&b|)~qYTh`c z9^lnxcQuolHP_uT^=INrq*ttGVP6u6=KS%)3sk~skJEu&Wv=NvS&Ed&1GFxO4O-D4 zH0u*_)@>p4e0q6QW$(>t=k*8V!$x+xwzAdE%gZtY(e`uVhP5_fZNZbFJF}6^pICui zhr8jkk(Qt8gt7L8qB|>=hgu-LkN6*IP&>CPyMi%+T~2;Gv6=zQZ8#-ncX&Z~t6WU< zB4J{k4|NhK>v5Pw-%beZS#m92`Os&O|B63rJpJC$B=X*?hW)PmrDVRXj?m31 z^jqWJ?JV#4d32=Xkv8P3#3x4F&8nLIBvT7ul(64~Mzp9|Fe_ZzI8q&BAFi_-Jl%*f z>#OXmX(uLMU}t2>6l8hG#e03I^G`Pm@9b7s%1`D5JjtxJa=>tBw5Ou<58G{s^~{2S zY(15IBW1JNGI$4;Bw+Nq{Boyv^5FiME7T-f->)-L@xG4s@_4Ow*l4j;qf%Jgs|`u@ zD}X~r#Xx2EDT1^1Uy0r2>IMS~p~_zUnFz0Yus4u>PC4^C%isn@*n}t@=h*YPPUh@V z{UO9L98U`T6CZKgv0{CbJRFrQhlLsYX|Ke2h;T?g-t-XLEx+-Xb{qq(<|%&YmJREw zNkh>~x~$`s(4bF9`xF^KXTFFdQGMr$9W=E_v|Bc08XOhavQTF16#v;A?PqPbhHks- z3#JKmjA3#SJN;uv2;<&c4MLrJHJ*Oi186&r&;u5Rnuo_l270iTuPJXtrlpHLtu95h zb9}}+Mn@(!u^ZV(8}&BYD(#2cQ#N*-Q&+Y{$-g;?aCX%h?A!SKo}+KBE0{DFU=Y<9 zJgHw{;0IbPFK+(sK#tyMk5>$8GY*MWj{ovCK#obOv7IY)$~0e8h_WW?E!s)M1%h#A z(R>4AP5ki)=XQnuGB@Y#wx8METCK=zNzG(Ko~hd)^lkuD^$pxTuc6pK06L0f_^V`O zhi)RB!*#TCqz_GDQaLP3ou2GM$w9*vWZrQT*s4o@(&nhwKg(r#0gr>d;OxM)cWtkn z@^Tgky+cjctCS6;lLYSgE_E0FurGcaWH+D)_}^ID!m7IRqTKAKk*cPFvnv650{a~F zBfJi?pZ*pD8oYLAf;CiCOGmAV<~hSM@6WGDSooP9`59<5p46Hx7{4)Axpk;GthIX4 zYH)YtoJLIZ(6uVQGpab*>Sgvy&367k;fsMHf#CTjtBb%u50#&O!((?bhJ07;7Vp(y zvmT1fCU5Eyz`JIA3gRPpqDo6$VZA#n!r>r)FJ@eE%a42sdh)$s{4>3(UmJRZd=4`6 z;BddkZgT?(s#>{X#C~(MHtcHW{j?)My_fc@lxM8=r*HZNjc0p$jyWKlt8M;ZwVTYi zt>JTz2pet=4!1(a#Qj~$-TTNr@h|&4k?3)f=N|ZLpz8RO^cE)|{vaeB-S{Bvs_P5l zyM?{N(XL4gW>kU0rvaCjBb-ANPSsDW*4EQ=2$^qERa!b9-Xdl{s_biOimUHKK z8A%wIas&Y4SL@HV1NJ^v!~`XQ=lg*QMgkx4a#nZ8C3_!<{LH%OM?N*ZetQ9_*&j>N z!59oWs!7PuT!N@e(iH^Q_3%IJS7ZvoOc+?)y~_i;>)&016NUF1ngc-<5Ww69RyuUQ8d4Ly$}Xmwb}Fbeeh9BhS3} zuexG7Abl~{g6rkNNdUN%h|K`z)flw`Tzgic=mBK_ATqLhH>&vo;NHI);`;%hz?jRc z&tK!}2nqwh;4yCJM^62#{GXTpGX?+I1^?SVg!t}SxR}C*u94!j*B(GK+s!a3joEQ7 zQjGWyKagb^sL*c4iu0f!j^8KDZN=AN)D_;FO&X#C6%spnQm+AAeH;c6nkv67VLv=_ zF7oJq>A6g~gAu8%?+Myz0$Im+0n3W@QmPMGw#o);$01-a{gY;zj$HfxNF~VhunJuj z%bYDPrK(MuYDRIzv9ymEaJwiD z(Q`il(+~C9=BB`)_QPrxTd8g!NO*B@kM^X2W|Q6B2}uY2sav4C9Y}BiX=Rwi6b3ZR zP;@Fo{2%xxv-Ou00Ao(rfe^3Y$z}|d0&XxIje12(sf(plzf!77%^Hx!%N;=R3Je|i z5d-lWB}#z9aobyCqHpec*74sG$lMMT@MZ zf#>RsGA@p087XaWAvFf;3P@-$%DCv?iF*LR-sQTa9*;M53jwmuD23q4Zt)Tm41{?A zkNH1$`Qu4mI>!M`Hg=WcQ%e2ZBp6RZb0c}c<9+ig6z{+TYen({hf4uE-gdf*= z%hZZdcGDLJ0lFtBw~FP4C4c6YaaD(TrWeSplK{~n3VzOxC$v~tj)CRnHiiQe4TpIO zaxT-OD)j)%M-}tz8M4}p!f7D1Mi}a$0RV?%ltM^|-B5|p*T5iUi!)(!i7TVz;<$;z z{Y3plGSCdrQ%B{14kw5whrJ}&Sa6Gv$W1=`wgZ4>J$8i?gP~SljfyWdi#J4IO1Tzg z2d6k=Lo_LEjvBbqxt^fVCyMaAS+!$Ad6FnC^teUkGdD(Mx===CG1T2yWPlM(CBf)G z-(LJmyD2AP6mtM}z5j!%LU-qEq89Rg(0dw`hMc>HsHo)ID?v@EK{PA@%;M~0bxD5=MrFTby)vV!fF;Z%6{$y_%7^A)3n~@xFRl{V-y~EV zmCEE_v+zQnO8L~U;i}Y-lL85)80ssR@s@*!hRsT;_5+?3liA^8;Zi&tGmvr{w6C04 z&(&p#YGul@luD_Sp`#P|cC3fSnQ{3)I>Uy%pnddMJo{UV?9Pt^D=D`7TryC^fmozz zLTf$$V+;E~QABgS7qZb)(a7WZG>bU;_5@>dZvDM)2`TjsF6abqA4wb!DU)C}2~ciu zdcN^x7Fm6Nnbh`WdlGdpa+h4ND8nq_Z+n^N3uN{3CvpL!({hi?VD|wkX+B!3MjQGf zZKrcr5m}T(n!Sgn;X|bm_a-m5*ZInX9$!nsM4Ltn>xj*rD9cYR7B3FFuW3Dhsiz}O zcp%@>aCHf$OZ!}KT$6KZ~vu0CJJc_(vEsjII%tke$6qq98a4?gSDS! zM`ma@-Xpx>qu?eQ!$g7`$&cb^|5`Z=e%(d?_0shOMc5w_yNg^iXDS$nT-1WJI+!T7 zQuW@Qnb4GoJDXo!iYa;Jw?Yy@Q4Me1LRm%Dv%b@jSEA80^J9${AHrPUKZL2%iYvxB z_N4H=T}`UvRJTH84m?kx1Y;O=&M8RCW7_o%C#V8iju9gBO&1}hT@l2Sh zIKcK>+pcd_oqd+RbvgS8sYrgyCA!uK1!p1rIo}E*ZsLNxtv+;am$v4&Fb|VE%*Z+4F0@U>sMAVATpQw47v5X6K;6K={>Xva)79)}TP}!I1*=iE zk`_AR_Ke&4ki>I??-v57^VYffIh@DB{FUbPB_(Ni-m58|SwD52jmNROH_y(*4Amj~ z{2Dx&*qLpY&Amwy%`*uETd<*cl%CM)rbynu=Xvq))Z+q97WzX-^a{5b<5NRh;bM%g-|I zU_x6Qj6=>vzztBVv`sI&O$pC3@7_nJs@VMu6Oq4^DAPFA*=QBqU$h3bL2o7Vy5WoX zk%LTGDgN*eKGRA3Jn2cgvc)zE6Zz`w6>pA@ZxsH8oAE~5)}Mw8Y?q2Da~hF58m!ns zm(0mF^)q6SE3%z2x2Jy6bf$M`zV{U5W@yj+mFwZl^3w`M1zZeX9)rL-3oN`(pZ(R; zI-EA6U~WHzPn|-Zsu@x^k~(z`pCt7}{#xdDit@B;=5&r$Aj}6V0EtqQY3;V0jycsH zi+r_dPbjp9a6ENiPG)cZdUL~?C@#zoDS|hurl&QCC5fR7BpG32pU&$l^u#e5q;xY2 zpZF?o!jb3Zg<6z6>YHmi)&~l!$`i})*-N0J`^D?amK*YOWtVax5C>Z$gYS!oKV2<( z>sG%qnf}lQ{z|hxeR^mUBCn zPIrWcC8TJ#QLgMLlrO317S?d14Q;IPGovXmz@bghZ)$PZQjv_jn6`*!m?$_=Hz$IR zP6prAyt+Q=wZ)mUUlIw(VXE0EToLn@q zWEgT@;#c$^f1RQ1P;z8+j;s+5vC;8TY-1u{@2tJIK&$w6Y(%sOL!@>#2)hl<%Rv$_ z^I!RSDZ7@2oee`zr4nlikaPnLa}8o%wuWZzvCpCUFDAPxGB|Ai@9UvhcHLj!r@*C@ zq|!Y`hTq3$>ieV`4Hy3rc)0LDb+$~QD|j+SYlQPId$-mcDDYyP$}QG9Pyd?AhX|V! znRqSJW?9jc`}%LI3o^HYV>+@z*5?86AKi_sppeuL<-OAY!1v?dy8!Te(`sXuzpnaZ zS{Jg$-t8DV_B3c{SA?yTTlNFf7Ds#6264X1Y{$7hu>pS%-SqBok62palw&w=-11oU zi%A+Ev=TLjHTFfHN^duM-NYN%C&OR)V1?+Q|9aU5dAzl}?tS=7>K>q~YS!17Z3S1a ztiS}C2NElmPK{7+eV>J?tFhrWQyShoqlx7l8`uF}Ahjs}WKcwX>Pme*n|U;$PAO(j z-pKjkf$537zMhBqy$i1H zdV6>cUe{cCaAt7}sn+@4X+UWH+86$m`P=o`tlt>svs?&0fSb(D$P*y-e9Gv@XM{^tlCC2jpeA=Edbo<@)W|8M3}}+q(&AjoRnt1o{>IsmtyS zJ2uNCWGrVW1kXOnI1Ugab#qVpL2rW2!3S2kOjb@xp8xr8)yMGm!cB0vSzCFnDj?>L z7ng^+VY`F4>%{5P`|Iusa%wSfbb;v;CSNrBtQu>x@B=bbOkP%!yUvvwo|QYzHE##G zQCfte==1T54_Atih1`1$tKEe3PFAhl4(uY=;3QUd(H7ju*K(xSTONwFeSXp?P#{wh zZGLUr-)Tpo`*Vj-h*rKVH1!-0pxEvb-m!=!bE+`)_QPS^LmtHG81hNm4|nv*I6S?n znF-&G8=I-}o8epuUl`|xSK9Rw>Bd}^u9ca=XZ;&%fCF+c)HV!O(MNJ3OFkiQyJp>H z(nl*+6QXgdPuvLI$9Zr@ZQD#cgu}&YPtfpHlt`yPNi^MpYa{%uAJyHmcXu)u)u3J~ zT>tBG+Y0uW`=)_}JV|_)KAnVz<}37Xx?4gxtE!`9>=R|~#D-?~K5J>-Yd7o>6|S9F s3V}4b-R~my%X5j+|9gqQatq`r>@$20n3ihw{HuTciq+)`6IjCk0o?F)jQ{`u literal 0 HcmV?d00001 From af67ddc75b8c6f9c553e3b0e3606adc96ad79609 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:33:31 +0300 Subject: [PATCH 14/46] Rename app_iccon.png to app_icon.png (typo) --- assets/readme/{app_iccon.png => app_icon.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/readme/{app_iccon.png => app_icon.png} (100%) diff --git a/assets/readme/app_iccon.png b/assets/readme/app_icon.png similarity index 100% rename from assets/readme/app_iccon.png rename to assets/readme/app_icon.png From 8824215c3450a2d14bb42795853b7b4f79e7fe38 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:19:02 +0300 Subject: [PATCH 15/46] Update README.md (New badges, more..) --- README.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9a51a18e..f937dad5 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,25 @@ -#

Book's Story 📖

+
+ + +
+ +#

Book's Story

+###

Material3 Book Reader for Android

+

Dive into the world of adventure as you discover your favorite book's story!

- [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) - [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=0273b3&label=Downloads&logo=GitHub)]() + [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) + [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() + [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=%23f8e444&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) + [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) + [![License: GPL-3.0](https://img.shields.io/github/license/Acclorite/book-story?label=License&labelColor=27303D&color=3f9b75)](/LICENSE)
+#

Overview

+ -Material3 Book Reader built with Jetpack Compose and Kotlin. +Built using Jetpack Compose and Kotlin. ## 🖌️ Screenshots + GIF From d2db83708e07d90bbfade93e33aaad1d2967e731 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:28:35 +0300 Subject: [PATCH 16/46] Update README.md (Smaller app icon) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f937dad5..00db3bb0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- +
#

Book's Story

From 9f71e5e7fdcc553153f90e0307da6ce4325b1433 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:30:41 +0300 Subject: [PATCH 17/46] Update README.md (Static width for app icon) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 00db3bb0..0f57a739 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- +
#

Book's Story

From 5fcb224d34fdf8ec0c687bb329f416b6ec26aa10 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:48:00 +0300 Subject: [PATCH 18/46] Update README.md (Badges update) --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f57a739..f25d7cde 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + +
@@ -7,20 +9,28 @@ ###

Material3 Book Reader for Android

Dive into the world of adventure as you discover your favorite book's story!

+ +
[![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() - [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=%23f8e444&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) + [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=949b3f&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) + [![Last Commit](https://img.shields.io/github/last-commit/Acclorite/book-story?label=Last%20commit&labelColor=27303D&color=749b3f)](https://github.com/Acclorite/book-story/commits/) [![License: GPL-3.0](https://img.shields.io/github/license/Acclorite/book-story?label=License&labelColor=27303D&color=3f9b75)](/LICENSE) + [![Repository Size](https://img.shields.io/github/repo-size/Acclorite/book-story?label=Repository%20size&labelColor=27303D&color=563f9b)]()
+ + #

Overview

Built using Jetpack Compose and Kotlin. + + ## 🖌️ Screenshots + GIF @@ -36,6 +46,8 @@ Built using Jetpack Compose and Kotlin. _You can find more screenshots in [assets](https://github.com/Acclorite/book-story/tree/master/assets) folder._ + + ## ✈️ Download - _Please note, that the app supports Android versions only from Android 8.0_ @@ -63,6 +75,7 @@ _Currently the app is only available on Github, Fdroid is coming.._ - If you don't understand how to use the app, please read everything in the app's Help Screen. (You can find it in: Library, History, Browse → Three Dots → Help) - If you still have questions, please feel free to ask in [Discussions](https://github.com/Acclorite/book-story/discussions/categories/q-a), or create an [Issue](https://github.com/Acclorite/book-story/issues) if you feel like some area should be documented better. + ## ✨ Features - 4 supported file formats(.pdf, .txt, .epub, .fb2) @@ -81,13 +94,19 @@ _Currently the app is only available on Github, Fdroid is coming.._ - Detailed app functions explanation(Help screen tips) - More.. + + ## 😵‍💫 Upcoming features / Roadmap - _You can track project's progress, see what's coming and what is already implemented in [Book's Story: Development Roadmap](https://github.com/users/Acclorite/projects/1)._ + + ## 🌐 Translation - English (Default) - Ukrainian (Default) + + ## 🤗 Credits - [Tachiyomi (Mihon)](https://github.com/mihonapp/mihon) (Github) - [Libre-Sudoku](https://github.com/kaajjo/Libre-Sudoku) (Github) From d5764e4c742ea98c0e1088d91bcbbc985574a363 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:48:35 +0300 Subject: [PATCH 19/46] Update README.md (Badges line break) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f25d7cde..3797449b 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=949b3f&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) +
[![Last Commit](https://img.shields.io/github/last-commit/Acclorite/book-story?label=Last%20commit&labelColor=27303D&color=749b3f)](https://github.com/Acclorite/book-story/commits/) [![License: GPL-3.0](https://img.shields.io/github/license/Acclorite/book-story?label=License&labelColor=27303D&color=3f9b75)](/LICENSE) [![Repository Size](https://img.shields.io/github/repo-size/Acclorite/book-story?label=Repository%20size&labelColor=27303D&color=563f9b)]() From 56c12ee0ccd422edc84145f5bb3444a73431da01 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 12:50:55 +0300 Subject: [PATCH 20/46] Update README.md (Removed line break) --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 3797449b..f25d7cde 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=949b3f&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) -
[![Last Commit](https://img.shields.io/github/last-commit/Acclorite/book-story?label=Last%20commit&labelColor=27303D&color=749b3f)](https://github.com/Acclorite/book-story/commits/) [![License: GPL-3.0](https://img.shields.io/github/license/Acclorite/book-story?label=License&labelColor=27303D&color=3f9b75)](/LICENSE) [![Repository Size](https://img.shields.io/github/repo-size/Acclorite/book-story?label=Repository%20size&labelColor=27303D&color=563f9b)]() From 50b51f8a88d553631de19ba4e8a7824505719f58 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:01:48 +0300 Subject: [PATCH 21/46] Update README.md (Added IzzyOnDroid guide) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f25d7cde..308dd206 100644 --- a/README.md +++ b/README.md @@ -54,13 +54,15 @@ _You can find more screenshots in [assets](https://github.com/Acclorite/book-sto
[Get it on GitHub](https://github.com/Acclorite/book-story/releases/latest) + [Get it on IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/ua.acclorite.book_story)
-_Currently the app is only available on Github, Fdroid is coming.._ +_Fdroid is coming.._ ### 📲 How to download and install - _Install from Github_: Click on the "Get it on GitHub" badge above, scroll down and download **book-story.apk** or download the last apk from GitHub [here](https://github.com/Acclorite/book-story/releases/latest/download/book-story.apk). After that, find downloaded file and install it. If you don't understand how to do so, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). - _Install from F-Droid_: Coming soon... + - _Install from IzzyOnDroid_: Click on the "Get it on IzzyOnDroid" badge above, scroll down and click "Download" to download the last apk from IzzyOnDroid. After that, find downloaded file and install it. If you don't understand how to do so, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). ### 🗳️ APK Verification - _APK Verification is an important step to ensure APK integrity and prevent risks from getting infected one._ From ba5b6288da1f3585c0e9e28b7f39d51453aa34e2 Mon Sep 17 00:00:00 2001 From: acclorite Date: Tue, 6 Aug 2024 22:09:40 +0300 Subject: [PATCH 22/46] Removed dependencies info (build.gradle.kts). --- app/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c7140321..463aab6c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -63,6 +63,10 @@ android { composeOptions { kotlinCompilerExtensionVersion = "1.5.7" } + dependenciesInfo { + includeInApk = false + includeInBundle = false + } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" From 4914f1785311944f0856a3f233c9bebfa44b7793 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:50:09 +0300 Subject: [PATCH 23/46] Update README.md (Added IzzyOnDroid badge) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 308dd206..7d1d5f01 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,10 @@
+ [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) + [![IzzyOnDroid Release](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/ua.acclorite.book_story&labelColor=27303D&color=3f9b84&label=IzzyOnDroid&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAADAFBMVEUA0////wAA0v8A0v8A0////wD//wAFz/QA0/8A0/8A0/8A0/8A0v///wAA0/8A0/8A0/8A0/8A0//8/gEA0/8A0/8B0/4A0/8A0/8A0/+j5QGAwwIA0//C9yEA0/8A0/8A0/8A0/8A0/8A0/+n4SAA0/8A0/8A0/+o6gCw3lKt7QCv5SC+422b3wC19AC36zAA0/+d1yMA0/8A0/+W2gEA0/+w8ACz8gCKzgG7+QC+9CFLfwkA0/8A0////wAA0/8A0/8A0/8A0/+f2xym3iuHxCGq5BoA1P+m2joI0vONyiCz3mLO7oYA0/8M1Piq3Ei78CbB8EPe8LLj9Ly751G77zWQ1AC96UYC0fi37CL//wAA0/8A0////wD//wCp3jcA0/+j3SGj2i/I72Sx4zHE8FLB8zak1kYeycDI6nRl3qEA0/7V7psA0v6WzTa95mGi2RvB5XkPy9zH5YJ3uwGV1yxVihRLiwdxtQ1ZkAf//wD//wD//wD//wD//wCn5gf//wD//wD//wD//wD//wAA0/+h4A3R6p8A0/+X1w565OD6/ARg237n9csz2vPz+gNt37V/vifO8HW68B/L6ZOCwxXY8KRQsWRzhExAtG/E612a1Rd/pTBpmR9qjysduKVhmxF9mTY51aUozK+CsDSA52T//wD//wAA0////wD//wBJ1JRRxFWjzlxDyXRc0pGT1wCG0CWB3VGUzSTh8h6c0TSr5CCJ5FFxvl6s4H3m8xML0/DA5CvK51EX1N+Y2gSt4Dag3ChE3fax2ki68yO57NF10FRZnUPl88eJxhuCxgCz5EOLwEGf1DFutmahzGW98x0W1PGk3R154MHE6bOn69qv3gy92oG90o+Hn07B7rhCmiyMwECv1nO+0pQfwrCo57xF2daXsVhKrEdenQAduaee1Bsjr42z5D9RoCXy+QNovXpy2Z5MtWDO/TiSukaF3UtE1K6j3B4YwLc5wXlzpyIK0u5zy3uJqg4pu5RTpkZmpVKyAP8A0wBHcExHcEyBUSeEAAABAHRSTlP///9F9wjAAxD7FCEGzBjd08QyEL39abMd6///8P/ZWAnipIv/cC6B//7////////L/1Dz/0D///////86/vYnquY3/v///5T//v///17///////////////84S3QNB/8L/////////////7r/////NP////9l/////wPD4yis/x7Ym2lWSP+em////0n////////v///////////////////7//7pdGN3Urr6/+v/6aT////+//H/o2P/1v+7r7jp4PM/3p4g////g///K///481LxO///v////9w////8v/////9/p3J///a+P9v/5KR/+n///+p/xf//8P//wAAe7FyaAAABCZJREFUSMdj+E8iYKBUgwIHnwQ3N7cEHxcH+///VayoAE0Dh41qR7aBnCIQ8MsJKHH9/99czYYMWlA0cIkJGjMgAKfq//9RNYzIgLcBWYOTiCgDMhDn+B9bh6LebiWyH6L5UZQzONoAHWSHoqEpDkkDsyKqelv1//9rG1HUN9YihZK9AKp6BkG+/6xNqA5ajhSsCkrIipmYGGRa//9vQXVQXSySBnkWJOUMfn5Myuz/G3hR1NdEIUUchwiy+bkTsg4dbW/fu6W/e1c3XMMy5JiOZkFxUFZo74mgKTqaKXu0+2HqVwkja3BH9kFu361JwcHTfPJD4mdfe8ULAdVRyGlJAcVFfg+CQOozZ4XrJ85+JgwBsVXIGriQw5Tp4ZScezd8JiWnBupru30qwJZa+ZAjmWlC8fUZM4qB6kPnLNSPLMWqQQ5ZQ5aOzs1HmamBaQHzFs6y+qAmJCTE8f9/QgKSBg4DJPWc6zVDQkIC09JkZSPD38kukpExFpT4z67uYI/QwCOOCCK/izvu5CWl6AcEWMnKWml7LWbKZfH9/99UkknQHhGsynDz+65eWXv3/JmJrq5eXienVlRUfH/z8VvCf45soKQIH1yDEQsszrp6gwq9C73T87xcXadKl5TkFev4A/2tygmSBqYXqAYJmK+ZuoJydDR1vP09DA0NOy2kpdML81+U/heCpH1JU3jig7lJ5nKOT4i/t6ZHkqGzs4lJmIVHfrj+JR4HqLQSD0yDkCNEpGNn5ix9D03/eJdElTZdKV2TpNOhkwt8YUlNUgimgV0dLMBvf1gz1MolPd5FRcVNSkpDQ8owJeBCDyIhrIDnOD5QcuIU+3/2QKSs9laQ+noNLS0zLWdtqyP7mBAFAw88TwsJgMuJYweBGjYngtWbmeuZOW+bvNQToUFOAlFqOBk4Ov3/L7Z60/aN0p1tUhpa5nqWlub7C3p2I9QzyAghlUvczOz/1fhzPT3XSIfpSmmYAdVbmm1gV0dSz8DSilpUQsqCddIWIA3meuZaJqdMJZEzl6gRqgZIWZAxUdoizERXN8yi5MltcZTChzMaRQM3JNUWHS8rL/+yaPGvMmvr5ywoGoxtkDWwQ+Pb89ycBeWfGSJeL/la+RS1eOPnRtbQKgMRjZg+t8x6PkP273nWQAoFOPAgaeAThKXAmXMrK39Kmr5fsuBlBqoXfJGLe3VbmHjG9Mczi9T//3h7vygXtcDlQtJg44iQiIjIBRbGPO7gghPJy0ZIxT2HOLIUgwxQzsgYrUR350HSIMaJLidhgKY+mw+pflBDrX8E7OGBjPCAPc76gQFSTqAIiYrb/8dRP4CyosJ/rmwU5XIxHMilt4QBJwsSkBMClxOQULBlkRRwEONmR2kJcDGjADX2/+xO8r5iqjExqmLyrWpcPFRta1BfAwCtyN3XpuJ4RgAAAABJRU5ErkJggg== +)](https://github.com/Acclorite/book-story/releases) [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=949b3f&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) From 172feea2be5dd2df2357888219ede76dd54ba966 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 00:18:47 +0300 Subject: [PATCH 24/46] AndroidManifest.xml: bigHeap=true. (Fixes OutOfMemory Exception with extra large books) --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2e021fc..25d294b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,6 +43,7 @@ android:requestLegacyExternalStorage="true" android:enableOnBackInvokedCallback="true" android:usesCleartextTraffic="false" + android:largeHeap="true" tools:targetApi="tiramisu" tools:ignore="DataExtractionRules"> From 746da36203f26d9ebf5856bb82bb787c6f18f550 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Wed, 7 Aug 2024 00:40:04 +0300 Subject: [PATCH 25/46] Update README.md (IzzyOnDroid badge points at IzzyOnDroid app's page) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d1d5f01..a2b63dcf 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) [![IzzyOnDroid Release](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/ua.acclorite.book_story&labelColor=27303D&color=3f9b84&label=IzzyOnDroid&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAADAFBMVEUA0////wAA0v8A0v8A0////wD//wAFz/QA0/8A0/8A0/8A0/8A0v///wAA0/8A0/8A0/8A0/8A0//8/gEA0/8A0/8B0/4A0/8A0/8A0/+j5QGAwwIA0//C9yEA0/8A0/8A0/8A0/8A0/8A0/+n4SAA0/8A0/8A0/+o6gCw3lKt7QCv5SC+422b3wC19AC36zAA0/+d1yMA0/8A0/+W2gEA0/+w8ACz8gCKzgG7+QC+9CFLfwkA0/8A0////wAA0/8A0/8A0/8A0/+f2xym3iuHxCGq5BoA1P+m2joI0vONyiCz3mLO7oYA0/8M1Piq3Ei78CbB8EPe8LLj9Ly751G77zWQ1AC96UYC0fi37CL//wAA0/8A0////wD//wCp3jcA0/+j3SGj2i/I72Sx4zHE8FLB8zak1kYeycDI6nRl3qEA0/7V7psA0v6WzTa95mGi2RvB5XkPy9zH5YJ3uwGV1yxVihRLiwdxtQ1ZkAf//wD//wD//wD//wD//wCn5gf//wD//wD//wD//wD//wAA0/+h4A3R6p8A0/+X1w565OD6/ARg237n9csz2vPz+gNt37V/vifO8HW68B/L6ZOCwxXY8KRQsWRzhExAtG/E612a1Rd/pTBpmR9qjysduKVhmxF9mTY51aUozK+CsDSA52T//wD//wAA0////wD//wBJ1JRRxFWjzlxDyXRc0pGT1wCG0CWB3VGUzSTh8h6c0TSr5CCJ5FFxvl6s4H3m8xML0/DA5CvK51EX1N+Y2gSt4Dag3ChE3fax2ki68yO57NF10FRZnUPl88eJxhuCxgCz5EOLwEGf1DFutmahzGW98x0W1PGk3R154MHE6bOn69qv3gy92oG90o+Hn07B7rhCmiyMwECv1nO+0pQfwrCo57xF2daXsVhKrEdenQAduaee1Bsjr42z5D9RoCXy+QNovXpy2Z5MtWDO/TiSukaF3UtE1K6j3B4YwLc5wXlzpyIK0u5zy3uJqg4pu5RTpkZmpVKyAP8A0wBHcExHcEyBUSeEAAABAHRSTlP///9F9wjAAxD7FCEGzBjd08QyEL39abMd6///8P/ZWAnipIv/cC6B//7////////L/1Dz/0D///////86/vYnquY3/v///5T//v///17///////////////84S3QNB/8L/////////////7r/////NP////9l/////wPD4yis/x7Ym2lWSP+em////0n////////v///////////////////7//7pdGN3Urr6/+v/6aT////+//H/o2P/1v+7r7jp4PM/3p4g////g///K///481LxO///v////9w////8v/////9/p3J///a+P9v/5KR/+n///+p/xf//8P//wAAe7FyaAAABCZJREFUSMdj+E8iYKBUgwIHnwQ3N7cEHxcH+///VayoAE0Dh41qR7aBnCIQ8MsJKHH9/99czYYMWlA0cIkJGjMgAKfq//9RNYzIgLcBWYOTiCgDMhDn+B9bh6LebiWyH6L5UZQzONoAHWSHoqEpDkkDsyKqelv1//9rG1HUN9YihZK9AKp6BkG+/6xNqA5ajhSsCkrIipmYGGRa//9vQXVQXSySBnkWJOUMfn5Myuz/G3hR1NdEIUUchwiy+bkTsg4dbW/fu6W/e1c3XMMy5JiOZkFxUFZo74mgKTqaKXu0+2HqVwkja3BH9kFu361JwcHTfPJD4mdfe8ULAdVRyGlJAcVFfg+CQOozZ4XrJ85+JgwBsVXIGriQw5Tp4ZScezd8JiWnBupru30qwJZa+ZAjmWlC8fUZM4qB6kPnLNSPLMWqQQ5ZQ5aOzs1HmamBaQHzFs6y+qAmJCTE8f9/QgKSBg4DJPWc6zVDQkIC09JkZSPD38kukpExFpT4z67uYI/QwCOOCCK/izvu5CWl6AcEWMnKWml7LWbKZfH9/99UkknQHhGsynDz+65eWXv3/JmJrq5eXienVlRUfH/z8VvCf45soKQIH1yDEQsszrp6gwq9C73T87xcXadKl5TkFev4A/2tygmSBqYXqAYJmK+ZuoJydDR1vP09DA0NOy2kpdML81+U/heCpH1JU3jig7lJ5nKOT4i/t6ZHkqGzs4lJmIVHfrj+JR4HqLQSD0yDkCNEpGNn5ix9D03/eJdElTZdKV2TpNOhkwt8YUlNUgimgV0dLMBvf1gz1MolPd5FRcVNSkpDQ8owJeBCDyIhrIDnOD5QcuIU+3/2QKSs9laQ+noNLS0zLWdtqyP7mBAFAw88TwsJgMuJYweBGjYngtWbmeuZOW+bvNQToUFOAlFqOBk4Ov3/L7Z60/aN0p1tUhpa5nqWlub7C3p2I9QzyAghlUvczOz/1fhzPT3XSIfpSmmYAdVbmm1gV0dSz8DSilpUQsqCddIWIA3meuZaJqdMJZEzl6gRqgZIWZAxUdoizERXN8yi5MltcZTChzMaRQM3JNUWHS8rL/+yaPGvMmvr5ywoGoxtkDWwQ+Pb89ycBeWfGSJeL/la+RS1eOPnRtbQKgMRjZg+t8x6PkP273nWQAoFOPAgaeAThKXAmXMrK39Kmr5fsuBlBqoXfJGLe3VbmHjG9Mczi9T//3h7vygXtcDlQtJg44iQiIjIBRbGPO7gghPJy0ZIxT2HOLIUgwxQzsgYrUR350HSIMaJLidhgKY+mw+pflBDrX8E7OGBjPCAPc76gQFSTqAIiYrb/8dRP4CyosJ/rmwU5XIxHMilt4QBJwsSkBMClxOQULBlkRRwEONmR2kJcDGjADX2/+xO8r5iqjExqmLyrWpcPFRta1BfAwCtyN3XpuJ4RgAAAABJRU5ErkJggg== -)](https://github.com/Acclorite/book-story/releases) +)](https://apt.izzysoft.de/fdroid/index/apk/ua.acclorite.book_story) [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() [![Stars](https://img.shields.io/github/stars/Acclorite/book-story?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxwYXRoIGQ9Im0zNTQtMjQ3IDEyNi03NiAxMjYgNzctMzMtMTQ0IDExMS05Ni0xNDYtMTMtNTgtMTM2LTU4IDEzNS0xNDYgMTMgMTExIDk3LTMzIDE0M1pNMjMzLTgwbDY1LTI4MUw4MC01NTBsMjg4LTI1IDExMi0yNjUgMTEyIDI2NSAyODggMjUtMjE4IDE4OSA2NSAyODEtMjQ3LTE0OUwyMzMtODBabTI0Ny0zNTBaIiBzdHlsZT0iZmlsbDogcmdiKDI0NSwgMjI3LCA2Nik7Ii8%2BCjwvc3ZnPg%3D%3D&color=949b3f&labelColor=27303D&label=Stars)](https://github.com/Acclorite/book-story/stargazers) [![Development Stage](https://img.shields.io/badge/Active-9b3f90?label=Development%20stage&labelColor=27303D)](https://github.com/Acclorite/book-story/commits/) From 35a04575056838031f774b3e154bfab7ae40a94f Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 13:17:19 +0300 Subject: [PATCH 26/46] Removed no longer valid credit. --- .../java/ua/acclorite/book_story/domain/util/Constants.kt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt b/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt index bfe44035..21fd5217 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt @@ -83,14 +83,6 @@ object Constants { ), website = "https://www.github.com/mihonapp/mihon" ), - Credit( - name = "Libre-Sudoku", - source = "GitHub", - credits = listOf( - UIText.StringValue("Readme") - ), - website = "https://www.github.com/kaajjo/Libre-Sudoku" - ), Credit( name = "Kitsune", source = "GitHub", From 377397a9f8888a5e13e008d8607f42ee5851165d Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:18:06 +0300 Subject: [PATCH 27/46] Update README.md (Added F-Droid badge) --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a2b63dcf..fcd593f7 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) + [![F-Droid Release](https://img.shields.io/f-droid/v/ua.acclorite.book_story?labelColor=27303D&color=3f9b5a&label=F-Droid&logo=f-droid)](https://github.com/Acclorite/book-story/releases) [![IzzyOnDroid Release](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/ua.acclorite.book_story&labelColor=27303D&color=3f9b84&label=IzzyOnDroid&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAADAFBMVEUA0////wAA0v8A0v8A0////wD//wAFz/QA0/8A0/8A0/8A0/8A0v///wAA0/8A0/8A0/8A0/8A0//8/gEA0/8A0/8B0/4A0/8A0/8A0/+j5QGAwwIA0//C9yEA0/8A0/8A0/8A0/8A0/8A0/+n4SAA0/8A0/8A0/+o6gCw3lKt7QCv5SC+422b3wC19AC36zAA0/+d1yMA0/8A0/+W2gEA0/+w8ACz8gCKzgG7+QC+9CFLfwkA0/8A0////wAA0/8A0/8A0/8A0/+f2xym3iuHxCGq5BoA1P+m2joI0vONyiCz3mLO7oYA0/8M1Piq3Ei78CbB8EPe8LLj9Ly751G77zWQ1AC96UYC0fi37CL//wAA0/8A0////wD//wCp3jcA0/+j3SGj2i/I72Sx4zHE8FLB8zak1kYeycDI6nRl3qEA0/7V7psA0v6WzTa95mGi2RvB5XkPy9zH5YJ3uwGV1yxVihRLiwdxtQ1ZkAf//wD//wD//wD//wD//wCn5gf//wD//wD//wD//wD//wAA0/+h4A3R6p8A0/+X1w565OD6/ARg237n9csz2vPz+gNt37V/vifO8HW68B/L6ZOCwxXY8KRQsWRzhExAtG/E612a1Rd/pTBpmR9qjysduKVhmxF9mTY51aUozK+CsDSA52T//wD//wAA0////wD//wBJ1JRRxFWjzlxDyXRc0pGT1wCG0CWB3VGUzSTh8h6c0TSr5CCJ5FFxvl6s4H3m8xML0/DA5CvK51EX1N+Y2gSt4Dag3ChE3fax2ki68yO57NF10FRZnUPl88eJxhuCxgCz5EOLwEGf1DFutmahzGW98x0W1PGk3R154MHE6bOn69qv3gy92oG90o+Hn07B7rhCmiyMwECv1nO+0pQfwrCo57xF2daXsVhKrEdenQAduaee1Bsjr42z5D9RoCXy+QNovXpy2Z5MtWDO/TiSukaF3UtE1K6j3B4YwLc5wXlzpyIK0u5zy3uJqg4pu5RTpkZmpVKyAP8A0wBHcExHcEyBUSeEAAABAHRSTlP///9F9wjAAxD7FCEGzBjd08QyEL39abMd6///8P/ZWAnipIv/cC6B//7////////L/1Dz/0D///////86/vYnquY3/v///5T//v///17///////////////84S3QNB/8L/////////////7r/////NP////9l/////wPD4yis/x7Ym2lWSP+em////0n////////v///////////////////7//7pdGN3Urr6/+v/6aT////+//H/o2P/1v+7r7jp4PM/3p4g////g///K///481LxO///v////9w////8v/////9/p3J///a+P9v/5KR/+n///+p/xf//8P//wAAe7FyaAAABCZJREFUSMdj+E8iYKBUgwIHnwQ3N7cEHxcH+///VayoAE0Dh41qR7aBnCIQ8MsJKHH9/99czYYMWlA0cIkJGjMgAKfq//9RNYzIgLcBWYOTiCgDMhDn+B9bh6LebiWyH6L5UZQzONoAHWSHoqEpDkkDsyKqelv1//9rG1HUN9YihZK9AKp6BkG+/6xNqA5ajhSsCkrIipmYGGRa//9vQXVQXSySBnkWJOUMfn5Myuz/G3hR1NdEIUUchwiy+bkTsg4dbW/fu6W/e1c3XMMy5JiOZkFxUFZo74mgKTqaKXu0+2HqVwkja3BH9kFu361JwcHTfPJD4mdfe8ULAdVRyGlJAcVFfg+CQOozZ4XrJ85+JgwBsVXIGriQw5Tp4ZScezd8JiWnBupru30qwJZa+ZAjmWlC8fUZM4qB6kPnLNSPLMWqQQ5ZQ5aOzs1HmamBaQHzFs6y+qAmJCTE8f9/QgKSBg4DJPWc6zVDQkIC09JkZSPD38kukpExFpT4z67uYI/QwCOOCCK/izvu5CWl6AcEWMnKWml7LWbKZfH9/99UkknQHhGsynDz+65eWXv3/JmJrq5eXienVlRUfH/z8VvCf45soKQIH1yDEQsszrp6gwq9C73T87xcXadKl5TkFev4A/2tygmSBqYXqAYJmK+ZuoJydDR1vP09DA0NOy2kpdML81+U/heCpH1JU3jig7lJ5nKOT4i/t6ZHkqGzs4lJmIVHfrj+JR4HqLQSD0yDkCNEpGNn5ix9D03/eJdElTZdKV2TpNOhkwt8YUlNUgimgV0dLMBvf1gz1MolPd5FRcVNSkpDQ8owJeBCDyIhrIDnOD5QcuIU+3/2QKSs9laQ+noNLS0zLWdtqyP7mBAFAw88TwsJgMuJYweBGjYngtWbmeuZOW+bvNQToUFOAlFqOBk4Ov3/L7Z60/aN0p1tUhpa5nqWlub7C3p2I9QzyAghlUvczOz/1fhzPT3XSIfpSmmYAdVbmm1gV0dSz8DSilpUQsqCddIWIA3meuZaJqdMJZEzl6gRqgZIWZAxUdoizERXN8yi5MltcZTChzMaRQM3JNUWHS8rL/+yaPGvMmvr5ywoGoxtkDWwQ+Pb89ycBeWfGSJeL/la+RS1eOPnRtbQKgMRjZg+t8x6PkP273nWQAoFOPAgaeAThKXAmXMrK39Kmr5fsuBlBqoXfJGLe3VbmHjG9Mczi9T//3h7vygXtcDlQtJg44iQiIjIBRbGPO7gghPJy0ZIxT2HOLIUgwxQzsgYrUR350HSIMaJLidhgKY+mw+pflBDrX8E7OGBjPCAPc76gQFSTqAIiYrb/8dRP4CyosJ/rmwU5XIxHMilt4QBJwsSkBMClxOQULBlkRRwEONmR2kJcDGjADX2/+xO8r5iqjExqmLyrWpcPFRta1BfAwCtyN3XpuJ4RgAAAABJRU5ErkJggg== )](https://apt.izzysoft.de/fdroid/index/apk/ua.acclorite.book_story) [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() @@ -57,15 +58,17 @@ _You can find more screenshots in [assets](https://github.com/Acclorite/book-sto
[Get it on GitHub](https://github.com/Acclorite/book-story/releases/latest) + [Get it on F-Droid](https://f-droid.org/en/packages/ua.acclorite.book_story/) [Get it on IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/ua.acclorite.book_story)
-_Fdroid is coming.._ +_Don't see your favorite app store? Create an [Issue](https://github.com/Acclorite/book-story/issues)! (Except Play Store, this app won't be there)_ ### 📲 How to download and install - - _Install from Github_: Click on the "Get it on GitHub" badge above, scroll down and download **book-story.apk** or download the last apk from GitHub [here](https://github.com/Acclorite/book-story/releases/latest/download/book-story.apk). After that, find downloaded file and install it. If you don't understand how to do so, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). - - _Install from F-Droid_: Coming soon... - - _Install from IzzyOnDroid_: Click on the "Get it on IzzyOnDroid" badge above, scroll down and click "Download" to download the last apk from IzzyOnDroid. After that, find downloaded file and install it. If you don't understand how to do so, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). + - _**Install from Github**_: Click on the "Get it on GitHub" badge above, scroll down and download **book-story.apk** or download the last apk from GitHub [here](https://github.com/Acclorite/book-story/releases/latest/download/book-story.apk). After that, find downloaded APK and install it. + - _**Install from F-Droid**_: Click on the "Get it on F-Droid" badge above, scroll down and click "Download APK" under desired Release Version to download the APK file. After that, find downloaded APK and install it. + - _**Install from IzzyOnDroid**_: Click on the "Get it on IzzyOnDroid" badge above, scroll down and click "Download" to download the last APK from IzzyOnDroid. After that, find downloaded APK and install it. + - If you don't know how to install APK file, follow [this guide](https://www.lifewire.com/install-apk-on-android-4177185). ### 🗳️ APK Verification - _APK Verification is an important step to ensure APK integrity and prevent risks from getting infected one._ @@ -114,7 +117,6 @@ _Fdroid is coming.._ ## 🤗 Credits - [Tachiyomi (Mihon)](https://github.com/mihonapp/mihon) (Github) -- [Libre-Sudoku](https://github.com/kaajjo/Libre-Sudoku) (Github) - [Kitsune](https://github.com/Drumber/Kitsune) (Github) - [Material Design Icons](https://fonts.google.com/icons) (Google Fonts) - Also listed in About > Credits. From 923e2efa6b1d5d1e89fbd4e36195c4c3f29feb63 Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:37:36 +0300 Subject: [PATCH 28/46] Update README.md (F-Droid badge link to fdroid.org) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fcd593f7..249e886c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ [![Latest Stable Release](https://img.shields.io/github/release/Acclorite/book-story.svg?labelColor=27303D&color=3f719b&label=Release&logo=GitHub)](https://github.com/Acclorite/book-story/releases) - [![F-Droid Release](https://img.shields.io/f-droid/v/ua.acclorite.book_story?labelColor=27303D&color=3f9b5a&label=F-Droid&logo=f-droid)](https://github.com/Acclorite/book-story/releases) + [![F-Droid Release](https://img.shields.io/f-droid/v/ua.acclorite.book_story?labelColor=27303D&color=3f9b5a&label=F-Droid&logo=f-droid)](https://f-droid.org/packages/ua.acclorite.book_story/) [![IzzyOnDroid Release](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/ua.acclorite.book_story&labelColor=27303D&color=3f9b84&label=IzzyOnDroid&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAADAFBMVEUA0////wAA0v8A0v8A0////wD//wAFz/QA0/8A0/8A0/8A0/8A0v///wAA0/8A0/8A0/8A0/8A0//8/gEA0/8A0/8B0/4A0/8A0/8A0/+j5QGAwwIA0//C9yEA0/8A0/8A0/8A0/8A0/8A0/+n4SAA0/8A0/8A0/+o6gCw3lKt7QCv5SC+422b3wC19AC36zAA0/+d1yMA0/8A0/+W2gEA0/+w8ACz8gCKzgG7+QC+9CFLfwkA0/8A0////wAA0/8A0/8A0/8A0/+f2xym3iuHxCGq5BoA1P+m2joI0vONyiCz3mLO7oYA0/8M1Piq3Ei78CbB8EPe8LLj9Ly751G77zWQ1AC96UYC0fi37CL//wAA0/8A0////wD//wCp3jcA0/+j3SGj2i/I72Sx4zHE8FLB8zak1kYeycDI6nRl3qEA0/7V7psA0v6WzTa95mGi2RvB5XkPy9zH5YJ3uwGV1yxVihRLiwdxtQ1ZkAf//wD//wD//wD//wD//wCn5gf//wD//wD//wD//wD//wAA0/+h4A3R6p8A0/+X1w565OD6/ARg237n9csz2vPz+gNt37V/vifO8HW68B/L6ZOCwxXY8KRQsWRzhExAtG/E612a1Rd/pTBpmR9qjysduKVhmxF9mTY51aUozK+CsDSA52T//wD//wAA0////wD//wBJ1JRRxFWjzlxDyXRc0pGT1wCG0CWB3VGUzSTh8h6c0TSr5CCJ5FFxvl6s4H3m8xML0/DA5CvK51EX1N+Y2gSt4Dag3ChE3fax2ki68yO57NF10FRZnUPl88eJxhuCxgCz5EOLwEGf1DFutmahzGW98x0W1PGk3R154MHE6bOn69qv3gy92oG90o+Hn07B7rhCmiyMwECv1nO+0pQfwrCo57xF2daXsVhKrEdenQAduaee1Bsjr42z5D9RoCXy+QNovXpy2Z5MtWDO/TiSukaF3UtE1K6j3B4YwLc5wXlzpyIK0u5zy3uJqg4pu5RTpkZmpVKyAP8A0wBHcExHcEyBUSeEAAABAHRSTlP///9F9wjAAxD7FCEGzBjd08QyEL39abMd6///8P/ZWAnipIv/cC6B//7////////L/1Dz/0D///////86/vYnquY3/v///5T//v///17///////////////84S3QNB/8L/////////////7r/////NP////9l/////wPD4yis/x7Ym2lWSP+em////0n////////v///////////////////7//7pdGN3Urr6/+v/6aT////+//H/o2P/1v+7r7jp4PM/3p4g////g///K///481LxO///v////9w////8v/////9/p3J///a+P9v/5KR/+n///+p/xf//8P//wAAe7FyaAAABCZJREFUSMdj+E8iYKBUgwIHnwQ3N7cEHxcH+///VayoAE0Dh41qR7aBnCIQ8MsJKHH9/99czYYMWlA0cIkJGjMgAKfq//9RNYzIgLcBWYOTiCgDMhDn+B9bh6LebiWyH6L5UZQzONoAHWSHoqEpDkkDsyKqelv1//9rG1HUN9YihZK9AKp6BkG+/6xNqA5ajhSsCkrIipmYGGRa//9vQXVQXSySBnkWJOUMfn5Myuz/G3hR1NdEIUUchwiy+bkTsg4dbW/fu6W/e1c3XMMy5JiOZkFxUFZo74mgKTqaKXu0+2HqVwkja3BH9kFu361JwcHTfPJD4mdfe8ULAdVRyGlJAcVFfg+CQOozZ4XrJ85+JgwBsVXIGriQw5Tp4ZScezd8JiWnBupru30qwJZa+ZAjmWlC8fUZM4qB6kPnLNSPLMWqQQ5ZQ5aOzs1HmamBaQHzFs6y+qAmJCTE8f9/QgKSBg4DJPWc6zVDQkIC09JkZSPD38kukpExFpT4z67uYI/QwCOOCCK/izvu5CWl6AcEWMnKWml7LWbKZfH9/99UkknQHhGsynDz+65eWXv3/JmJrq5eXienVlRUfH/z8VvCf45soKQIH1yDEQsszrp6gwq9C73T87xcXadKl5TkFev4A/2tygmSBqYXqAYJmK+ZuoJydDR1vP09DA0NOy2kpdML81+U/heCpH1JU3jig7lJ5nKOT4i/t6ZHkqGzs4lJmIVHfrj+JR4HqLQSD0yDkCNEpGNn5ix9D03/eJdElTZdKV2TpNOhkwt8YUlNUgimgV0dLMBvf1gz1MolPd5FRcVNSkpDQ8owJeBCDyIhrIDnOD5QcuIU+3/2QKSs9laQ+noNLS0zLWdtqyP7mBAFAw88TwsJgMuJYweBGjYngtWbmeuZOW+bvNQToUFOAlFqOBk4Ov3/L7Z60/aN0p1tUhpa5nqWlub7C3p2I9QzyAghlUvczOz/1fhzPT3XSIfpSmmYAdVbmm1gV0dSz8DSilpUQsqCddIWIA3meuZaJqdMJZEzl6gRqgZIWZAxUdoizERXN8yi5MltcZTChzMaRQM3JNUWHS8rL/+yaPGvMmvr5ywoGoxtkDWwQ+Pb89ycBeWfGSJeL/la+RS1eOPnRtbQKgMRjZg+t8x6PkP273nWQAoFOPAgaeAThKXAmXMrK39Kmr5fsuBlBqoXfJGLe3VbmHjG9Mczi9T//3h7vygXtcDlQtJg44iQiIjIBRbGPO7gghPJy0ZIxT2HOLIUgwxQzsgYrUR350HSIMaJLidhgKY+mw+pflBDrX8E7OGBjPCAPc76gQFSTqAIiYrb/8dRP4CyosJ/rmwU5XIxHMilt4QBJwsSkBMClxOQULBlkRRwEONmR2kJcDGjADX2/+xO8r5iqjExqmLyrWpcPFRta1BfAwCtyN3XpuJ4RgAAAABJRU5ErkJggg== )](https://apt.izzysoft.de/fdroid/index/apk/ua.acclorite.book_story) [![Downloads](https://img.shields.io/github/downloads/Acclorite/book-story/total?color=3f8f9b&labelColor=27303D&label=Downloads&logo=GitHub)]() From 1db727dd9fb6354575e7982be6ec983ec91dc670 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 13:53:57 +0300 Subject: [PATCH 29/46] Removed DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION, not used. --- app/src/main/AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 25d294b5..05ff76ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,11 @@ + + + From eaa15ef34174338466c645d221cac7188ef271fc Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 13:54:33 +0300 Subject: [PATCH 30/46] Fix: Can fast switch presets while book is loading in ReaderScreen. --- .../book_story/presentation/screens/reader/ReaderScreen.kt | 1 + .../screens/reader/components/ReaderFastColorPresetChange.kt | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt index 8d6a84a5..de97e874 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/ReaderScreen.kt @@ -331,6 +331,7 @@ private fun ReaderScreen( ) .readerFastColorPresetChange( fastColorPresetChangeEnabled = mainState.value.fastColorPresetChange!!, + isLoading = state.value.loading, toolbarHidden = toolbarHidden, onSettingsEvent = onSettingsEvent, presetChanged = { diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt index 88585ed1..0644ba20 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/reader/components/ReaderFastColorPresetChange.kt @@ -14,6 +14,7 @@ import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent * Detects horizontal swipe gestures. * * @param fastColorPresetChangeEnabled Whether this is enabled. + * @param isLoading Whether Reader is loading. * @param toolbarHidden Whether toolbar(selection) is hidden. * @param onSettingsEvent [SettingsEvent] callback. * @param presetChanged Callback when Color Preset was changed. @@ -21,13 +22,14 @@ import ua.acclorite.book_story.presentation.screens.settings.data.SettingsEvent @Composable fun Modifier.readerFastColorPresetChange( fastColorPresetChangeEnabled: Boolean, + isLoading: Boolean, toolbarHidden: Boolean, onSettingsEvent: (SettingsEvent) -> Unit, presetChanged: (UIText) -> Unit ): Modifier { val offset = remember { mutableFloatStateOf(0f) } return this.then( - if (fastColorPresetChangeEnabled && toolbarHidden) { + if (fastColorPresetChangeEnabled && toolbarHidden && !isLoading) { Modifier.pointerInput(Unit) { detectHorizontalDragGestures( onDragStart = { offset.floatValue = 0f }, From 83d5a30847733f59a89107400f929f4c94676709 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 14:06:19 +0300 Subject: [PATCH 31/46] Specified all dependency versions instead of latest.release. --- app/build.gradle.kts | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 463aab6c..eb9c58c0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -111,13 +111,13 @@ dependencies { // All dependencies implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4") - implementation("com.google.accompanist:accompanist-swiperefresh:0.24.2-alpha") + implementation("com.google.accompanist:accompanist-swiperefresh:0.34.0") // Dagger - Hilt - implementation("com.google.dagger:hilt-android:2.51.1") - ksp("com.google.dagger:hilt-android-compiler:2.51") - implementation("com.google.dagger:hilt-compiler:latest.release") - ksp("androidx.hilt:hilt-compiler:latest.release") + implementation("com.google.dagger:hilt-android:2.52") + ksp("com.google.dagger:hilt-android-compiler:2.52") + implementation("com.google.dagger:hilt-compiler:2.52") + ksp("androidx.hilt:hilt-compiler:1.2.0") implementation("androidx.hilt:hilt-navigation-compose:1.2.0") // Room @@ -128,47 +128,47 @@ dependencies { implementation("androidx.room:room-ktx:2.6.1") // Datastore - implementation("androidx.datastore:datastore-preferences:latest.release") + implementation("androidx.datastore:datastore-preferences:1.1.1") // Splash API - implementation("androidx.core:core-splashscreen:latest.release") + implementation("androidx.core:core-splashscreen:1.0.1") // Permission Handling - implementation("com.google.accompanist:accompanist-permissions:latest.release") + implementation("com.google.accompanist:accompanist-permissions:0.34.0") // Pdf parser - implementation("com.tom-roush:pdfbox-android:latest.release") + implementation("com.tom-roush:pdfbox-android:2.0.27.0") // Epub parser implementation("com.positiondev.epublib:epublib-core:3.1") { exclude("org.slf4j") exclude("xmlpull") } - implementation("org.slf4j:slf4j-android:latest.release") - implementation("org.jsoup:jsoup:latest.release") + implementation("org.slf4j:slf4j-android:1.7.36") + implementation("org.jsoup:jsoup:1.18.1") // Fb2 parser - implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:latest.release") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.1") // App Compat for Language Switcher - implementation("androidx.appcompat:appcompat:latest.release") - implementation("androidx.appcompat:appcompat-resources:latest.release") + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("androidx.appcompat:appcompat-resources:1.7.0") // Coil for loading bitmaps - implementation("io.coil-kt:coil-compose:2.6.0") + implementation("io.coil-kt:coil-compose:2.7.0") // Retrofit - implementation("com.squareup.retrofit2:retrofit:2.9.0") - implementation("com.squareup.retrofit2:converter-moshi:2.9.0") + implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation("com.squareup.retrofit2:converter-moshi:2.11.0") implementation("com.squareup.moshi:moshi:1.15.1") implementation("com.squareup.moshi:moshi-kotlin:1.15.1") implementation("com.squareup.okhttp3:okhttp:4.12.0") - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") // About open source libraries - implementation("com.mikepenz:aboutlibraries-core:latest.release") - implementation("com.mikepenz:aboutlibraries-compose-m3:latest.release") + implementation("com.mikepenz:aboutlibraries-core:11.2.2") + implementation("com.mikepenz:aboutlibraries-compose-m3:11.2.2") // Drag & Drop - implementation("sh.calvin.reorderable:reorderable:2.2.0") + implementation("sh.calvin.reorderable:reorderable:2.3.0") } \ No newline at end of file From c5704fb34baa5276c388798b6d397d11d9b57cfc Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 14:15:17 +0300 Subject: [PATCH 32/46] Removed ignoring uppercase line in PDF Text Parser. (As it may contain chapter name) --- .../book_story/data/parser/pdf/PdfTextParser.kt | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt index 7afbb35d..8e79bd80 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/parser/pdf/PdfTextParser.kt @@ -53,20 +53,6 @@ class PdfTextParser @Inject constructor(private val application: Application) : return@forEachIndexed } - if ( - line.all { - if (it == ' ') { - true - } else if (it.isUpperCase() || it.isDigit() || it == '-') { - true - } else { - false - } - } - ) { - return@forEachIndexed - } - if (line.all { it.isDigit() }) { return@forEachIndexed } From 8b48328c4b37787b251b2d9e41e667c445f4dc98 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 14:41:28 +0300 Subject: [PATCH 33/46] =?UTF-8?q?Updated=20material3=20version=201.3.0-alp?= =?UTF-8?q?ha06=20=E2=86=92=201.3.0-beta05?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../presentation/screens/help/components/HelpAnnotation.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eb9c58c0..24662a2a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -104,7 +104,7 @@ dependencies { implementation("androidx.compose.ui:ui-graphics:1.6.8") implementation("androidx.compose.ui:ui-tooling-preview:1.6.8") implementation("androidx.compose.ui:ui-android:1.6.8") - implementation("androidx.compose.material3:material3:1.3.0-alpha06") + implementation("androidx.compose.material3:material3:1.3.0-beta05") implementation("androidx.compose.material3:material3-window-size-class:1.2.1") implementation("androidx.compose.material:material-icons-extended:1.6.8") implementation("androidx.compose.material:material:1.6.8") diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/components/HelpAnnotation.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/components/HelpAnnotation.kt index f9d297e8..1fdd2999 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/components/HelpAnnotation.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/help/components/HelpAnnotation.kt @@ -22,7 +22,7 @@ fun AnnotatedString.Builder.HelpAnnotation( block: @Composable AnnotatedString.Builder.() -> Unit ) { withLink( - LinkAnnotation.Url("", style = null) { + LinkAnnotation.Url("", styles = null) { onClick() } ) { From 2939a5e8dc976f0efe3359f2a3f23539a4f0a83e Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 14:42:05 +0300 Subject: [PATCH 34/46] Check if Environment.getExternalStorageDirectory() is MOUNTED. --- .../book_story/data/repository/BookRepositoryImpl.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt index d524098c..1106263f 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt @@ -485,6 +485,16 @@ class BookRepositoryImpl @Inject constructor( .map { bookMapper.toBook(it) } val primaryDirectory = Environment.getExternalStorageDirectory() + + if ( + !primaryDirectory.exists() || + (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED && + Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED_READ_ONLY) + ) { + emit(Resource.Success(null)) + return@flow + } + val allFiles = getAllFilesInDirectory(primaryDirectory) if (allFiles.isEmpty()) { From 3c5f392ea26cd2dd84f82e26f8254f8b215bd7b5 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 17:30:24 +0300 Subject: [PATCH 35/46] Removed no more valid credits. --- .../ua/acclorite/book_story/domain/util/Constants.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt b/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt index 21fd5217..f60350d4 100644 --- a/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt +++ b/app/src/main/java/ua/acclorite/book_story/domain/util/Constants.kt @@ -99,15 +99,6 @@ object Constants { ), website = "https://fonts.google.com/icons" ), - Credit( - name = "Crocus", - source = null, - credits = listOf( - UIText.StringResource(R.string.credits_motivation), - UIText.StringValue("UwU") - ), - website = null - ), ) // Help Tips From 85cf299bcc57741db01f543c77e3db4c10b33964 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 18:19:38 +0300 Subject: [PATCH 36/46] AboutLibraries: Manually getting libraries. --- app/build.gradle.kts | 3 +- .../nested/licenses/data/LicensesViewModel.kt | 5 +- app/src/main/res/raw/aboutlibraries.json | 2929 +++++++++++++++++ 3 files changed, 2934 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/raw/aboutlibraries.json diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ebc49a06..583d00f6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -75,7 +75,8 @@ android { } aboutLibraries { - gitHubApiToken = gradleLocalProperties(rootDir, providers)["github-key"] as String + registerAndroidTasks = false + gitHubApiToken = gradleLocalProperties(rootDir, providers)["github-key"] as? String filterVariants = arrayOf("debug", "release", "release-debug") excludeFields = arrayOf("generated", "funding", "description") diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt index 7c458821..e5aa7335 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/nested/licenses/data/LicensesViewModel.kt @@ -4,13 +4,14 @@ import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.mikepenz.aboutlibraries.Libs -import com.mikepenz.aboutlibraries.util.withContext +import com.mikepenz.aboutlibraries.util.withJson import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import ua.acclorite.book_story.R import javax.inject.Inject @HiltViewModel @@ -29,7 +30,7 @@ class LicensesViewModel @Inject constructor( val licenses = Libs .Builder() - .withContext(context) + .withJson(context, R.raw.aboutlibraries) .build() .libraries .toList() diff --git a/app/src/main/res/raw/aboutlibraries.json b/app/src/main/res/raw/aboutlibraries.json new file mode 100644 index 00000000..59254927 --- /dev/null +++ b/app/src/main/res/raw/aboutlibraries.json @@ -0,0 +1,2929 @@ +{ + "metadata": {}, + "libraries": [ + { + "uniqueId": "androidx.activity:activity", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.9.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Activity", + "website": "https://developer.android.com/jetpack/androidx/releases/activity#1.9.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.activity:activity-compose", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.9.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Activity Compose", + "website": "https://developer.android.com/jetpack/androidx/releases/activity#1.9.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.activity:activity-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.9.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Activity Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/activity#1.9.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.annotation:annotation-experimental", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.4.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Experimental annotation", + "website": "https://developer.android.com/jetpack/androidx/releases/annotation#1.4.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.annotation:annotation-jvm", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.8.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Annotation", + "website": "https://developer.android.com/jetpack/androidx/releases/annotation#1.8.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.appcompat:appcompat", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "AppCompat", + "website": "https://developer.android.com/jetpack/androidx/releases/appcompat#1.7.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.appcompat:appcompat-resources", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "AppCompat Resources", + "website": "https://developer.android.com/jetpack/androidx/releases/appcompat#1.7.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.arch.core:core-common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.2.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Arch-Common", + "website": "https://developer.android.com/jetpack/androidx/releases/arch-core#2.2.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.arch.core:core-runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.2.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Arch-Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/arch-core#2.2.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.autofill:autofill", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "AndroidX Autofill", + "website": "https://developer.android.com/jetpack/androidx", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.collection:collection-jvm", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.4.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "collections", + "website": "https://developer.android.com/jetpack/androidx/releases/collection#1.4.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.collection:collection-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.4.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Collections Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/collection#1.4.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.animation:animation-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Animation", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-animation#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.animation:animation-core-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Animation Core", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-animation#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.foundation:foundation-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Foundation", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.foundation:foundation-layout-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Layouts", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-foundation#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material3:material3-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.0-beta05", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material3 Components", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material3#1.3.0-beta05", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material3:material3-window-size-class-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.0-beta05", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material 3 Window Size Class", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material3#1.3.0-beta05", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material:material-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.6.8", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material Components", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material#1.6.8", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material:material-icons-core-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.6.8", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material Icons Core", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material#1.6.8", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material:material-icons-extended-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.6.8", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material Icons Extended", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material#1.6.8", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.material:material-ripple-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Material Ripple", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-material#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.runtime:runtime-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.runtime:runtime-saveable-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Saveable", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-runtime#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose UI", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-geometry-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Geometry", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-graphics-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Graphics", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-text-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose UI Text", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-tooling-preview-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose UI Preview Tooling", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-unit-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Unit", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.compose.ui:ui-util-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.7.0-beta02", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Util", + "website": "https://developer.android.com/jetpack/androidx/releases/compose-ui#1.7.0-beta02", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.concurrent:concurrent-futures", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "AndroidX Futures", + "website": "https://developer.android.com/topic/libraries/architecture/index.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.core:core", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.13.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Core", + "website": "https://developer.android.com/jetpack/androidx/releases/core#1.13.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.core:core-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.13.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Core Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/core#1.13.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.core:core-splashscreen", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "SplashScreen", + "website": "https://developer.android.com/jetpack/androidx/releases/core#1.0.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.cursoradapter:cursoradapter", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support Cursor Adapter", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.customview:customview", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support Custom View", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.customview:customview-poolingcontainer", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "androidx.customview:poolingcontainer", + "website": "https://developer.android.com/jetpack/androidx/releases/customview#1.0.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.datastore:datastore-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "DataStore", + "website": "https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.datastore:datastore-core-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "DataStore Core", + "website": "https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.datastore:datastore-core-okio-jvm", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "DataStore Core Okio", + "website": "https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.datastore:datastore-preferences-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Preferences DataStore", + "website": "https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.datastore:datastore-preferences-core-jvm", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Preferences DataStore Core", + "website": "https://developer.android.com/jetpack/androidx/releases/datastore#1.1.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.drawerlayout:drawerlayout", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support Drawer Layout", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.emoji2:emoji2", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Emoji2 Compat", + "website": "https://developer.android.com/jetpack/androidx/releases/emoji2#1.3.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.emoji2:emoji2-views-helper", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Emoji2 Compat view helpers", + "website": "https://developer.android.com/jetpack/androidx/releases/emoji2#1.3.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.exifinterface:exifinterface", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.7", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Support ExifInterface", + "website": "https://developer.android.com/jetpack/androidx/releases/exifinterface#1.3.7", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.fragment:fragment", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.5.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Support fragment", + "website": "https://developer.android.com/jetpack/androidx/releases/fragment#1.5.4", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.graphics:graphics-path", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Graphics Path", + "website": "https://developer.android.com/jetpack/androidx/releases/graphics#1.0.1", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.hilt:hilt-navigation", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.2.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Navigation Hilt Extension", + "website": "https://developer.android.com/jetpack/androidx/releases/hilt#1.2.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.hilt:hilt-navigation-compose", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.2.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Navigation Compose Hilt Integration", + "website": "https://developer.android.com/jetpack/androidx/releases/hilt#1.2.0", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.interpolator:interpolator", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support Interpolators", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-common-java8", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle-Common for Java 8", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-common-jvm", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle-Common", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-livedata", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle LiveData", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-livedata-core", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle LiveData Core", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-livedata-core-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "LiveData Core Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-process", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle Process", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-runtime-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-runtime-compose-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle Runtime Compose", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-runtime-ktx-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle ViewModel", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle ViewModel", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel-compose-android", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle ViewModel Compose", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle ViewModel Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.lifecycle:lifecycle-viewmodel-savedstate", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.8.4", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Lifecycle ViewModel with SavedState", + "website": "https://developer.android.com/jetpack/androidx/releases/lifecycle#2.8.4", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "name": "The Android Open Source Project" + } + }, + { + "uniqueId": "androidx.loader:loader", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support loader", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.navigation:navigation-common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.5.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Navigation Common", + "website": "https://developer.android.com/jetpack/androidx/releases/navigation#2.5.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.navigation:navigation-common-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.5.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Navigation Common Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/navigation#2.5.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.navigation:navigation-compose", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.5.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Compose Navigation", + "website": "https://developer.android.com/jetpack/androidx/releases/navigation#2.5.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.navigation:navigation-runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.5.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Navigation Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/navigation#2.5.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.navigation:navigation-runtime-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.5.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Navigation Runtime Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/navigation#2.5.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.profileinstaller:profileinstaller", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.3.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "androidx.profileinstaller:profileinstaller", + "website": "https://developer.android.com/jetpack/androidx/releases/profileinstaller#1.3.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.resourceinspection:resourceinspection-annotation", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Resource Inspection - Annotations", + "website": "https://developer.android.com/jetpack/androidx/releases/resourceinspection#1.0.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.room:room-common", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.6.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Room-Common", + "website": "https://developer.android.com/jetpack/androidx/releases/room#2.6.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.room:room-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.6.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Room Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/room#2.6.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.room:room-runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.6.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Room-Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/room#2.6.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.savedstate:savedstate", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.2.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Saved State", + "website": "https://developer.android.com/jetpack/androidx/releases/savedstate#1.2.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.savedstate:savedstate-ktx", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.2.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "SavedState Kotlin Extensions", + "website": "https://developer.android.com/jetpack/androidx/releases/savedstate#1.2.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.sqlite:sqlite", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.4.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "SQLite", + "website": "https://developer.android.com/jetpack/androidx/releases/sqlite#2.4.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.sqlite:sqlite-framework", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "2.4.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "SQLite Framework Integration", + "website": "https://developer.android.com/jetpack/androidx/releases/sqlite#2.4.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.startup:startup-runtime", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android App Startup Runtime", + "website": "https://developer.android.com/jetpack/androidx/releases/startup#1.1.1", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.tracing:tracing", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Android Tracing", + "website": "https://developer.android.com/jetpack/androidx/releases/tracing#1.0.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.vectordrawable:vectordrawable", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support VectorDrawable", + "website": "https://developer.android.com/jetpack/androidx", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.vectordrawable:vectordrawable-animated", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support AnimatedVectorDrawable", + "website": "https://developer.android.com/jetpack/androidx", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.versionedparcelable:versionedparcelable", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.1.1", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "VersionedParcelable", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.viewpager:viewpager", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "http://source.android.com" + }, + "name": "Support View Pager", + "website": "http://developer.android.com/tools/extras/support-library.html", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "androidx.window:window", + "developers": [ + { + "name": "The Android Open Source Project" + } + ], + "artifactVersion": "1.0.0", + "scm": { + "connection": "scm:git:https://android.googlesource.com/platform/frameworks/support", + "url": "https://cs.android.com/androidx/platform/frameworks/support" + }, + "name": "Jetpack WindowManager Library", + "website": "https://developer.android.com/jetpack/androidx/releases/window#1.0.0", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.accompanist:accompanist-drawablepainter", + "developers": [ + { + "name": "Google" + } + ], + "artifactVersion": "0.32.0", + "scm": { + "connection": "scm:git:git://github.com/google/accompanist.git", + "url": "https://github.com/google/accompanist/", + "developerConnection": "scm:git:git://github.com/google/accompanist.git" + }, + "name": "Accompanist Drawable Painter library", + "website": "https://github.com/google/accompanist/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.accompanist:accompanist-permissions", + "developers": [ + { + "name": "Google" + } + ], + "artifactVersion": "0.34.0", + "scm": { + "connection": "scm:git:git://github.com/google/accompanist.git", + "url": "https://github.com/google/accompanist/", + "developerConnection": "scm:git:git://github.com/google/accompanist.git" + }, + "name": "Accompanist Permissions", + "website": "https://github.com/google/accompanist/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.accompanist:accompanist-swiperefresh", + "developers": [ + { + "name": "Google" + } + ], + "artifactVersion": "0.34.0", + "scm": { + "connection": "scm:git:git://github.com/google/accompanist.git", + "url": "https://github.com/google/accompanist/", + "developerConnection": "scm:git:git://github.com/google/accompanist.git" + }, + "name": "Accompanist SwipeRefresh library", + "website": "https://github.com/google/accompanist/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.code.findbugs:jsr305", + "developers": [], + "artifactVersion": "3.0.2", + "scm": { + "connection": "scm:git:https://code.google.com/p/jsr-305/", + "url": "https://code.google.com/p/jsr-305/", + "developerConnection": "scm:git:https://code.google.com/p/jsr-305/" + }, + "name": "FindBugs-jsr305", + "website": "http://findbugs.sourceforge.net/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.dagger:dagger", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Dagger", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:dagger-compiler", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Dagger Compiler", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:dagger-lint-aar", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Dagger Lint Rules AAR Distribution", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:dagger-spi", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Dagger SPI", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:hilt-android", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Hilt Android", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:hilt-compiler", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Hilt Processor", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.dagger:hilt-core", + "developers": [], + "artifactVersion": "2.52", + "scm": { + "connection": "scm:git:git://github.com/google/dagger.git", + "url": "https://github.com/google/dagger/", + "developerConnection": "scm:git:ssh://git@github.com/google/dagger.git" + }, + "name": "Hilt Core", + "website": "https://github.com/google/dagger", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.google.com", + "name": "Google, Inc." + } + }, + { + "uniqueId": "com.google.devtools.ksp:symbol-processing-api", + "developers": [ + { + "name": "KSP Team" + } + ], + "artifactVersion": "1.9.24-1.0.20", + "scm": { + "connection": "scm:git:https://github.com/google/ksp.git", + "url": "https://github.com/google/ksp", + "developerConnection": "scm:git:https://github.com/google/ksp.git" + }, + "name": "com.google.devtools.ksp:symbol-processing-api", + "website": "https://goo.gle/ksp", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.errorprone:error_prone_annotations", + "developers": [], + "artifactVersion": "2.23.0", + "scm": { + "connection": "scm:git:https://github.com/google/error-prone.git", + "url": "https://github.com/google/error-prone", + "developerConnection": "scm:git:git@github.com:google/error-prone.git" + }, + "name": "error-prone annotations", + "website": "https://errorprone.info", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "http://www.google.com", + "name": "Google LLC" + } + }, + { + "uniqueId": "com.google.errorprone:javac-shaded", + "developers": [], + "artifactVersion": "9-dev-r4023-3", + "scm": { + "connection": "scm:git:git://github.com/google/error-prone-javac.git", + "url": "https://github.com/google/error-prone-javac", + "developerConnection": "scm:git:ssh://git@github.com/google/error-prone-javac.git" + }, + "name": "Error Prone shaded javac", + "website": "https://github.com/google/error-prone-javac", + "licenses": [ + "GPL-2.0-CPE" + ] + }, + { + "uniqueId": "com.google.googlejavaformat:google-java-format", + "developers": [], + "artifactVersion": "1.5", + "scm": { + "connection": "scm:git:git://github.com/google/google-java-format.git", + "url": "http://github.com/google/google-java-format/", + "developerConnection": "scm:git:ssh://git@github.com/google/google-java-format.git" + }, + "name": "Google Java Format", + "website": "https://github.com/google/google-java-format", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "http://www.google.com/", + "name": "Google Inc." + } + }, + { + "uniqueId": "com.google.guava:failureaccess", + "developers": [], + "artifactVersion": "1.0.2", + "scm": { + "connection": "scm:git:https://github.com/google/guava.git", + "url": "https://github.com/google/guava", + "developerConnection": "scm:git:git@github.com:google/guava.git" + }, + "name": "Guava InternalFutureFailureAccess and InternalFutures", + "website": "https://github.com/google/guava", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.guava:listenablefuture", + "developers": [], + "artifactVersion": "9999.0-empty-to-avoid-conflict-with-guava", + "scm": { + "connection": "scm:git:https://github.com/google/guava.git", + "url": "https://github.com/google/guava", + "developerConnection": "scm:git:git@github.com:google/guava.git" + }, + "name": "Guava ListenableFuture only", + "website": "https://github.com/google/guava", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.google.j2objc:j2objc-annotations", + "developers": [], + "artifactVersion": "2.8", + "scm": { + "connection": "scm:svn:http://svn.sonatype.org/spice/trunk/oss/oss-parenti-9", + "url": "http://svn.sonatype.org/spice/trunk/oss/oss-parent-9", + "developerConnection": "scm:svn:https://svn.sonatype.org/spice/trunk/oss/oss-parent-9" + }, + "name": "J2ObjC Annotations", + "website": "https://github.com/google/j2objc/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.mikepenz:aboutlibraries-compose-m3-android", + "developers": [ + { + "name": "Mike Penz" + } + ], + "artifactVersion": "11.2.2", + "scm": { + "connection": "scm:git@github.com:mikepenz/AboutLibraries.git", + "url": "https://github.com/mikepenz/AboutLibraries", + "developerConnection": "scm:git@github.com:mikepenz/AboutLibraries.git" + }, + "name": "AboutLibraries Compose Material 3 Library", + "website": "https://github.com/mikepenz/AboutLibraries", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.mikepenz:aboutlibraries-core-android", + "developers": [ + { + "name": "Mike Penz" + } + ], + "artifactVersion": "11.2.2", + "scm": { + "connection": "scm:git@github.com:mikepenz/AboutLibraries.git", + "url": "https://github.com/mikepenz/AboutLibraries", + "developerConnection": "scm:git@github.com:mikepenz/AboutLibraries.git" + }, + "name": "AboutLibraries Core Library", + "website": "https://github.com/mikepenz/AboutLibraries", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.positiondev.epublib:epublib-core", + "developers": [], + "artifactVersion": "3.1", + "scm": { + "connection": "scm:git:https://positiondev@github.com/psiegman/epublib.git", + "url": "http://github.com/psiegman/epublib", + "developerConnection": "scm:git:https://psiegman@github.com/psiegman/epublib.git" + }, + "name": "epublib-core", + "website": "https://github.com/positiondev/epublib", + "licenses": [ + "6fb32917bb7e4c664cf8e0ebb98d6215" + ] + }, + { + "uniqueId": "com.squareup.moshi:moshi", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "1.15.1", + "scm": { + "connection": "scm:git:git://github.com/square/moshi.git", + "url": "https://github.com/square/moshi/", + "developerConnection": "scm:git:ssh://git@github.com/square/moshi.git" + }, + "name": "moshi", + "website": "https://github.com/square/moshi/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.moshi:moshi-kotlin", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "1.15.1", + "scm": { + "connection": "scm:git:git://github.com/square/moshi.git", + "url": "https://github.com/square/moshi/", + "developerConnection": "scm:git:ssh://git@github.com/square/moshi.git" + }, + "name": "moshi-kotlin", + "website": "https://github.com/square/moshi/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.okhttp3:logging-interceptor", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "4.12.0", + "scm": { + "connection": "scm:git:https://github.com/square/okhttp.git", + "url": "https://github.com/square/okhttp", + "developerConnection": "scm:git:ssh://git@github.com/square/okhttp.git" + }, + "name": "okhttp-logging-interceptor", + "website": "https://square.github.io/okhttp/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.okhttp3:okhttp", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "4.12.0", + "scm": { + "connection": "scm:git:https://github.com/square/okhttp.git", + "url": "https://github.com/square/okhttp", + "developerConnection": "scm:git:ssh://git@github.com/square/okhttp.git" + }, + "name": "okhttp", + "website": "https://square.github.io/okhttp/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.okio:okio-jvm", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "3.9.0", + "scm": { + "connection": "scm:git:git://github.com/square/okio.git", + "url": "https://github.com/square/okio/", + "developerConnection": "scm:git:ssh://git@github.com/square/okio.git" + }, + "name": "okio", + "website": "https://github.com/square/okio/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.retrofit2:converter-moshi", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "2.11.0", + "scm": { + "connection": "scm:git:git://github.com/square/retrofit.git", + "url": "https://github.com/square/retrofit/", + "developerConnection": "scm:git:ssh://git@github.com/square/retrofit.git" + }, + "name": "Converter: Moshi", + "website": "https://github.com/square/retrofit", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup.retrofit2:retrofit", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "2.11.0", + "scm": { + "connection": "scm:git:git://github.com/square/retrofit.git", + "url": "https://github.com/square/retrofit/", + "developerConnection": "scm:git:ssh://git@github.com/square/retrofit.git" + }, + "name": "Retrofit", + "website": "https://github.com/square/retrofit", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.squareup:javapoet", + "developers": [], + "artifactVersion": "1.13.0", + "scm": { + "connection": "scm:git:git://github.com/square/javapoet.git", + "url": "http://github.com/square/javapoet/", + "developerConnection": "scm:git:ssh://git@github.com/square/javapoet.git" + }, + "name": "JavaPoet", + "website": "http://github.com/square/javapoet/", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "http://squareup.com", + "name": "Square, Inc." + } + }, + { + "uniqueId": "com.squareup:kotlinpoet", + "developers": [ + { + "name": "Square, Inc." + } + ], + "artifactVersion": "1.11.0", + "scm": { + "connection": "scm:git:https://github.com/square/kotlinpoet.git", + "url": "https://github.com/square/kotlinpoet", + "developerConnection": "scm:git:ssh://git@github.com/square/kotlinpoet.git" + }, + "name": "KotlinPoet", + "website": "https://github.com/square/kotlinpoet", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "com.tom-roush:pdfbox-android", + "developers": [ + { + "organisationUrl": "https://github.com/TomRoush/PdfBox-Android", + "name": "Tom Roush" + } + ], + "artifactVersion": "2.0.27.0", + "scm": { + "connection": "scm:git:git@github.com:TomRoush/PdfBox-Android.git", + "url": "https://github.com/TomRoush/PdfBox-Android", + "developerConnection": "scm:git:ssh@github.com:TomRoush/PdfBox-Android.git" + }, + "name": "PdfBox-Android", + "website": "https://github.com/TomRoush/PdfBox-Android", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt:coil", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "artifactVersion": "2.7.0", + "scm": { + "connection": "scm:git:git://github.com/coil-kt/coil.git", + "url": "https://github.com/coil-kt/coil", + "developerConnection": "scm:git:ssh://git@github.com/coil-kt/coil.git" + }, + "name": "coil", + "website": "https://github.com/coil-kt/coil", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt:coil-base", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "artifactVersion": "2.7.0", + "scm": { + "connection": "scm:git:git://github.com/coil-kt/coil.git", + "url": "https://github.com/coil-kt/coil", + "developerConnection": "scm:git:ssh://git@github.com/coil-kt/coil.git" + }, + "name": "coil-base", + "website": "https://github.com/coil-kt/coil", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt:coil-compose", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "artifactVersion": "2.7.0", + "scm": { + "connection": "scm:git:git://github.com/coil-kt/coil.git", + "url": "https://github.com/coil-kt/coil", + "developerConnection": "scm:git:ssh://git@github.com/coil-kt/coil.git" + }, + "name": "coil-compose", + "website": "https://github.com/coil-kt/coil", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "io.coil-kt:coil-compose-base", + "developers": [ + { + "name": "Coil Contributors" + } + ], + "artifactVersion": "2.7.0", + "scm": { + "connection": "scm:git:git://github.com/coil-kt/coil.git", + "url": "https://github.com/coil-kt/coil", + "developerConnection": "scm:git:ssh://git@github.com/coil-kt/coil.git" + }, + "name": "coil-compose-base", + "website": "https://github.com/coil-kt/coil", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "jakarta.inject:jakarta.inject-api", + "developers": [ + { + "name": "Antoine Sabot-Durand" + }, + { + "name": "Martin Kouba" + }, + { + "name": "Tomas Remes" + }, + { + "name": "Matej Novotny" + } + ], + "artifactVersion": "2.0.1", + "scm": { + "connection": "scm:git:ssh://git@github.com/eclipse-ee4j/injection-api.git", + "url": "https://github.com/eclipse-ee4j/injection-api", + "developerConnection": "scm:git:ssh://git@github.com/eclipse-ee4j/injection-api.git" + }, + "name": "Jakarta Dependency Injection", + "website": "https://github.com/eclipse-ee4j/injection-api", + "licenses": [ + "Apache-2.0" + ], + "organization": { + "url": "https://www.eclipse.org", + "name": "Eclipse Foundation" + } + }, + { + "uniqueId": "javax.inject:javax.inject", + "developers": [], + "artifactVersion": "1", + "scm": { + "url": "http://code.google.com/p/atinject/source/checkout" + }, + "name": "javax.inject", + "website": "http://code.google.com/p/atinject/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "net.ltgt.gradle.incap:incap", + "developers": [ + { + "name": "Thomas Broyer" + } + ], + "artifactVersion": "0.2", + "scm": { + "connection": "https://github.com/tbroyer/gradle-incap-helper.git", + "url": "https://github.com/tbroyer/gradle-incap-helper", + "developerConnection": "scm:git:ssh://github.com:tbroyer/gradle-incap-helper.git" + }, + "name": "net.ltgt.gradle.incap:incap", + "website": "https://github.com/tbroyer/gradle-incap-helper", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "net.sf.kxml:kxml2", + "developers": [], + "artifactVersion": "2.3.0", + "scm": { + "url": "http://kxml.cvs.sourceforge.net/viewvc/kxml/kxml2/" + }, + "name": "kXML 2 is a small XML pull parser based on the common XML pull API", + "website": "http://kxml.sourceforge.net/", + "licenses": [ + "5309f354a24aab8784aea0d124177696", + "dd92b2e83789846e31395ad6527ef2cd" + ], + "organization": { + "url": "http://kxml.sourceforge.net/", + "name": "Stefan Haustein, Oberhausen, Rhld., Germany" + } + }, + { + "uniqueId": "org.bouncycastle:bcpkix-jdk15to18", + "developers": [ + { + "name": "The Legion of the Bouncy Castle Inc." + } + ], + "artifactVersion": "1.72", + "scm": { + "url": "https://github.com/bcgit/bc-java" + }, + "name": "Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs", + "website": "http://www.bouncycastle.org/java.html", + "licenses": [ + "5730cfc0b0dbab8ff7dd4e65f19a3296" + ] + }, + { + "uniqueId": "org.bouncycastle:bcprov-jdk15to18", + "developers": [ + { + "name": "The Legion of the Bouncy Castle Inc." + } + ], + "artifactVersion": "1.72", + "scm": { + "url": "https://github.com/bcgit/bc-java" + }, + "name": "Bouncy Castle Provider", + "website": "http://www.bouncycastle.org/java.html", + "licenses": [ + "5730cfc0b0dbab8ff7dd4e65f19a3296" + ] + }, + { + "uniqueId": "org.bouncycastle:bcutil-jdk15to18", + "developers": [ + { + "name": "The Legion of the Bouncy Castle Inc." + } + ], + "artifactVersion": "1.72", + "scm": { + "url": "https://github.com/bcgit/bc-java" + }, + "name": "Bouncy Castle ASN.1 Extension and Utility APIs", + "website": "http://www.bouncycastle.org/java.html", + "licenses": [ + "5730cfc0b0dbab8ff7dd4e65f19a3296" + ] + }, + { + "uniqueId": "org.checkerframework:checker-compat-qual", + "developers": [ + { + "organisationUrl": "https://www.cs.washington.edu/", + "name": "Michael Ernst" + }, + { + "organisationUrl": "http://uwaterloo.ca/", + "name": "Werner M. Dietl" + }, + { + "organisationUrl": "https://www.cs.washington.edu/research/plse/", + "name": "Suzanne Millstein" + } + ], + "artifactVersion": "2.5.5", + "scm": { + "connection": "https://github.com/typetools/checker-framework.git", + "url": "https://github.com/typetools/checker-framework.git" + }, + "name": "Checker Qual", + "website": "https://checkerframework.org", + "licenses": [ + "da5e524a4235731b9b96281090f5f82d", + "MIT" + ] + }, + { + "uniqueId": "org.checkerframework:checker-qual", + "developers": [ + { + "organisationUrl": "https://www.cs.washington.edu/", + "name": "Michael Ernst" + }, + { + "organisationUrl": "https://www.cs.washington.edu/", + "name": "Suzanne Millstein" + } + ], + "artifactVersion": "3.41.0", + "scm": { + "connection": "scm:git:https://github.com/typetools/checker-framework.git", + "url": "https://github.com/typetools/checker-framework.git", + "developerConnection": "scm:git:ssh://git@github.com/typetools/checker-framework.git" + }, + "name": "Checker Qual", + "website": "https://checkerframework.org/", + "licenses": [ + "MIT" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-android-extensions-runtime", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "2.0.0", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Kotlin Android Extensions Runtime", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-parcelize-runtime", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "2.0.0", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Parcelize Runtime", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-reflect", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "1.8.21", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Kotlin Reflect", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "2.0.0", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Kotlin Stdlib", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "1.9.0", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Kotlin Stdlib Jdk7", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "Kotlin Team" + } + ], + "artifactVersion": "1.9.0", + "scm": { + "connection": "scm:git:https://github.com/JetBrains/kotlin.git", + "url": "https://github.com/JetBrains/kotlin", + "developerConnection": "scm:git:https://github.com/JetBrains/kotlin.git" + }, + "name": "Kotlin Stdlib Jdk8", + "website": "https://kotlinlang.org/", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "0.3.7", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.collections.immutable" + }, + "name": "kotlinx-collections-immutable", + "website": "https://github.com/Kotlin/kotlinx.collections.immutable", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.8.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.coroutines" + }, + "name": "kotlinx-coroutines-android", + "website": "https://github.com/Kotlin/kotlinx.coroutines", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-coroutines-bom", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.8.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.coroutines" + }, + "name": "kotlinx-coroutines-bom", + "website": "https://github.com/Kotlin/kotlinx.coroutines", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.8.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.coroutines" + }, + "name": "kotlinx-coroutines-core", + "website": "https://github.com/Kotlin/kotlinx.coroutines", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-bom", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.7.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.serialization" + }, + "name": "kotlinx-serialization-bom", + "website": "https://github.com/Kotlin/kotlinx.serialization", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-core-jvm", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.7.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.serialization" + }, + "name": "kotlinx-serialization-core", + "website": "https://github.com/Kotlin/kotlinx.serialization", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "1.7.1", + "scm": { + "url": "https://github.com/Kotlin/kotlinx.serialization" + }, + "name": "kotlinx-serialization-json", + "website": "https://github.com/Kotlin/kotlinx.serialization", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jetbrains:annotations", + "developers": [ + { + "organisationUrl": "https://www.jetbrains.com", + "name": "JetBrains Team" + } + ], + "artifactVersion": "23.0.0", + "scm": { + "connection": "scm:git:git://github.com/JetBrains/java-annotations.git", + "url": "https://github.com/JetBrains/java-annotations", + "developerConnection": "scm:git:ssh://github.com:JetBrains/java-annotations.git" + }, + "name": "JetBrains Java Annotations", + "website": "https://github.com/JetBrains/java-annotations", + "licenses": [ + "Apache-2.0" + ] + }, + { + "uniqueId": "org.jsoup:jsoup", + "developers": [ + { + "name": "Jonathan Hedley" + } + ], + "artifactVersion": "1.18.1", + "scm": { + "connection": "scm:git:https://github.com/jhy/jsoup.git", + "url": "https://github.com/jhy/jsoup" + }, + "name": "jsoup Java HTML Parser", + "website": "https://jsoup.org/", + "licenses": [ + "MIT" + ], + "organization": { + "url": "https://jhy.io/", + "name": "Jonathan Hedley" + } + }, + { + "uniqueId": "sh.calvin.reorderable:reorderable-android", + "developers": [ + { + "name": "Calvin Liang" + } + ], + "artifactVersion": "2.3.0", + "scm": { + "connection": "scm:git:git://github.com/Calvin-LL/Reorderable.git", + "url": "https://github.com/Calvin-LL/Reorderable", + "developerConnection": "scm:git:ssh://github.com/Calvin-LL/Reorderable.git" + }, + "name": "Reorderable", + "website": "https://github.com/Calvin-LL/Reorderable", + "licenses": [ + "Apache-2.0" + ] + } + ], + "licenses": { + "5309f354a24aab8784aea0d124177696": { + "hash": "5309f354a24aab8784aea0d124177696", + "url": "http://kxml.cvs.sourceforge.net/viewvc/kxml/kxml2/license.txt?view=markup", + "name": "BSD style" + }, + "5730cfc0b0dbab8ff7dd4e65f19a3296": { + "hash": "5730cfc0b0dbab8ff7dd4e65f19a3296", + "url": "http://www.bouncycastle.org/licence.html", + "name": "Bouncy Castle Licence" + }, + "6fb32917bb7e4c664cf8e0ebb98d6215": { + "hash": "6fb32917bb7e4c664cf8e0ebb98d6215", + "url": "http://www.gnu.org/licenses/lgpl.html", + "name": "LGPL" + }, + "Apache-2.0": { + "content": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n\"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n\"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n\"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n\"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n\"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n\"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n\"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n\"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n\"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.", + "hash": "Apache-2.0", + "internalHash": "Apache-2.0", + "url": "https://spdx.org/licenses/Apache-2.0.html", + "spdxId": "Apache-2.0", + "name": "Apache License 2.0" + }, + "GPL-2.0-CPE": { + "hash": "GPL-2.0-CPE", + "internalHash": "GPL-2.0-CPE", + "url": "http://openjdk.java.net/legal/gplv2+ce.html", + "spdxId": "GPL-2.0-CPE", + "name": "GNU General Public License, version 2, with the Classpath Exception" + }, + "MIT": { + "content": "MIT License\n\nCopyright (c) \n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "hash": "MIT", + "internalHash": "MIT", + "url": "https://spdx.org/licenses/MIT.html", + "spdxId": "MIT", + "name": "MIT License" + }, + "da5e524a4235731b9b96281090f5f82d": { + "hash": "da5e524a4235731b9b96281090f5f82d", + "url": "http://www.gnu.org/software/classpath/license.html", + "name": "GNU General Public License, version 2 (GPL2), with the classpath exception" + }, + "dd92b2e83789846e31395ad6527ef2cd": { + "hash": "dd92b2e83789846e31395ad6527ef2cd", + "url": "http://creativecommons.org/licenses/publicdomain", + "name": "Public Domain" + } + } +} \ No newline at end of file From 75587b46aa558bed99277c071c923a518caa45ee Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 19:10:19 +0300 Subject: [PATCH 37/46] Fix: Crash in BookInfo. --- app/build.gradle.kts | 2 +- app/src/main/res/raw/aboutlibraries.json | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 583d00f6..74b7bdc3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -76,6 +76,7 @@ android { aboutLibraries { registerAndroidTasks = false + prettyPrint = true gitHubApiToken = gradleLocalProperties(rootDir, providers)["github-key"] as? String filterVariants = arrayOf("debug", "release", "release-debug") @@ -136,7 +137,6 @@ dependencies { // Epub parser implementation("com.positiondev.epublib:epublib-core:3.1") { - exclude("org.slf4j") exclude("xmlpull") } implementation("org.jsoup:jsoup:1.18.1") diff --git a/app/src/main/res/raw/aboutlibraries.json b/app/src/main/res/raw/aboutlibraries.json index 59254927..a22da1d1 100644 --- a/app/src/main/res/raw/aboutlibraries.json +++ b/app/src/main/res/raw/aboutlibraries.json @@ -2856,6 +2856,24 @@ "name": "Jonathan Hedley" } }, + { + "uniqueId": "org.slf4j:slf4j-api", + "developers": [], + "artifactVersion": "1.7.36", + "scm": { + "connection": "git@github.com:qos-ch/slf4j.git", + "url": "https://github.com/qos-ch/slf4j" + }, + "name": "SLF4J API Module", + "website": "http://www.slf4j.org", + "licenses": [ + "MIT" + ], + "organization": { + "url": "http://www.qos.ch", + "name": "QOS.ch" + } + }, { "uniqueId": "sh.calvin.reorderable:reorderable-android", "developers": [ From 69a72c59fcf1c5fc4bf0fe8d6b546acb61ce3ad2 Mon Sep 17 00:00:00 2001 From: acclorite Date: Wed, 7 Aug 2024 19:24:05 +0300 Subject: [PATCH 38/46] Fix: Crash in BookInfo. (When deleting cover image) --- .../data/repository/BookRepositoryImpl.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt index 1106263f..9f4f88ce 100644 --- a/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt +++ b/app/src/main/java/ua/acclorite/book_story/data/repository/BookRepositoryImpl.kt @@ -401,10 +401,15 @@ class BookRepositoryImpl @Inject constructor( val byteArray = stream.toByteArray() val defaultCover = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) - val currentCover = MediaStore.Images.Media.getBitmap( - application.contentResolver, - Uri.parse(book.image) - ) + val currentCover = try { + MediaStore.Images.Media.getBitmap( + application.contentResolver, + Uri.parse(book.image) + ) + } catch (e: Exception) { + e.printStackTrace() + return true + } return !defaultCover.sameAs(currentCover) } From a86163360dd53619701203555ef0fae37c1fc445 Mon Sep 17 00:00:00 2001 From: acclorite Date: Thu, 8 Aug 2024 14:43:38 +0300 Subject: [PATCH 39/46] AboutScreen: Added loading indicator to "Check For Updates". --- .../presentation/screens/about/AboutScreen.kt | 47 +++++++++------ .../screens/about/components/AboutItem.kt | 60 ++++++++++++++----- .../screens/about/data/AboutState.kt | 2 + .../screens/about/data/AboutViewModel.kt | 17 ++++++ .../book_story/presentation/ui/Transitions.kt | 24 ++++++++ 5 files changed, 116 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt index d7ea1bc5..69426805 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/AboutScreen.kt @@ -144,27 +144,36 @@ private fun AboutScreen( ) append("\n") append(stringResource(id = R.string.app_version_option_desc_2)) - } + }, + showLoading = state.value.updateLoading ) { - onEvent( - AboutEvent.OnCheckForUpdates( - context = context, - noUpdatesFound = { - Toast.makeText( - context, - context.getString(R.string.no_updates), - Toast.LENGTH_LONG - ).show() - }, - error = { - Toast.makeText( - context, - context.getString(R.string.error_check_internet), - Toast.LENGTH_LONG - ).show() - } + if (!state.value.alreadyCheckedForUpdates) { + onEvent( + AboutEvent.OnCheckForUpdates( + context = context, + noUpdatesFound = { + Toast.makeText( + context, + context.getString(R.string.no_updates), + Toast.LENGTH_LONG + ).show() + }, + error = { + Toast.makeText( + context, + context.getString(R.string.error_check_internet), + Toast.LENGTH_LONG + ).show() + } + ) ) - ) + } else { + Toast.makeText( + context, + context.getString(R.string.no_updates), + Toast.LENGTH_LONG + ).show() + } } } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt index b8a7af7e..3628ca91 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt @@ -1,22 +1,38 @@ package ua.acclorite.book_story.presentation.screens.about.components import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import ua.acclorite.book_story.presentation.ui.FadeTransitionPreservingSpace /** - * About screen item. + * About Screen Item. + * Clickable item, that has title, description and loading state. + * + * @param modifier [Modifier]. + * @param title Title of the item. + * @param description Description of the item. + * @param verticalPadding Vertical item padding. + * @param showLoading Whether loading indicator is shown. + * @param isOnClickEnabled Whether this item is clickable. + * @param onClick OnClick callback. */ @Composable fun AboutItem( @@ -24,31 +40,45 @@ fun AboutItem( title: String, description: AnnotatedString?, verticalPadding: Dp = 12.dp, + showLoading: Boolean = false, isOnClickEnabled: Boolean = true, onClick: () -> Unit = {} ) { - Column( + Row( modifier .fillMaxWidth() .clickable(enabled = isOnClickEnabled) { onClick() } .padding(horizontal = 18.dp, vertical = verticalPadding), - verticalArrangement = Arrangement.Center + verticalAlignment = Alignment.CenterVertically ) { - Text( - title, - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface, - fontSize = 18.sp - ) - description?.let { + Column(Modifier.weight(1f)) { Text( - it, - overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, + title, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, + fontSize = 18.sp ) + description?.let { + Text( + it, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + + FadeTransitionPreservingSpace(visible = showLoading) { + Row { + Spacer(modifier = Modifier.width(18.dp)) + CircularProgressIndicator( + color = MaterialTheme.colorScheme.onSurface, + strokeCap = StrokeCap.Round, + modifier = Modifier.size(28.dp) + ) + } } } } \ No newline at end of file diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutState.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutState.kt index 3c32b2e4..4e52a750 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutState.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutState.kt @@ -6,5 +6,7 @@ import ua.acclorite.book_story.data.remote.dto.LatestReleaseInfo @Immutable data class AboutState( val showUpdateDialog: Boolean = false, + val alreadyCheckedForUpdates: Boolean = false, + val updateLoading: Boolean = false, val updateInfo: LatestReleaseInfo? = null ) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt index f8aa69d2..ce37344d 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/data/AboutViewModel.kt @@ -40,9 +40,19 @@ class AboutViewModel @Inject constructor( is AboutEvent.OnCheckForUpdates -> { viewModelScope.launch { + _state.update { + it.copy( + updateLoading = true + ) + } val result = checkForUpdates.execute(false) if (result == null) { + _state.update { + it.copy( + updateLoading = false + ) + } event.error() return@launch } @@ -52,12 +62,19 @@ class AboutViewModel @Inject constructor( if (version == currentVersion) { event.noUpdatesFound() + _state.update { + it.copy( + updateLoading = false, + alreadyCheckedForUpdates = true + ) + } return@launch } _state.update { it.copy( showUpdateDialog = true, + updateLoading = false, updateInfo = result ) } diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt b/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt index 2f532141..17069035 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt @@ -1,5 +1,8 @@ package ua.acclorite.book_story.presentation.ui +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.EaseInOut +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -8,8 +11,11 @@ import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.layout.Box import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import ua.acclorite.book_story.presentation.components.CustomAnimatedVisibility @@ -86,4 +92,22 @@ fun SlidingTransition( } + fadeOut(tween(100)), content = content ) +} + +@Composable +fun FadeTransitionPreservingSpace( + visible: Boolean, + modifier: Modifier = Modifier, + animationSpec: AnimationSpec = tween(durationMillis = 300, easing = EaseInOut), + content: @Composable () -> Unit +) { + val alpha by animateFloatAsState( + if (visible) 1f else 0f, + label = "", + animationSpec = animationSpec + ) + + Box(modifier = modifier.alpha(alpha)) { + content.invoke() + } } \ No newline at end of file From 21f632792e2dae095ef9fc2be50f9688ae21b91f Mon Sep 17 00:00:00 2001 From: acclorite Date: Thu, 8 Aug 2024 17:08:43 +0300 Subject: [PATCH 40/46] AboutScreen: Changed loading indicator color. --- .../presentation/screens/about/components/AboutItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt index 3628ca91..72a843eb 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/screens/about/components/AboutItem.kt @@ -74,7 +74,7 @@ fun AboutItem( Row { Spacer(modifier = Modifier.width(18.dp)) CircularProgressIndicator( - color = MaterialTheme.colorScheme.onSurface, + color = MaterialTheme.colorScheme.onSurfaceVariant, strokeCap = StrokeCap.Round, modifier = Modifier.size(28.dp) ) From 4ea0969e4cf4e0921e8ae861baa72e5ba2f05b11 Mon Sep 17 00:00:00 2001 From: acclorite Date: Thu, 8 Aug 2024 17:17:39 +0300 Subject: [PATCH 41/46] AboutScreen: Sped up appearing of loading indicator. --- .../java/ua/acclorite/book_story/presentation/ui/Transitions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt b/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt index 17069035..b6c943b6 100644 --- a/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt +++ b/app/src/main/java/ua/acclorite/book_story/presentation/ui/Transitions.kt @@ -98,7 +98,7 @@ fun SlidingTransition( fun FadeTransitionPreservingSpace( visible: Boolean, modifier: Modifier = Modifier, - animationSpec: AnimationSpec = tween(durationMillis = 300, easing = EaseInOut), + animationSpec: AnimationSpec = tween(durationMillis = 150, easing = EaseInOut), content: @Composable () -> Unit ) { val alpha by animateFloatAsState( From 6fdd5f1c1046cb4d7b3d8c1b35e60e864a008dc1 Mon Sep 17 00:00:00 2001 From: acclorite Date: Thu, 8 Aug 2024 17:55:31 +0300 Subject: [PATCH 42/46] Release v1.1.1 --- app/build.gradle.kts | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 74b7bdc3..2da37ee4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ android { applicationId = "ua.acclorite.book_story" minSdk = 26 targetSdk = 34 - versionCode = 5 - versionName = "1.1.0" + versionCode = 6 + versionName = "1.1.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a9b7b58..86cbf832 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - 1.1.0 + 1.1.1 Book\'s Story From d842a48c3528ea4d308452ae8ddda3df856e4fcf Mon Sep 17 00:00:00 2001 From: Acclorite <140836141+Acclorite@users.noreply.github.com> Date: Thu, 8 Aug 2024 22:32:57 +0300 Subject: [PATCH 43/46] Update README.md (How to contribute) --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 249e886c..b45fb50d 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,15 @@ _Don't see your favorite app store? Create an [Issue](https://github.com/Acclori - English (Default) - Ukrainian (Default) + + +## 🤝 How to contribute + - **The most improtant thing is I do not want someone's code.** This project is maintaining only by me and I want it to be this way. Creating Pull Requests will not have much sense as they will probably be closed. + - **Share your ideas and suggestions.** Your ideas and suggestions are always welcome, if you miss some feature or got an interesting idea, feel free to create a new [Issue](https://github.com/Acclorite/book-story/issues). + - **Report bugs**. Had a crash or something went wrong? Create a new [Issue](https://github.com/Acclorite/book-story/issues), the more information you can give the better it is. + - **Enjoy the app**. Your best contribution is using my app and enjoying it! + - _**About localization**. Planning to implement localiztion platform, so users can do what I physically cannot - translate the app on multiple languages. You can find more information about this in the corresponding issue([#22](https://github.com/Acclorite/book-story/issues/22))._ + ## 🤗 Credits From c4ad8edf6f08c1851f50c97907e9f956ac7f8997 Mon Sep 17 00:00:00 2001 From: acclorite Date: Fri, 9 Aug 2024 22:34:14 +0300 Subject: [PATCH 44/46] Fixed: Release-debug build does not apply Release build properties. --- app/build.gradle.kts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2da37ee4..5f53aad4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -36,18 +36,19 @@ android { getByName("debug") { applicationIdSuffix = ".debug" } - create("release-debug") { - initWith(getByName("release")) - applicationIdSuffix = ".release.debug" - signingConfig = signingConfigs.getByName("debug") - } - + getByName("release") { isMinifyEnabled = true isShrinkResources = false proguardFiles("proguard-rules.pro") } + + create("release-debug") { + initWith(getByName("release")) + applicationIdSuffix = ".release.debug" + signingConfig = signingConfigs.getByName("debug") + } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 From 1368422175d87390557392655fa5418320341c2b Mon Sep 17 00:00:00 2001 From: acclorite Date: Sat, 10 Aug 2024 00:34:26 +0300 Subject: [PATCH 45/46] Fixed: Issue with displaying .xml files (crash). --- app/proguard-rules.pro | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c0af59e0..916b402e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -36,5 +36,10 @@ -dontwarn org.slf4j.LoggerFactory -dontwarn org.xmlpull.v1.XmlPullParserFactory +# Fixes issue with displaying .xml files, but may produce reproducibility issues +-keep class org.xmlpull.** { *; } +-keepclassmembers class org.xmlpull.** { *; } + # Keeping names of classes that produce undeterministic results --keepnames class ** \ No newline at end of file +-keepnames class ** +-keepnames class kotlin.reflect.jvm.internal.impl.builtins.PrimitiveType { values(); } \ No newline at end of file From 3dcf849d5540cd77080fb3786e2838401e1a25c3 Mon Sep 17 00:00:00 2001 From: acclorite Date: Sat, 10 Aug 2024 10:54:54 +0300 Subject: [PATCH 46/46] Keeping the name of org.xmlpull.** --- app/proguard-rules.pro | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 916b402e..0314c8fc 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -42,4 +42,6 @@ # Keeping names of classes that produce undeterministic results -keepnames class ** +-keepnames class org.xmlpull.** { *; } +-keepclassmembernames class org.xmlpull.** { *; } -keepnames class kotlin.reflect.jvm.internal.impl.builtins.PrimitiveType { values(); } \ No newline at end of file