From 3abd40e726c3c53f15a155b7b554f02ecc0f4381 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 26 Jan 2021 14:03:01 +0100 Subject: [PATCH 01/38] Recreate CryptoBot assets and create new yellow assets for debug build --- .../res/drawable/ic_launcher_background.xml | 78 ++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ++ .../src/debug/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3420 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4886 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5741 bytes .../src/debug/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2158 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 3070 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3485 bytes .../debug/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4805 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 6847 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 8130 bytes .../debug/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7312 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 11209 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12596 bytes .../debug/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10299 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 16309 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 17810 bytes .../res/values/ic_launcher_background.xml | 4 + presentation/src/debug/res/values/strings.xml | 6 -- .../service/AutoUploadNotification.kt | 2 +- .../service/OpenWritableFileNotification.kt | 2 +- .../service/UnlockedNotification.java | 2 +- .../res/drawable/ic_launcher_background.xml | 78 ++++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ++ .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 31009 -> 3281 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4886 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5394 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 17817 -> 2077 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 3070 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3278 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 45686 -> 4532 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 6847 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7653 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 92045 -> 6943 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 11209 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11905 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 156986 -> 9790 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 16309 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16846 bytes .../res/values/ic_launcher_background.xml | 4 + 42 files changed, 187 insertions(+), 9 deletions(-) create mode 100644 presentation/src/debug/res/drawable/ic_launcher_background.xml create mode 100644 presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 presentation/src/debug/res/mipmap-hdpi/ic_launcher.png create mode 100644 presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 presentation/src/debug/res/mipmap-mdpi/ic_launcher.png create mode 100644 presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png create mode 100644 presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 presentation/src/debug/res/values/ic_launcher_background.xml delete mode 100644 presentation/src/debug/res/values/strings.xml create mode 100644 presentation/src/main/res/drawable/ic_launcher_background.xml create mode 100644 presentation/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 presentation/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 presentation/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 presentation/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 presentation/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 presentation/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 presentation/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 presentation/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 presentation/src/main/res/values/ic_launcher_background.xml diff --git a/presentation/src/debug/res/drawable/ic_launcher_background.xml b/presentation/src/debug/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..adffe5a8 --- /dev/null +++ b/presentation/src/debug/res/drawable/ic_launcher_background.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..06ba50014240c9d3a847a528aa8caf8a104639c5 GIT binary patch literal 3420 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..b31fd7408f4fd080d5728b1d052214053d2ea511 GIT binary patch literal 4886 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..59b67a34a3008bb3b12b6a84333edf2c81351d40 GIT binary patch literal 5741 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c41cd4c2f124b5f53f94204d684ffd9b414e2b GIT binary patch literal 2158 zcmV-!2$A=RP)4*|TGV$ zd1mGvH@9Ce7rt=OZ3wh(L!D|w!%r6ux8G88nU4G^db+PN{4ZThhTt& zRD&aJKPbMnWzw@xjJ%Q#j@S0sz_U5isD=&$uY_v)QHZC7?RwtP4kHib1ukQE8+gZv zwBPg!@HALjwWG!pfNyA}b|dfG$41_F?M|}Jw!fvFd0*-Nu%YzXiQTpK1RxPle=XD4HTeN$?G_qKk}9CS{(w&4v(5))AQP05uj|x$eDcuaM2Msk~ebJ zpa8TRCg6c_7VdJ1xNS5 zS^y7>bBK5uDlXL`a#vM zV3iPonL_w2CS}RQ;+LVQ;+t z-Xp!ddee4neWwV=&tAYKNgZlQS@q?5)X9~&(rm;n^I9@LOdMPQo8dWpq7k7<@fNO_ zrKmU6qgZngZ#TY;Es8DJN}lgm@5dSa8K})_NKH~4(j3Ol#+~?!Vk@>Ox1ms7h|`8M zuvj@<(d469xe51mzAPONIKXYwQkYB}y8Vb{1cgfV9i$NU0S#EEh^e z&^76xP$;0)YH`hc0gsH62O3}uK5g2A=H_N5-e54GR9ni#IuaRI9q;%#vGlqOG6EK; zR4Vqq=4LBNt=_#B=gE+h*2*s2+L73tb zgs_9rb^xpE)}YyH!gclQI9j$BQOnoBaKW36@_+!?43l6X!5Y0H8^X0|u<1wRy7dF> zZro!hjsYzG9$>030r;CeK&nItO_LJ$xLDMk41#~cGVD80jIT_BfdRN{N+Lbh#Fh+N zbp?BN&02>%Wu8MH4?h-z84)3vw>2EGm+Z@zNK&CN*Au}hxNQ`mN+N~9NLQ_=NHD+H ze*o>oZq!bKqGoevuvtj{UdI}^VW~jAD&HXh_4^r-AqXvu>NN}LEo!!kwHaT)hgJ!D zzfmuTx-tm&Rpa^xprL#^7N;d3d!rDC%1WS+?q}{q%RXz`h0`S8C)Os}35+@w%iPC* zeVD^+lq=6A`vxtUjidDHj=jv@-FRvmQq$vcz2*hnYM6lKYh%gi_XB|C;$&t8 zyXPWdc_M32MS5#)qL3|@aY-pS3x_gY88YiuGvRbCL>F>$a|7xd6j-+QkMQyf!ORFjk4`XDP92=pXsdc0 zLQ+z@0f-m?4OlO~1vpZ?6dzfRvUDpm$-t2nC*3crrCTsJBI5hW%_kT$!&7&aaVnx zxTS2a8Jzt9iHCw+b9(^1G(QraMAXWRVBC~H=Wugk(~ZWSJYT##FBD#6#AZi}y6V%w zr5!V9JF+iHkkLR+T#*Pqv3PMTHvVZIKCOHHhj(x!NZ;Q(8}Xt@R*xDLZ>X5sk2|tH ze%z(O{JHFTeAa1HTwnIkG>iSa{(tpo_UX5eyNc3Le{j{0yQMouc=ry_d1!F9aJa`K zE$}lH%wLIvL zkE$lxhWF)+Y)IgoVKa4QBPBQM+}ppB^Pb#kaPOeMgK1COyd`sQR~;Q8_4gh|-DgN& zPb!BK^9-LqG%_vm_etUy=NN5!QP9vRs^v#}|NkLGBDZ1Wb_6kZC))_BS kb^Dz&t=EA4^>UHxzZM{ZOB;Od+5i9m07*qoM6N<$g1=o3Qvd(} literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6f85a129cc69527005168cbf96204ae48fd8aa4a GIT binary patch literal 3070 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..18359374e0d6279133df8f7e50cd4bcb4451f664 GIT binary patch literal 3485 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 LNkvXXu0mjfUB;yA literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7d27c2e34a95c18fd757c27db3a653e330b5b5 GIT binary patch literal 4805 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9a5fc933ab9734e3f5473f84e9b454e4ae0534 GIT binary patch literal 6847 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 IvKFEL58~T2Q2+n{ literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3b928c522218084c55fa7b4339478f95f6d47d4a GIT binary patch literal 8130 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8db4eec80f118756e51908680359d5a120b11850 GIT binary patch literal 7312 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bd6bc45d22ca2a0ab04548c32278b4efe80da984 GIT binary patch literal 11209 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 HK1BQ<^aktm literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb1063770a2983f1e1dce2c524d8ba3a142f4c7 GIT binary patch literal 12596 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

xH^NouF<|N2n`P?(5P~ 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%0DV;U?MF%u)2-lB85Z}gk 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 Tyc`w(rb9tSRl4?r`RD%uuO02g literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..aaaeac567530ee74a87aa8be91b24aa81eab76ae GIT binary patch literal 17810 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 literal 0 HcmV?d00001 diff --git a/presentation/src/debug/res/values/ic_launcher_background.xml b/presentation/src/debug/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..e50a17c8 --- /dev/null +++ b/presentation/src/debug/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #F1C40F + \ No newline at end of file diff --git a/presentation/src/debug/res/values/strings.xml b/presentation/src/debug/res/values/strings.xml deleted file mode 100644 index 1ad426c7..00000000 --- a/presentation/src/debug/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - Debug Cryptomator - - diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt b/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt index 08219fec..9d8abcfc 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt @@ -34,7 +34,7 @@ class AutoUploadNotification(private val context: Context, private val amountOfP this.builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) // .setContentTitle(context.getString(R.string.notification_auto_upload_title)) // - .setSmallIcon(R.mipmap.ic_launcher) // + .setSmallIcon(R.drawable.background_splash_cryptomator) // .setColor(getColor(R.color.colorPrimary)) // .addAction(cancelNowAction()) .setGroup(NOTIFICATION_GROUP_KEY) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt b/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt index 5b81fa80..ad414e27 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt @@ -35,7 +35,7 @@ class OpenWritableFileNotification(private val context: Context, private val uri this.builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) // .setContentTitle(context.getString(R.string.notification_open_writable_file_title)) // .setContentText(context.getString(R.string.notification_open_writable_file_message)) // - .setSmallIcon(R.mipmap.ic_launcher) // + .setSmallIcon(R.drawable.background_splash_cryptomator) // .setColor(getColor(R.color.colorPrimary)) // .setGroup(NOTIFICATION_GROUP_KEY) .setOngoing(true) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java b/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java index d8c53ba2..5b50e415 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java +++ b/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java @@ -54,7 +54,7 @@ class UnlockedNotification { } this.builder = new NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID) // - .setSmallIcon(R.mipmap.ic_launcher) // + .setSmallIcon(R.drawable.background_splash_cryptomator) // .setColor(ResourceHelper.Companion.getColor(R.color.colorPrimary)) // .addAction(lockNowAction()) // .setGroup(NOTIFICATION_GROUP_KEY) // diff --git a/presentation/src/main/res/drawable/ic_launcher_background.xml b/presentation/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..adffe5a8 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/presentation/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/main/res/mipmap-hdpi/ic_launcher.png b/presentation/src/main/res/mipmap-hdpi/ic_launcher.png index 3a0dc83f0798d6461f485d6133a14ba715670163..74979acb5c9f2d6c583e1200a7638a11eb84b6e5 100644 GIT binary patch delta 3279 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 N002ovPDHLkV1hWEO5Fee literal 31009 zcmeHvcRbhK`~T}b@V2+CWG5?I5s|IP3=vAhs+5$G60$;~Qj(n=QX(OgQQ5PQ%T}h@8|;QOl< zvZOJoTnU|~l*xVOs zcEQ2*dVK-G;!0Pao7#!Mi&L& z({Wp_qmF9Cs$@Q!>k8A@P{)hXdwZ7v0_2lLg%Y z{5G0n7NwDIE?*rRTB={D&nZ!QB~cr`Y$P~MVKl;Y_T6DmrmCgf;w~!tU5_TkOKIy} z9zI}nF;QbHU!*>jnv^i&qq^@}BA034i!`phso4t!w2UX(uUsfCEJ8-khwdI7GhH5A zUT}zVxs}T{KWp(zes;#=Wpy>% zal*?z2b|An=B3XMFDHoY`S1~yp&0($PMD1nahmOxc~LXH4JOrsL)L@u`nEDP^qy^J z2rl?)s4Lqg;#XCkuyz~^;JRdre-NXncAGbPz=|R@oOnUkp2J&NjqACN->riO2aXwL z+Llx#6UHiQh&SszY-+Jik9~04*s96e=3#cN#eO-%fu@w9hjX&{TQ@U1j}H_{m))i6Ps^)sIvoZy6Xp9kfnKf7GpcZ}Q{Ql-84TGMYQ$>Ru->OV2#1ug>Xd(UAOj zcBHBG)QfI|h5~J@eM7Ms`&_j)@yEn%M;7waS183z(`Nc8*VTd?<@9?%|hQ_WQ8q#!^|%v*6X(oRZ6%b|%zdSAD{D z`wMO?HRoV88fG2+gH7G^t{&8l6f7)d(qwu>dZzC3Qp!>!OUEi!&K^~LxcSzi<{6FR zEJC^RkXvdOJ{5hKMeT{8Zmzm8$E0Fa8QRp$_E2+XAe?l2>7k+f1ML!3VF!Fk4l`v% zFve3pG)iyHiw>;s^TQTDxNAS^sLl~0$&lgHEOafUOhl5BgK3CAJZ>b3`hfI>)^pO4 zZ7Kue%x_0bipABu^;M6w=LuTAQztB&bMd~uxL{}BHqOgbK5Y?48(hCV5o0h{`Ve(;!SWf?0Q1VcnSNIa_?pVNjGP5T`m7>XDwx?kZWIUcf8`L65BIEQ1hjI?Jn zpH;NE@}4|t%*uNvMIidI^x|~G47ydTP*Wkh+$oLoM5^zCeW6f#Af@TK@w=KG&=&X1Q-=Z@58)(5=BIK(Jvl`@AO zi{^KGEPZ09>IDzo)Id$F0MFzRV+pP2n)hCZKyH)>v!q)HMI&X>4|`r=x}Pd=hjdXc z8w#ffCho$Q(S6)1*>v)m28Lq+>3IJ@ACLMCyqt`iZ9Z3@oy}AqzQRRxfxxdJ_@nNw zecBO)M|wJP#0ogj7sj4{N|lzoQp4R$I*d=Jp1?RzSi|omrQ4jtxhwzC5exmag4}aD zks;{*{!`}R&p9kgWfe;>>~rs$hQkY%S{^XkdY-XI$a7m;#xCV}3}ObfEBDD_rWI-R zPXrLpG>FV%GIz3W@eyL&BAwN9JdSSl%|q-(hs&;=kuMGsERktng7&>~iRwSQ`_n7o zUVij&zxu^<3R87_Ci_|}BIHfmO0q>>1Qi)cdgOEJ-?bNiLM%s}>%kFp(9+v08uN@L zrVQygU4dYWuB=mYs4);h9p2N^fmcjq8q_QINpAz5<2U`cWV25$Ti@iHxa0A} z2Tu{5_3-7jP+I?6<|wK+Ay1kWJ1e9aGrb(H%Am5*4hWx0YHX~FJk9<7ZNf#i5e=AK z)D~N}p|rUms{|(eG14+^YM1VWn%Oo}Mb@HcLJe}>lm$2W91+G3Sf)ydV%wsIJrAPZ zFrCIRr!QD7i-svv-u^BrE8O}%>v)&X zbJcs=vzFsGPYCIr)s^Xq%f;KKW$N}3-^}P`=2T7z*&Jsgm-JDx+M6}}eDw>rr!YlD z<4kYltC?<&9Hvn{^+d^NtJ}_4!`f(0=}Q3}1eQ^c!ldarcfRh{Ql+>ZWMJ?}4(S+0 z-g_t`#Drkl3Lccar;^QIKD*d^WJ_~Ua~7sP=G8|ZGIn~8VP#?DK5wQE>_nIQ z(oD%>PSRx^J)*72ZlXv}Ekt3`(4mYPv8Qw)d!{CjILYI5(^Sb~bGvaZl;XZjGiQ4A zK=+DPCc&eUEBHy5BzsG`qRn^uD4bwaPqf&Nl4Gzv)oR5-W(ddt!4I+bJUzCP9Vtt=zYBuLfZqk&khnEU<}puXmN?I zrOS7w)aztatPcdN1I|F zlgGK6?|4+@cD|3V*-lI3j{NO|B)63viw~W(k?-{FFcC$@XeP*>buwy*>Hf67dCRK`&X57WsW>0u2_7Ent z8nfHfCYtkaWv6Z01%0wU<#yn0&Ek$@3M}r^Q5f!bl35Qa&b4jxBI>;Qfz)?byy*>U ztX`KszGZ8U;GNs54s=(qNnJTA7n*3EDHu|BRAam%PN5s6Zrh-k0uj`p=eMLjQ`EG- zI@OUEbwZo#ysT=su2Vy|iO7^gXP(x|-MUu+-4=$V(E1lW0XPfsT^r@mV+!*+D~XSSl+xe45I z1gpY(7{vGOS-Cj8GGMX!!mBqiydxGY!!Ia!N9Q(KmuykECp=FaLMO%ru_e+{9R47u z9M~S)a)oKY{6-!}X(Gj@0Cjfqjtj4HJ{F{5T)2WC$eqZLswl@h&#l-NxHz0SATtSD_z{QMG-?;56s`Rz|gLrQDf=DHE@fWfgOX-BK-Kb|DN)x7tJi=0LMKI9b zEWS`fE_v27FlqBPY9jp6Cf*yHB2P8RVOz78_OGb8?my@rMBKIqg|IZ)VMmL|*puAB z>f6(!ag1)9#D26W$U|t5l}VE4qx)Dw|6rFN-Gn#C-rlr!efdjK!rA*uwc6gOJ->UOy1W?8%${KZPo;h29{C3@a5K1JDn!jrqWf;WliE#gUV#Wh;CLKL2r||*mM3WhuSuo z!i4rKzQld!NCtw)q1+PxGw+chM!f8P;ar_{R{h>HQoFLH&BOSY!e<&{O>1?0DF;lm zbpq|Yv)#$*g;9p2Gedzvo31L5a>PQHeY~Z4$wLjb+*L&~6wP#y3Eo1h(dd0>_UOG%+`Ce&n&OEbjNVa47aA+v`-2QX;wTq#2dwa3$cCA z^#rBIT@!Wa_sI6EIa-B@X`5y|FGAC9qdqh$lNZFbR2#k6)iFMYgAJUOtBSP)-qT zbj8NjSGDOx5@p-F^X{s6FWs4T53?P;FrFO88-gjwk1Kp(Y9G0UW~oVEjD zN+AEe{hR1KUYXzN7OvXtkR15f%v$GlQb*3x`5jN}x;{;EgnE5!%{d}V7gTwLXFJkP zs4VE_0$mY4FP@Q$G2PSrnYR;1tly+Kn!QX=)nz!OL3Tavh57LpLB<}Dta_bfRzY+z zLfKm%xJO^DrOPzxCK^JFcF-Qa9e(u4p`gqiOWK?)y${anSG`x>=h$DgTsvDsTDZ%t zKZE^UjtZC0@{3i*49?JN@%RrKBJxFi511++GJ9#1U&YfDdt`xH8JTA@IF+>5?vu^? zG^$#WL5nWCbA}BSF^+aJ4CO{w#YB>~2)I7kX~*N*L_U{jy4%X@xyu#~{0HMj@waSS z$o#bgI*cZ?I7?ZJs?Hc{V&e%v)SR;j^%?K%J94Mx`m|Dt+t7;!A(mzdWulU}lU;b@ z6$3#AtI9H4Jn8Fp#ZoJ@Si3)-bu^{ZVWSgbn`)vk ztw`^E-ASt4Ip}84oS|H2cCDuxG4-cp`WL1Wo)sev&n{TgIc!$yH{gt3&?qBUb|7*q zyf~#yse^U!Sh6SMC#N{4S{~IT>hHsmH+WtlIQNQdO^)8m#B%kU_CY2xK_a7(2R9mI z-ba7p%(Wq#u)J7e4>w2l$F12QjKBGG|iNZn)h4VC&hbs5pNnyOx zW38UaX{V&~lGO5muBt$Fnfk?>#cxu#(H)U+@!Aaae7ZVLAEQSh(v!%@T^n~J7;#u7 z)s^)PYX>rcQhbg&I8oWA08qimKH)-+(pJ^)-Hk7g!>2SRs=aOMyuHJzpT_`C| z&dH97$^1|-(eJ0ScSjYkvzK9wpm0HHQRdYfTM?%=@~0)pBL0RL$Me zblN*!mIh{?Cw(nOL3>U2&QsDOu1j0AP(mV&&zmHwatJ%CiYqzKDv9t1rjkfT?HM?w zui@id?kL9*%ObJxl=qcFL(Tn1L{@aglIH1UCwXF`??<^i>z6UFp0MuYBx5N&tXH^= zp~6azzR@huLapW!kGrej+f9rPj~~?vF?q=bXUE}1(CxJy3@fSRMVXqAAIql;QhcTB zuuQgfj|^QShx?fnmTlaJXZ9I*)!D@ETQxSj0991;?pJ9kervFguQD;PvlS0bbUQ3v zV#PY1_egCD-V}|l-VEEWlyGSqPwzAQT{6M=a>r-H8q@xuVr6vrPhZ+NxGZGS4`1>7ODbwJoo{cVk6`Nu2RGA?yl- zSTKx$j>VKnFSJk~Yx*Xulfw-G!rPnk^ewi~giHmLoK*Q>Fqx6M*`=}Fvd(l)@yKSe z+!M6*Uc`P9SAuTHY^s~ks|X8dRGGNL$V2LJ6I(yBqt91m(zV-MM=OCVSOjVOE)eyi zYJ!H+(lKF9qxS(taCcu){;sHGAIV`I+r%5n@>Y+x-b{4fLv&e7*QolL$nj?trRl_i zH&V{)8y_Nfxze@hP4ZB+TaG10*E>x9`c)2+Ftkb(2cJ(RB&n>=^omy8Ql``+k#Dc; z(!$;S2%@0}iO!_j_aqVxB9DdCBvPq8cY0$Hb=UbqxqmjTssQhHqk_=TNHRAOziDTN ztS462T`w6CW}0)}y2WsfOnbYEz5zp96arD7hCD7}evyli`at#@9zDOS99s*{hs&jt}!9e5#%-0Kp_F6ucM)c*<->UZ`o{Yd5J{Gp0cgnX!KL183Qva*+S zss}Qea+3o)={!GSFQ2N|LtYc^&h0O~So{<+%d~nW{Lp-L-UkD`s#rQ0BL>*nlF&!D z;fLb;37BjBClzw$;hdI%kqQO*?Dfawde$XJL1+REi;5v#r%nA3dFC z^!%vj!KNTS_M$GOYfh@;c=^HS48=Tx$9${>_7=09;qF2u+LSLU$LNXI`|9WrR|NPq z8e8LYEnlPC*-01ZcSyt6V9aoHVo^6crJYf<&5GI}8ah+Yuuv661o!YrSoe7y zyyU?)zvB_(NXp_!9rG4Xex)t0`cfc8`&}-gA@Z%nJ$A?VP?XM3_73fsR*= ziRj~U2OqVx(j^6&D64C~>T^iQ2<3s~rq1x%diFF%(Dk|>#GLmCii7lfR>E>ZE^TFh zELCSCMq==>C9h_$A;Gy)yp}As5_xW7vOCCE*DP)Q^=(xQV~tE4ZCUivT%<(k8P z)H+38(hy`mKI1FKW$?PsTVQ{%XZ0tBq(=`A=S;ev#Mc!V)7^}DeflI*PseD` ziH4P}6|PTeAzs<~gC6k~s*FiJwym_bt&4UY#1yH|7xT@#JiwP;r3R*ddgi|=Ew7Z0ipzx7hT zPf4U@LK*cG>aN_wnEZk_YHBghb8G6vD5Tnw(otNi*jqJQu$7p(<&e`y9@6kbZm0@O`_5adj{h;v7J9Y?&gZxmEf|Y?xNeEm8UC7E)b>T+5rp zqE{}Nx{DR>tD#J__PWlO6P_AY>I+ry-hZ^2COcEblHEw0!@ZVugiSJTo1gN%<0j$s zqE-eYsX6A$Jj(ifvNvQ^hr-&RXeLF|ae~D6vSue@qsgTU{Bjl9E!)N>FP&6S%TJBA zpgI+<5};${v{Q%i-VFYy_;~W7x;QJ%VSzr+>>S3mLG zxxckUK3_RA;#JJYxhA3k3-gKNcl_OstI(6#eyF8CCdI!A^B!-=$hxgP!e{dWyCB2x zyZ(Z%!!mO7Co)wP)dynSGJ;DQn9+SESI6ZlI27=1(rRcIXjG)WF1S@fl}BAcvQqEA z$0|O?DaB)R$rJoGcf^5}Nz3--065zL2QT2L~&A!e4XB(Dr5M#K@mj6F0NBRg6*YZl3~I}Ia19)H;5 z>OJFZmCTOaHw2_!wUXP;9inX3NvO-QwAs0@;^3WkPYj>$d?M-V5krLO2&O)GO-NmJ z{BX!>rua^3uJlLOJy+S8LgG(I(W)03x{g=L=UZk)c?Aw6(Hz!QA}?p{Zu3yy5@e=G zHb2IY@a8qyUbbvU^TQ8!$iCmq*|M`dde|u>-c`0*Lp4(1!Yw;?0*;~K-M)H-Na)_Ch21bh{&B@cOhm@BXBh9F&LM!BZ z3vWf-^O>+0puQIuz?xN#FcXm*@#~uICu_cfX{w+tq2yIkDlvM$#YM&TVABPP~RhSh*Ev$Tq6^zA{5bUTfswDQC1YtJtwn)Qa*)5N^*7lD*W$8`T!D zb$H~>hj~fwGu7EIw_JJ}uU&8dlJFf3TD{TEdMX(&A%E+UnqhGpm5w||zCq)AJAGUz z5Zdt?XX;Xdj1{aD9obtpBe+p9_lfw?{z}YJk(wIUJH9$cUl{MlA~AmF;+csddrY zu!~iAhlIQH_8e-8pgBAl|0cCN4ZZf_MAvkP@S|j8&T|DM)+kPkTfKTHt(TQX7%p@~ zV(P>Dx;zb6j>`MRHmaf5LOKK#o9-K~a?kn##pYW)TN{|v zrWV~@?n*8AGF=o%rRy!+?8TzEGx($Ny&&g(N32fshj~p2Yo3+TZZXJkh=8wJ5Q%|UCu}_+pyWhA{|3dvJ zeTj+s&1)~`Z*VTDZN6>w;L#g9wblS)mk09dr${-yDxS!&x+|RRo%5vG$)0G^cJic! zV7-TeAcjnUJJf{pv;9EObPold-v*V<oscR2z zlhzotL`hlqQJ>$N{sDVRAmeyGipp)bi00CjL-o{ebEvegxK!8>k-qd)5^Cll3-CO@ z%Qj3$CLS9dCUz!6Y!2_`c?{B56`!3lK9_~HJ0V|F`<&j%n)BG8s0tqAiVt-to_9Qh z#t#GV1ruFUw(eGbiLp88Q*Ij&aDB10T*wc4L{v&-pA7AJsT3yH|5mIiSBymb5%xx7 zfcyxx7(Gvwv5i`!OAe=GiJuF#BL*U3#yh5*rOg-F8Mm>iTBcLF(=+gyzz;| zrnm3TM_I3nFNn-IHR(fhqZD3$ta|%AiKgzQ$kpsOZg?Ypnj?!E0b3#OsKMF2ihZ53-Uc1W&IZU7VNWQtwiV6r) zFya41oFmNM+g&G@6hhQwc-!-IqoHuuL}9jYW(}V!%RRYDw%z-Q2JaR|@R5^vSfTKj z>&x{nMDgXS`n{P7=Kh2{;xQbsL&8Xz26ZQPq$gqjt`ahiShSqi2O@OI$(sW`q~dQR z#Ye)R$^zLh-0<#w7qk@N zPk}ZcjaWUh?URca;r;nuyg8pvZ#p}C9_T&5|p?8|^)i+0R7G0FN$vzK^5z2ZQcq7q2HmAURGqwQaiO@`ghR z=SZIqyzgw*IIEU~70{mcTue5Rdhf`T%JGoI-_lJzWHrw-qUFV+*+$a z{13FDntqS3(WFMG-wiw61Od|1Y^|j1N;c%J%juL$iZ`U3 zT3nhryXzRXikv+YV0kiCv)1vc)O;AfVvzg+jiqeO{Dv!Kd&F%d?qsRSS=C$e2a{Cz z4QfQoHd;LDGm=kIT;5rHpkD8smDc%Y8h+D)0X1*hkNTZ<8O!Rmy;&OmNiHh^V^Ov; zGw-Jji-Mi3T@Ez07S$UG@?liO*f0mS_Isbs4%5SxtRO6FjAb(G{2#fEP2W=n*f)@G-7A(!cv$JZ zrFCF;BG=Ao^h@k;sG|RX^qo@joGb^iDprD6O~r*>d49E~tD_6q=-W-akzIdY=e*rz*Qai+Zq z<3JPyiSsjWxfo$P0QSmfj<@VCuQT46d{|w_AKGeuCXa=_HYZfbQafRCN6YpHO;NL{ zDr7-vI}-!0sO*>jpjS>q6@cx5egYLsy3^<>K^&^Edv2LCDHYOTN1D7?UMO$9C?a)xzf=TItZzN>G@{NjT>inl4N%mb`tu(r>nuW8*=CH0 z6Lq@w8))o7o=o)S%roD2+50MsCx z$|YZZap9e{n-=wqdXMK10m-N(LwhpE5ky8pM&A3|@&T8|K1W6If<^M7NNu-Mt{-FyVV`!8_ zjDR)crx69sR2Ig~PN{72;{ED+y>gdl5hZDXy=E#BZ(9#&c}$zrnj2>+KRQ{=!6CKy zmeA{yd7f9dpV32Ie8g; zbQMHihR!+y+0hA=!7E`za{3`j4&wHaY84ZYbWQaL8IV-vo;4lZXS?-j=9jLMJLjx+ z)Hbe8TuD||{;-O7A?MSzvRBOs;3ggZk-aL4&?@{dDnB6va0u;GjqE`<3qJ@O)#Q61 zLU2w^Ly4dV$xI3H1s!la2SKcmnxed(BLbnSot*|G{-u8r_!ohH5%?E@|6dV6{9hSX zQBlFOy1J@{Kp=Jk8+gIP2p&@KEQ4nX@LNHCEeM~Z(dgXm+qcgE{{Ni*rvQNpBdV&Z z4uH@O)O5#h)OHfcMggGwgoK28f1}*r7X6oq++?JF-Y z54W`cI{i-os;sQE0Tl}bwSj*N@dXWzjze9a2B6`wNoaa@4niW45GgSs#7IXCaj-B# z82oRFKmh1cEEcOPAtBNKg|h!b;=c|M@HO7RZpV$b&&}NS5*zr!0_0{tS{nd z6bjFKKbiio0tCQu0>*mb3z;b^=8gFG zmHa*KKiFaeN?#l^*Ub8F>>#wMWD++vu$ zMxaZ}0>3AXOaD{hKMD{SweWypCOG3ts~e&5$!Umy9t+{o{n>JG`EUq>gkk-&mB2g% zW)&jjS%RbA5Zo<^_!igr#T9kX=r}yd{!9QQ8(jRK3eo?RB3KV-<`Te2>ObO8URm{; zdh7xOO_pQU;@|tTJo)8!LLgS5slSpR|11xWjJc(ikfFLfPVN5M+FIg&a^3ci0tCQW zx3qU~1o|{Myk_|FC<>Ye&#%(T91@zY`RrSMR;H|`2|A!A2O$w_?v!YGd3g^g^Y~}w zel`EgPxq^(ek`{R(7X1oA4`E8G!+)2**^;*z$b#cAI(0nSO?Y+FkvBTHLz<8>PxU? z8KPAB>*)==Jn88lT7MU4#s8=u`lkWn!&%ze(SwVAH(Z@ZLJOZz&?<0EE3*h_p&uZ% z0w$Exf5gEIUZFEC6Nd zEdg*`Fepf9ssh9TEl+^%RsFepEsda{nflNCjb*=%!wX#;fo{%@i~kehKjwqV%E~Cg z1Q8y^)`)2n4aCMo4^fbjKm>q|kN5dii%ZMU9qk0EMpv9%{k67>=2iCKR zni3)-A%@6^iPm(@EdZ|%Xkl>)8XBE|2noLcas4B$3H{AKYo6`z=y>ts1%{ZISQ2bg zr~o}W;DNv3I#55;4O$-5(K`Uuy>Ev~YZ})8kP_lsTg5X2a6pUrnTqv%plb>w-hnca z;3*Up6>VP6{0}3){`Mcd0L*>DK-RGzWd9Z$2J3eK`32<;Vq#+czaaNRk>3Ic_A>RqeA%sC-fIcFK22Bky;xn%4 z+^7f4>hmWiCg?y&18kfCTek6FC(;wdf3gVtQ_C*{^y<|s(%ISB#)XB2&3_h$AZluA z2>6~g)`Q`AsCA(gfrV?tLYk;~Jde)XHzp9G} zfF(jK0;!NIuN49ILI9vIieoUCE={$0Cv!QJtv^vg~fC=LYAX0Z1HO-@ciOMf_4 zxLe?86g&D`;K1eJv-9?a_O<85K3#`+oTe|CT|yD|$6Fa0?u!r29f@JA#gBZKhp z@K`_#x&~O58}ok@|D|Cb_!$*DN$?WUrlf`P)>f3&>3oEcZvu zu#vv5pB4{b^M6bdZapFdu+ z2z^SQhWavRpy}4{&$53-H!+HMO$=un&JS%YJ2$^j3w9zu@5^k=_)h$n00RAZ)h8@* zbPQ~SZ6q-KuO0f~cuT9lUop5ySM1apI50?Kl?zZ;+!WOR^gkQbmRCM^dH66ACfLS} zAdOB;LEd5Uqd1#?7Jl0~zf(e3)oADB%!~)T4}(Ud*4A3sWdO(05*92u+Q8^Q4Hs*f zYlYs=zyFSgAG1cv=b`b6&+Dv>Qggjnh>!&h;ZyyRiR(pq3AcgSEEz6c3%VKXwGq>E z3kdko57PI=GbPv3_VT@R<<|G3pnw|w4aT^Ig^NcUp*x)ccsNhoY1Z0k9{yUmGD zU#!&u7N7-n0*4K<>%u>X{3Sr(eBBo`$-=(jQTC1H5zy+zl$4aU@f|c@AzWV1((eNV z+CQ%NHz7Pk|1NF(NT8bu!{uRH!R*~_qpkr^r=ijDA~4_c+Q|Pp{zHJkX@MN5{CN}# z`Nd+AX%p?Tv;EOroFY((^>KA{`Ioykt~f-@@#9SZBK9BWtt0w`K|X)g&o2W{A{3&tHHIgeR1{o{RONKiI0F-Ey$qJ zw+qlv-YhstMM88+L=gG*-v-^k3v9qht z;^?32yPp>PN`M&k=VTRho%LltY%_S)+{RZ$){-EP?tA?87PM1epK!a1;UPga!v}d~ zRV?2V2E1C(dQvy$fv?nwOEcmz;-bGD&UF4c+|T|2)^95T1sL&}HWusJm;kn?fHd5a zzM0JWU_g>y1+e-$FG7 z59kPg5=fWgQY-{N!WAd+;}F+^V2RnT-*@&n%`EtvaZxyYwJ`zP4qBBd;C-Z&7>nf-R+}hx72Ami|0PNvq18juR^APqNV6K4! zdTGoY!Hn(u%*-hf6@AXP4et{w8s3Y6e4gmcTzF{j1kN_YyE5psTKDEskKJ<>?g&P4XG|^^BiHwi9oM@DO-7spsGZ+Pag*G2!sU zrRzfA+teYA&c;IF7GGu852NayYxe|KJM!t{*}}Xh@b+23H&g zJaj$rRRnlz%|BS!RRl^Gt}C2|>y92Gvp_)52RIGpl6vqbVulj{hL@Fsd}hrZXPX1l&H<)`Xo$z(U4aI}DX)mc9( z1S*bmRGoF%4|+Dr!5DzH{PHtzl^zD@^VAao0Vnk(!A%ZuaMSg*`OcRT5G15!PI35h z;QZ|Td>}4QlR{(TiWdg@Ai&{5w-X-WUI%-&a^Oc!*W@I<#W4ld3`~K) zjs7DY#!ZT~#x1`87_`<_3gGnRHj18`uLab87Z83{nUjzLSDubt)O}=>9dm6 zdScR*^F2*X%c7#k@s=^GPXQmEd9LqO!#j9Q?VS*OgbafP@9b>`LvGW2)2|&1fzOI2 zMM5Y-5cx%d!2v%yg{aV!Yb6Fp#=wo(G;rw?i_-vl6WpB;CJgNSFZw?;bi*0U+t^#N zSbQCjNehyqBa28wdQJf*=51_cZ?jTo=sEef0RAetfa>s#H9~5J#{ukctHMzy3bm?M zm6fzMO&3xzI=_lo^~Gg=9SZSqtlewI4gK)`41Bl$Y4$+!IlqiZdweTf% z-|$4JcVPHOuW6r{$MAI&My=gu7gRRj2h;y7Fz;i*6##&psL4(Y!=>Tyn~u)FwGGTl zkeXmr185^65E#s%>c^iQ8K;^W0U9Dm1E~HvpWmnr#QVX|4B9`mK@!4(Yd65)<7NRO z0SMkJn!v90-mgmheiGg_G@&tpNKv2N$K3opbnSiu)B|pf`~^`GpqD!a+8U~1nSl?D zgADv)QP5gzTO|i|T|^?VUj1!N>&p{Z?wb|_Gk-)vYDQXM_)Py%KFkL*E@*O~3z8HS zf=(SZ1vfW7`$_mTwPLywdN%nCT3GpZi}kN`;_?WQgpd-M5+qInPt88l==cQW8xjWf zj7&fnlFzLPm-lrD{83R|PNLk`{J%64|GfNR-VaS-q7)&Ez_wbq8I=Y}M z{vl9r{{WcngOLwIjLZ6N2wDRJA+wnOct_3hcLlz~{4Id!IRzbn4z};;S!ZFF7NMp2 z&;ADfy7{llAzErGXbbb_g)DqDBnY}3H&_ykgWbO|EN;YISFs*}K@}p}4jE7ztX)vR z&643+_tX3$==$AAXa-zXfC+&_LHIa*80J3v%b&ytu6+p1n+?w z?(eJm%w3$Ff@UYa^#y|4wn7#r1`snn-516C7W<($GjE`}**XZf=|+Mifka6}Au%FR zhywj(w`pzffFctgLhnC(T+?%}FG~yTd+NgfF91$43XKPm(tfe3$7OvHf`zGC-Lr(8 zFPMLk_+79%fUZB=`*##C0I=r10~RbwNJ<7dSRV`7&dp{7k~ABO!$7^CZ-Iz_&tWHE zU+bP5^Fh2T>R}eilk6NSxHWxEzYGur?FT+7^Xu|IO8@%o3}^s$eQw)7(gyfo3G&0- z73?Y$5|#ECY=v@xN?rhhVAT9f_y~Lm-WlK^;P@JxDj;hH?)q>QzO5bo9yn_n{^Gs3 zcfcWX1u?fV{j>OQ0R(LL^fQI95BU)xQD|rxwbBl@LdU@|u;0|w6gvRa5Xe6P&*Fx1 z;~*Xl=2g4Fp0Oy9jp5_tTSOty?|-EIuRhEMy$}|S?BAIFSseW{fsOg#>(v886gKj{ zjw69D_z|J-@MjycliG3lfBaxK38a&%tE(x%%zPhsM!~^k9t;RhZaqXJtB`p3d*MOh zYeJ%a{N4?+3oFEnuuuJE`YnLKp?m@8XLf(39SN2k-y;+r0fZ*NSD9tS6|>I1K+ColY;<@ z85oR>gvQ4}BvkZsU|7Dik^j5#y6l7(c!b1Hi6~(I{$*#w1Mm15fyL^BpUHfk|62gH zWoLt*x*>eNR`PXvSy6D%CuVulZW`H`A-Lh)EqhB9eF#O1kv{0R?;; z3jfQG@~vLP`z6xlgm3wO&H1fKBdkhBc-vdB5*7u~AI^=?XnY9V1cC4YI7H;stt$vf zt}Z*d_ODI(wcOFRHtc|jUIyd9I0+sBq0|bvFohwf0*8d(@7jN8onBc%YBoGh>iM;| z{3-R@05vr=tH0t1EuiZr8!qm)J(BpjjC2pPGt(MmUt z8jaE+wMjGf_47A;pL3pjf4k?NbI)_`IZxbE6J16+9y%&2Dn@-hZO~sX{NK{v_=_Dx zPF^Z1wgr9dCl-OTyLq?#EC_FVSBmxPamHh44ulJ&& z=yLpaXE9%}i}0P^{kDre`=aP??*zJztMl^m#3S>#D50j)TpfCy>a4wwqjtFzN@{8j z+{)B``VNYAeVoGM&BU(<%tai)>z6)^dIfLf!P=5}XhM3n{B-D8F(>B1;N#SqXB}-x zvox(fD?N!`vCqA+EJKoN*8t(dF`fE_ljGujoY3F26Y>YKoxe`svlz6BvSL*D{D`)! zYV9PdVF>0u!_44)c#kF`7xT_xI9|--yQxcmy%KukK&GMsbt2M}{Pr@I=cd{lFE2^~ zOWz#0qa5W`d^BfYT((7jzwgcDtM4Mb)|ncHq9dFiraWppA6_}brn1ahma00!H+P4(gl-S+@YmcJNX#)Gx6rf9YQrTKoD2%dF!TT zq|aOfg$wMUdOcYchx*0qBZJ1M+;{5-V_%3!$eRxx8-38oHjz=0by-g1W_KDBZMa41 za>n|HCss^{c8;M`k#MT$asQ`?{{h{ zMxTksnk(%xj{|%3>Bh9@LKxHYP*tVs6g)ZF@p|B(&_%@T76*&L;bKH3|~qweZT9z;HmGykBD&|sZ5pjLS&L=y0iXr zHZCw4CeSDmyyiCyEyy3$sT>Ba-hPH!cD~elpT$q5{ncCocD26H2(!WX(MJsR_izsBZ2M*(iQP-fleSu+{C^S1T%0wcGf* zxvfcm#`83Mm7a3&Gs`U1(1uUT%*EzqjczSmXGWYruVFuI0`x+*38bJrk|!IM0gm0j z2XCV^uPOPIw&%ihvaB@6ny;l!=h>M_)2Bsb#>F>vDF`d(r4h|bCYW!^@*QZ$Z`$nN z$?6dwrjsGoQ3vi^?IFUXV5i817(ZBngpMco0wpW?2voVp_Y(F8rFb?RV8Ef~h?piz zcNO`>NYB-HJnfBHXrN>Ow)fuhxA=$A*Z#M6uzS-!bDd{zC?tcaJ=3&0Pbx*EeVvOP zA14>Jj4?;=loXB0&`)_Hi+{gj7i_z90-8MtfmV2UjEt(|LRm@UlfwC*@kw2>H?1jP7^)3ZMcc}cj9 zKfjKeYsw-n2Bsryz#)*84)gIyj8XEfY zuJ<*5$R!&H1S0MdiNxNW?QI=mlf$n*7~JE1RX|E>r^!(gyuz~@S#kWJ!gsEvbo@-T zJGb+gXP`MvS7ke3Y-SUf~(#Rs|m)?B(YwWQ0yaPV_+;v-%$tW4GjHa|=I>tkn|xft7|Jz40P z?HWTkA?Ehc(b4$ez`&J|Z{}QXohQkOq;Jsnv2Z89MllDX8WH+DM=PUnZIzUX&iHY@ zz0pDkt}d}Nfqk~zzS<2Kd%%^IHORQn%*w~qTckRUAaG(E8bGgJmFNnrKiW8xVE6xe z?9?r5(D-qiK+42s1hETdB@b?a4MWlgnK>8|V^0$vEEmttg0U-+Mf3Z4E=oI=-x)qm zD!VQah6;D2=(7wRWhmTbFH(N}iT3U)<=J9}4c_mu+9SjRxs)e>eJHme-R28KPEO8( zWI@awVfF6kA`wfH%qQ#~4QR9;(`x&kr^)qeVp--fXqI}zjr#-m>FMbrKG&6~7f(C? z?MSC?5sFfBMMg*8=-!DRO6?SlKrdfnvd_5y=3`CL#!&UMn((_ z4whF`7#z;7BP6xJvAR6T_X*Zn8D>CW6jpU*zmfk-^mpdx0dE0|$RL zM2q8tC@-Tg*<65rtJS*#`L60E(;f-Uul%_!8UPP&UsJ9380{l&&+_xS_@FD-w8Lm+ z91O1|X0t!hxJ3t>E5qr1Q2V$_YBa^>?g?o7|JlDPcs98RN%y6in`fj6H=g1`j(`og z3_gah)C#E7I1^fCL<@`-)iXlb_^Mc5Vi`ZPJTXt=4pyd!8&@B1A{zPl(0%qBL=%jp zu#|?y!@lbx!)Lw!7VRSCLp1yqP_yU=lYA9Z#zbSqC~At~bobQMlyW0A*BM)-tsYX> z;oc+Qw8zTp?o*+z+*!V;p9lnk395uswUv@usxX$;TiZpzUpI3*$Wo{$9_q#F$-F*K z!wB>EUejQHlzlffQD7m*OF<*XQO_==)8HJ- zH8r%dkWC8gpw&A+?;gOR+~K|hns0pexT@Q;eH@QJe30+toy?Naigu%cgfO#4mkhN5 zvRdaCcp&Ye^G;UwAGryL+oq5-+b_)W>Q`DgM(fyYb!n#gCpW> zcJ1W|4Jyu?g^hsRW2_Tt!d6bZ(eXtjg*KZJ?QHD zEP8r*=k2iQn&zeb84+|yVV5dxnYU#gX}+~jS%-&%Z!|ozEt+0xDoD-LXtzs9oif(vjKTBhvaa$ByYV(}|P zlKPSr$tT%cE#UV_>+l;+lbXI<1^uf<(j#87AUi*`&Z-dZ-lmL;83;6I53_`L!hsN^ zijTmDyG74>EB8*k=5dD)E##;U@*l$aD?7t?uM)<$7&6;O)2+#GRrc`3{b?)_T)pQ< zExpw($mwi-DQyBX@!lQ(_rm4We&Sx$NdxxMlmwRL_P(VJvCAtq!!d3EBmLHPnsv$* z`?3=2!eG@!*n~}rx03%KhUNku4FHRCC=OQ#xAa;_ZF%IUl%QyL-g1!*urxU}mN07u z>?7SZJH@st`@J^S{U6o&U{0K~K_D|s`VQmvVMcCl^$lLh*Q^{3v=@Slb*m;{TZeO4 zJ`;bWUDaLOhU9HX*G5WN>Wt!pF6DGqj~)^yLmZ3(J361f!jv}sgfE{j!vRwRM}0@P z%#KoN>(6YS+}Kg_uX6v@Bv~x1^Q)51G#)>bN-W81NV5)Q9dZ;iqZ5cm{W0yj^qZ91 zCaRS`lL}Qp2UZ&xM%tRH?LCe=Uxi0Coxdx?1t;3TuxHXsn;RagbW)t-<>7)AWfe24 z9=g}@K10VaDKqif;naGK$kX!-0>_1`uhfM3j8($gB*rF?-U+hVZa6`2N|j2;8Xy)( zwF=5xr)fv^@ALU3$ypn{jQ$$ z)yuwI_!#c5u`Yn{rd0Ios{8eX7Cc)@dd9kjw5K4MBBxh6QF&rulj zwEG?TUEsdt%l&}4y-r;XOCyB$L|UU0(loxbM}xyu<^s?k*cSGFppXbuQ-FXQUe1Zu z?Ob7QuW-=CZ+j&49TiSK@KGB`YNX28N=7s{JD(K)psGLP6}VxTvYAG*FvBeO=fCft z(kDWZ%LS?~Gk)bpjq;>AvaGTA2oJjZ&k@sFliQ-Pf>n^>tj&9oopCkb>;7lJ;p+b- z-XCeTZL$@69yQ=6xL_t@-EdtfhoXPJ7B3~*=R{77_FbfZn7v?^y@O+J@sM=SuFpjv zGMYsWv@P0-pwhs{rG8Zo$-E7QuQJ&4l}6{L`mofD3f)XEY(uMVCf>BTLNg# z0`lZoVQsfVd_)}G9uqnx6D{l=hy{~c(E9|m3++SIgp zf?NE;uOTPld8PPvrg+Bv3K8?Kb2>yf$xt?4PcdA!o(oj(>U%E|K(g@&l79(`{Ao;=v9k@;Gy1AV1gx{5|d% ze{RNYbX*?Fga8WrqiH}|jBOm#T%taTn=VRk0v&kn3=R_JlT&E=O*yRWTOsh-ckuP0 zsacc-9@!ej=T(SyTzWzmYxHALQB&KEr5r?h~9IVIxWn~{nmEFaTG zdk}(Vm{mdgVje`2Q=SY4tA!ZW((MoBa8YtoT#nB3I<<<G(MZL;hlOStLRDFr!ky1 zDP}>84KgBj{nLX=TXkqh1UWTJG}f`xiIsfFy5iXCwa7k&m2vojZ}=zwF8uqz2_~SQ z=#&f;4cbR&iI9ZGnNa&|n!IA}@iq2`7NJ?EZ7j=f%SXcC`q$wMQ^Q3arEu~{Dq#8i zfi|zI#-E?uN|XXZTyk$o5C=^uXtnu+%Xd`q-;!jJTpC(bFlRQXE3Potadj*>2F4bM zWy*M8q!_)if#5@&Uv2wU7Y3@TM?}0g3bV7BwjjZ%(_b(0@ypJTq#W?bHrhih6bcQa zsb=o(n{mo1TuS9Ezt|O^WtB{h%kadILF$PE(i-fnwh0^>R7?i)&M?zY(XnTt@AhkN za7z%5l+D#%^K!E3|5GTu+F#Zp_qDw`d7u2jmn-&PJp;(s-s0t1|D{FV*d6MtQPIVz zl^?aY#@Wl$Yj0V%(6+V)F|GdhZK3>hk6f73*17UyZ~v~^OqqtBj1|+jar+MzN&dd} zg&VpeCI!$qIb5?;n`KaU>^|fk_*=WTy01mxwRl7OEccp6FR{_m8MjN;(%Z+y^zxfw zrx4~VyNmNnvyDfgJ%qA+7W%g9-ZiY*PTah2>LP>WEO}N7o;2#nFl_FgYo?)ABIGv0 jnE7e`zds?Wh*1jls&~z1xu)38|HSlxCfZe+FT(#1Y$L4k literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-hdpi/ic_launcher_round.png b/presentation/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3466a1e10298954fb92501549960c91568d0c6e3 GIT binary patch literal 5394 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 literal 17817 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 literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-mdpi/ic_launcher_round.png b/presentation/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebc053e4a723ce47b342f376b814da5f66c4911 GIT binary patch literal 3278 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 diff --git a/presentation/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/presentation/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9a5fc933ab9734e3f5473f84e9b454e4ae0534 GIT binary patch literal 6847 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 IvKFEL58~T2Q2+n{ literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/presentation/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3134f0f71eb8b5b107150318d675f995ac8c3cb2 GIT binary patch literal 7653 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 T*6`)|00000NkvXXu0mjf$p!)e literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-xxhdpi/ic_launcher.png b/presentation/src/main/res/mipmap-xxhdpi/ic_launcher.png index 401381885605fa5f3b90f366b8b39fade1311d61..fec6a14cce00d27632801e53d1ffcfcc73771533 100644 GIT binary patch literal 6943 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 HK1BQ<^aktm literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/presentation/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..469f6e26425bbfe5fcc701af210f01e4f80d4c10 GIT binary patch literal 11905 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 Hu0mjf0cB2j literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d2c299e9e1d29e205b54729c1aba993a090eabe..e94212c08c3392384ec8c213633c5f3a9f720e06 100644 GIT binary patch literal 9790 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 n-a45IXB5x>soQFC{aM5?l6xBK511I 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%0D4-2Sg0h}1O)|ods@1?nw~#KlYs#Yub#uVUr^f% z;fuKh_;`^ZT-b##?IN?Y!>x84h@G8;IN%+hD}v|A+Z{ed7vF?e2WP9`+wkzEVP()? zF0H6!x|q~Xqq~3cdFg`uyhsQhE=YUZ12^(Pt5%jxACDwN1d)&cKVm1rv`RNQe5(c? zVCNU(Ya>h02RMBz=TqTV3iLfu;cF%3`%1tylVYfkm~h)8Dky;XdAYlMsTg&7s^K0e ztO)qPB+Msfj-8#Ij~UMI0{>$a0A_%AscZO-1;7b4f$@UTNmYSWKemA~10k7kL*AHM(EEHznUchG|Hsn$0a^yR-zm?`M?XC%H_-gb_n_qTCgocW z^o1^JkL{9vn_MP#G_(TzNiv7y?d*f!x0XCQ|`mIit=rJ=w_wL;r4FWzJW*fAj zrpF6hobcTM1FkZ7-opC{@cVA&Hlt=#+Ej`vS}IU=YYnPusYKN+)oo8B>?&`jV2l>j zMEU<1j|6uRu)_`)64)nm5;zeL5!Mk%0*IFgYYOlyMiN6@M1~vGm`YA(5pbGInoCes zYc=GdsxAGst+lAW^`C{m21*0M>j2mh;S3fI0vO-nUm_XaIS?O_5Al)s|M_L(MFMOB zhy;23UI*9K3q5@JP#?OgZcvu$P?kdQju$EFp&Tn8{mP!ejj*44~QEtO0RNP$r&(lkR(|GAgqf?MMXt@ZEY=6D?U(!8h8$ynVGGJ%B}kgghht1o--B+ zvWgZK7G?-S8Un)4a;**ufItE0Mv>W&iEw~IeO?13#76t(>&*I0^s4qX2!2|R&4&S`f2`mbx*RMkD??DWbm6oB&;qo= zuCtk-1b(#OKhlq-?nHMcAU-}`p|Y~_ILsLnq4w`oZNV%Zt?0*W8)OzQEAUDfYdo!b zhMrYFM{1m^$V|WtiIDzT#>j=PO?X8(%4*1Fh14&_!Cgy64uqKz_!}6m&|u(9gqGka zOmn~Z*|+%pR0Y77`hw7haB*?{Ygd993VlXYQ&R(1xKr&h{DxJ3h6m1XVqFqSsZT|k zT$-qkQioFNQhuMzbwhU@DnG=-!-JsKr(XTWW-V8fl9CM7)YQ6v6E__W|5OD4E#D03 zP^C@_t}!q(@B>>M5nNzJ4er!CJ6J`uP;b=jROp|JjMEug8_Rm6(Wm9Z5RymMX2y=J zhx(zI?1=G{KeN_?mzNju@%>vDc1-J_y1Kdz;JL0N;75ITsz3fciHM7f!xm%<7}3DY z!F_(1I-`jO(`z*S+dauW*F>m2iNF0XnMi*;hBHS`0dSe(vSlFr?Yvp`p827r1k4nG^C!>C{{S}ic#@p3p1{b_DkI$D<1%G5nL$O9 z6Uu%*)%Op5{b>pSH3QRIUD|U>CXKv4Q)G)KhHC6hM@nwT&L#%EA8- zv42*M|Cz?6m2E8i)U7lwJ3OxIiUT@bl9|rN^|KV9PiGT`@$u9db?pJB6AZ~nlcgEL zdx77_0cv4X-aI4;AkIG`ofm2jO6^HUT6w3+@oI+GMrcY`p4scV>yL8aKG z5E~eO^|~L!0U0J03|{1q+&}hrLU^Eh-AVuk<(|%|rpHyQsM9Lp^?@N0XlaAEf{=IEsgimeI>BGk@we zfsV~=$FNcyy$aBgC*ARl2f)}=nx4Z0;EoDF50?f1Qm_zs%L3kaqx_T>;LB+Op`A}{ za$1hw*R}wiQ3eq<`ZE@tPfKrzb`A)Ugb+5FrstSdQuM;n@`qOBwz07>bR?;=O=9)wR@7P-S8Rs!9VJ@xm5_zwy-v z?1F5FTb6_bG{|kgJu&^vDwd9A!l;sBlD{xGcjc!Y3-Z$x0B0Hm*&T}fHJsDOa?68- zzoP;$8f_5?ER$wZ4&4XF_VuMN>QV9II@H?mt+9PWVKXR1Gb(#okGSPYNYaJ}aZ2>8 z`CT@Al}9HW9w1;P=tNQDD?eM{U{v=`MDyLKKUG@XHXh(Udo{FEanjm*$4CKcT4-Mz z|J|JGA^|M$AJ12z!th#}!rzf>ZFV!tK2?b-lIYL>b`0|~zL{-MrX}c|**1n-kiV~n zvd!AGm+8jw?#yqegz5<<3wuDQ38A%1tUjG0l?UwQILOOtswkZCZgk0@TTf* z{{nu(%TH4PO{+=6AwMQKPj{cjphN!G;9PIU1&kK~Iu5Qnu9S7;QAJD7Io`YYK^>~i z>74Ml=La8ml6S2JHCHg+6w!|VqkpU6Y?hAweCjx9t%Bk5qt${_hr=>({L)Pn`t0RD z-V|i6Z9QoeHO`NG|7i*U=ag)x&PW0roVoGf-))Cy(qb(3gN?=1LE375u$5p~6@6^T z{VL3_`e-a|MV})(w{yH>T3hNVsPG|cwP?q%-TmFr+R%1Z3q87cB@8O3{En?NE<;-7 zi);N?iD_udk#i_E`Q2A!0rr)wdKiYja1 zc4{yp=i}jO8#rOc;o1W;6qbf-fw|F8%PfF>mH5(Ny2rC5)cSsh59+we&`?NJS z6vEf}Waky4N6~S}|JHpJ5fhJUY2Vx-E1|6ZtS}=ni(Xva<^OYLfhdHnj1r7*p$LhH zYI`uAY#)g&%cqTd4ffGRz{t0-GSVi|uy;-pzys;g!pEoKQ?Yu2t4irw*XNtGLl3Ab zwFwF8&|iuACd?1=z$bU<@xW3geP;yD4ZycBN>ES`mxzeSAgIK|wjMoa@FBl=GyS07 zKs>?chfjz8Fa-d?#RvVHgg$*a`*Qe`A>U+=zDNG&>b$*hfXp{-KQyy?K$mV+_#RH0 z>In|d?>Clp-|-i9c|Ah`vg(;u$OhE>pDZD+8!Ak z{EZ@DWKaZcnt{G}W;f(80{=8vQ&sntRde;X>j*zBGgJ|k!DItIe3gM42c31{9N!Iu$%0f-I%Nq)jP3Cl}>F|F07+r-`rm zGy{AM1~8P@l*b7C(_nO)t1hMhhD1HaV(%2D^J1qM`}Mt@7bRU zP{xN(7^NS`)D`Gm9EIO*((;=E}rB!6)+4BUDp2e5HjxGZ2)EN)ND_3W)3yE1+lTQ z`>8#?_r2Rn>gCIqMv$0A)CsC#aZv<^fmwtPE&R=X)ZuBo%h2#^^TGpRd;)q;a6}H+ zDI&twZAsyhW_(grw?)JPq0h~q8Dc>VEz1ajt%(0DkwD01ghLIht!tqE#NFU!paiC0 zd49)7wCr21?m3HLIF0-&-6OR4 zATS=~A2x46kDYY=S>Q9>N(vKw{rY5+%}9d`x)F2$hzNdj3wwy&&u$?C zeX|J=yL!hIXsas2?G0b)L`RgiZ+u~{oyoAFUxb_{4wy$Unn_?bIHO7PM|uhm=0pTG z=6Pq920;x@MB?t2Vqz8*OK^M|Fe3+oDa{D}?AbHEai+rtONcN(J|8Moq%}~P7C8-Q z1-j)Z$?xVY%=@xILO0V&rMR#lG8w{f;-+oUYwB1t{L2qQPIu}Q`j&K0o5XR~FtJ;q zmA)V8M}l#H=*aKe^o<2y%;fuMbax)Hc?1*3u-S)&GehX^^5HUPRympt)j?u(E>;Fb z^Te{pBrQzA->m=&3JOyo7P<>n6RnNVaGh@&hqi=qklE23r_o47@tRf)Q{Wma*7=#+lbg)9hKnbG2@-Mfr zxXt`QQKkL19Q0O(E_t^9^53-bJUlA(Zl)K{&<^$^aNh?=?Yw0)(I<5 zJcyQd;zhhlT~nSPolnebdS}x>88I_${{(}RN|aYBaaf#K?v zo-qT|F@Z!f0m(S?qVm@bsPI88YN@542OO4f06UVf;z4BLo>lWx=c^GEfD``cIA#j) zRT<+!u7mjqI;5C-EA#X7PXny8Ofl&obXfuLiXYg1Z=^%FOWsh+$I%N2BmWjgEdc$t zfgZ)5=nsh#)Z;+>nq*X&)Pzc7>QVit|0}H5vsHK6Z2@o|MMiKS0d=_cQKHMm^V2fN zq#w_4NgOJ*IBYoAT@EV9O)w$j|K)^+PLu6&l>@tg@GOvAr(>ia;Jv=S{ww-mMAKBF z9UtGQ(bFBa^c2)0BTlie*^XN|AzjYjLijO{nee)XQ8{R9YexY*lMzlQVG6*%@tq9w zFZ$Od@vk@Y7tmrC=2)y_KqihrO-Q$|05FCM&>a`!vYy)S!>q|^`G!DOH`IJX=qGsK z%a$29h6?bdjE^%2-xbh|t^~qix}*RgtdI|aepe%<5e{##I6=do+N+lOqvJci-1m2I zO_i;viG~GfO*iZ*_!;@f$EMI541bBAp#oqWxI618{4g{y`a+APACR5FEFscB>XHIP zMn>Wljc=CgXwYZXYZvt47z#M_9Sax{!*`ed4z7;Q*2(VJRP!_P&y3F?jD^h7@nzq~ zZf1C$fD7SU8#{sjFKU+*0EF@Xqq%=cb@}BZTpM$eS!n1xVg;Z(@h`yOh6iS}eR-&?CigG}AGVu9=f;3yB?8ZYg4UMWuOC;=&RgaXR^( z1vSRmPK3z@Tm@SA_)tq>HepoKTtW-nBmD3VvW6o1wLI?C2oFe3-$nav1J z4FeO2Gcc{b8vNv`{X6^qspxaQmenK}2os8%TU*~Ih6k{ugg73i3ZP--G=PAJ3xT*T zv@vpUf@fR$0`5FSD_p+MHVJAAPuTiKr%L>m4S*j93^x82@{dm+a-SZp0JR^RX`Y&IXz{D1_Ey@pl5#X@zO`quT}29OKj%PI{EHy~2><^b-n5YTF6;ju zoqvmm6CuubCKxdH4I_L7vOFX3FNf7-GuHLGJWvqED8Dohcm_z4!CC5%xLgAR1BR0o z9WwyurJn=8w;lai{eBBFn40xXg)a{kK3Y?0Jz`q<;lf!tNhAlhr z#`vD<6gcFWjk8{NHtkpjpj=%cTw`a$V%hTr8N{+k$ARopoLbpXiiXuhXIePlD1e65 zq;;?Z(;twTPAipHR-@f#0@26(PHjtUgal8}&D0U`ZMOx`)$KInva_>OA&sT9GKKxb zNTNuDBtj4TOZ{7$DX2c5`GB{U#)8=|O*mEL${hWuzG%MU72i%fum*^M$`M<9vRo5< zEGTZ1LoAOhIDR;U;i9J1#I+r9zfuNG>q(0Vh=NDyG+Tg;eZ0&Z~Cqd4%@nR{~7W;e!fli=wp5Z0huQ3!ZJ<``B%_2tej2Z zBNTv42g%d~sNXp`$Vgv(0Mb%XLQ)d{Oi?y8Hle)2&s9naedkyh83ls^(4P{aCPwES z22itr#u++bI58q09WOji5B$sg@$u=!EF6W%#z{c^*9tQ0cKq~wC~+tu7qJ(5DlV5aPN=%rS`^%|wxrLumd};=YNk~KW3~pCsK)M|SHBqZY zd|1#U?9nFd%GTB#knEG~-|d(*ewzpsLL`MiiG#s+9aIXU&=oU;srZ2y7axcC^!3}e zr$bmi=$8$%G&TFs>jqt(^yheDTtYsNElAFNH{;JO?YC5|BkMkWDR+ zO+$b)s>Df%Ks>4Dgw3>1fky<_DLV~|pnEK~*XvzVg!N69C zFkjo+$>+`8;N&JI=nW} zlN5l5jR(3vZFL;oEP&u%q6_Q<0Axh9m4fCm2@(UUvN9p;(zA|u8rD;!QESU)sFYm+ z_HPfT1D-NlHQN&K+edVAa$*B*Thsx8`m+gUhMeO=1Lwul5PpmpAA0GTP<;W`JYW1x z$B|kQ+k85(PI*H!$#5!Fi(3ozBtyCS0=Q9y#_cimGTqaxL=AWh5EIMWyv)o@hGR2& zdF|-mLc!}#3~TT+AZx?0%ykTlzZ33W$V~_fa0Ah2IH-mm&m!dEK_sSD6D=T|G%aG- z4+cNW;=?Wl(Sx`9M?^$4_vdTDS{L5#_suT_O~Ku*Z~Qyy0UK&ALy$Up!Ej*>;~Pc~ z{L}qe?f$eUtd_;@Qak>S{KfaO4doreFbb%UE_|7wV2H;I2xpAK2#7F+0bXeQ5EVBp zYYcGOK=F420%5Ln1p_=etruygL?VS?P7ewCJ&|#tmslQA1_uYXP+D7X^VLX)rVww7 zfG!;v%idq?lKdG3Fo2WRd5KKBk&H-m8?3Wt&u!+@J>>EXL%yMi$t{wtU?_RAJDA1K zQIEUO^iG>-g#OHYsI^(1M2Qaz#3tC#U83z;iO3ueBnQ(5W8bzzusSuWPY4grLIlb! zdNe6S3gha8Uce6iQ0wdmFS^X&AaWox0kaOFe!(YjuPa@eS{MiXYKOa#%vw_D`(K0E zpN#HED-38E$Ohp?TxdXcC*uKY33P;B7$OA?#tNWF4*|839?*p`0<;qD(*+X<3Upze z0Ki&88YsbSMnQDAwHaRez$k2Y!5T|iQAX5dmdqOwJLckm`yP6gh09Qoa<0$lH z17=t6btRIPW&+(VIm{R-V+9bTL%2F2{Cp7|7(;IgB4pD=pwMmN=mwz&00r;_7+vXt z!aBW)hWhn)f8hcGJ_*@*~VHQ47P z)ZvZ*n&Dw9HBEo;gfkPf=)oBICqB4T2yi-P_yj(z4EUkt*l2mO;s>V*(4z^HOP#!+ zmO+GIko6M4!3kNFX;26Zm_{d63 z?h*_JUU!Brb6one0jpkgWr`79Eh}d^fRkzAfNB)LzyM{_0%AWn1a>q%7$biIkw7;b zEaQD(6t=T47#zHZ>d2c>INUd~7qUZ~L{3I%-46riikovG0WA)e&qBlvD7P#LiJNjG z4)HFx#9ht{UQ|)%R%aHz8m5BQGehbuoRKU-#c9)7dTsa=`Z5gh<&Z!&;HqmhiWYG| zz{_VR;DJ}xoQCB@9l)kLAJd8m5v)=A2Mf1CBmx@IN+8G)C={A=W(z$JvF%zuyPS`Q zn{G!^h$Mt2i%dr6KA&TD2xe!J#~2r?7y&hM+k+ADHIY^6ji@HG8P(v8179Y!*mwwt zN1h$=_J^xAVY?U`7oBFCactiW#dalQ1nJgY|I&Z_GCtbx`n~y@md^kB;TPz~Kz9Y@ zwIWK|0KS$8JWu`=0+SC=swWh>Cu$Kav}`78#of6W$Ak*`7goO==oc@A>he0e#_{c8aJF|4CQtM(D%gg$ud^i}oOD z%JOLWjPXpZ%3^C{(Y4a+?ZJN8FWwzrlidtwC9?fv2k~oU{@?uLo$zzT-4L@K@%VnD z?LHS68R)mu%!g6mspf{}y-5+lEEzFFKmr&BK{zDQPNc){8%itt2$-#@>EKWE6KH7z ztyr2s@FXIFAraP?pTjsIkscDgTDK# zoT*pf7Cz}k&9N1?Pb+&igFAU54pvvd+>g&f#F(Cjhb zu)y+!H=&oJuyDcrC}AIMf`qDC_8Phxgu~!kA8PBl9PEv6;nN8F(Q)-HjRd?@N7oH? za^fOYvE2cLh46G*EP_HGBfN8hnKKhGMVj37^^{roKM9WQNG6F+f_;#ZOtW<{G+pDhS)IQ?<2X2y79<-TA zBK`%Q_VDm^#QXZ2vgz%;fUvLqsJ_5bN#uR$HSoc;ewQ3Jn@-EhMTR(Ix%A~aZYAj9zhRst2S0jR#U0p&L4 zvOxLILcwRuOlcE-Wu_VX0Q+H&T)2T+=nhbslE4Tgcx=Sv2Kg6dB{J;850nv&tS9kW z13n%vGICh<0eU#O&6l5fpQwJ!_NQxI%)VK}zS=51lDs;dP^yhEckbLY| zn=Ddm1$8*O@6g@xhhEbZx(MF_-Zv9lh9%tzF8CJokB_?5Bn>dqeg$95m5Cma4*sJ@ z4S@sdhj;M(_7hu=gjIy2=T%*<-M%H-!+r2{@HCNWNS1^7GEYTy4cdO(AC*?n>`8Pb zr$I0gGLcz8+{l8OhHXKJ6;X6mvm%Yt*0WP# zo7fyA&MwY0i%reV=pYDx_9tvx)4dJ^bvr8*W5a?o2ppUS(EGqMjZ7UBIcu^>MXA#Y z0P~ql48sX&Fq*LiLv8!l_k)?9F4VSdhblqc`HGd`*!f@-mzcs5+0Fa!9y?z->)+Pf0qs;V>m-?zWKED%r@ z5g6Mb62c;AkwR-aD1sH2g5XlC&S>k{cE&ndr=5;VJ7uuc4OgnQ6{}(t5t~vGB`69g zArMJ0WI+&x1WJ+@9?47I((k{?!z}N;d+wH-(fiNb+=4$R1BA|au|d=9~Q6En~|%V(T@SN*e( zSEVT4BUujZ<&e#!ss*tJqBIYo=Hs+w+s8Ea%#n1)@L_3kcD~}BAyZ&34aGv=2x}4R z{#U}&jn_dOsht*2@r4`z@~57oJv9f&;p922IRG4_*TPL+5;DuPfD?F+_9II8a^4z03%>vK^ zi^d07mnxv&P0(0eu~;n9LBXS6p327#a*HmTM~g2P_pxe;w$K}mYpJ?TcrJFTKC5o{ ztfPwt&7lhd7o;@{cc<@oQ!_1Fv65;&KOiT&{Q(LLI<0#at_`2)9v3Th9)rqN8V z3+u{s#AqDs%B6;m25OC&-;wbu_N0sgTAX_|ou7HWQb3<>)OOzTn#dm?euDNN{G!jh z-U%)UfYU9`kKW})o-q&H3Ug>5=Sz{YM&uFiHdNHMYUJ%>M129+y;Y))Au7;o%F08& zC~V)kn?9?lqhH5{_Pbj_7NrVPJdxIC*TJZV1LcQ)08YiK(r&HKXD!i_CeMLf}+7MMmH z8CYo-S1KHA1$+91m+7k`4XLsuP4A4>o%EGqiP!`D?GpfU#LnR0DP}@EuC4dtAN@b? zZl;fRl+g`~uAm>xI8WHL$lt?)z>{Xag3%zAhDv1%lG=qejs?%YN(KG`rQ_UFvazW- zNUL63OPjaCt6jxtm_V3%-)pTB^yQ;Ro+d5jP$-6>fb0 zBl`Ib*U+dD$}Sb%%kw?=*oE1JG&_4Xm4`m19ibiao`h89RCdanga&^e0-$oRBdx$f zyb%-qRYh3QZq+kK5mzC#(u)4VtF^2VopoL-#Cwgci)7OIOaB zb<*u}sh-61DlJ=(_-c+e!`-5i_MEJsgY5_95H74Xv2}+>4c7JbKzUUy{qyA_;)O2V zU=$P65Q2Wnk~Wwi$(qXJ4s4w>nY%hifCPj1eRYIA{nHDXO6+mWTa(KC&JZGZXut1~L9YN+MdSDh((|C;?9b<$@|8|>nZvR{B+ zCMGKnJ6N*h0h@*(I1Ejp6K&I{PhSS_$#HmGflHT<#9-$jBO3p1%sUosgPWBT_b zq4h&<_y}7#6&G(F;UV<|n`I4yF2OepUvfmplPC92stK(`nQ%vpjNfw9yIKK1_})cQ zJtqPIqrtUw&og=QOsPJ!T%yaC3bK|nHo?{pHfu2 zWXS|%LV%9$Yauq&o2vgw4s63WU^Ua(wM$BJ#_G~ByX!zLR!80{EiF9<=Ez$i3`_7l zJYBgI?;_~wH^P1UA3mS&jr{!lHf?eR0)eS$^tCf*&NRd-0#TFW0W!@- z0IO9dLvYvk$JNq1CfAY%y=4Lrmtr4FILgLMFv7>3H;c$1QHhbX78VvpfX`6(;IemK z`3hmft6gqyp3~*QCL!&kADfg-F)R0E;wPlytkj-Gjd?P+1*V~Kd?5ZIUaJmplm=y= zS9*Qi9f&aD@%b5VN2J}cu}=j9F(FRtnJm4L9-MAtMv-(Zg4)N%153d&0gzAPCMq`b z>s>DVh%k+60oMIHqb0zLNur{zV+pmO>en(-)bThfjCnFLi6cH}1-+ezP`&ZkI-z_f zX0l8G_?vL-G7P(<61`x2g_`nK=H2zqOKe@+z%*na+zAVU z7Wn$xwUibrQzoCpE|k^0OqL3OvmvV(z3V~qJ`Zubed-)JdESsUWO%p6PtTRFU%kyt z8jZ&7bjE)JoFN|jGIEBJFH0<7R)P*L=Y}Q8Ou)eWl$rQNaa$??rKKx7U|o4slvpkK z+}Q6b3f${)<4;VU(Gb>!q~_a2%MX-%JBwHEb;M&=fF9Y8$(NY}LEyaxV(K89QB9rz zH~2H7FAfBLSt|#p&sY>;zwRfdH{zp+*MgwspQ-9{3Cz*gHB%n zuF`y{udO)Dr>uY#bMcv{@hIo^W>6&DiU!GRb$x+Hfs8>z6MX5LL2nAq1PEkBe|D&{ zl1;*vgXO}&9KbO+J8?GDEZm-D21nRF-rfq$Aj#$#U-n?~LtpMv6ktS`Zh|1Fjznw* z-A3T#BZf{NKj|fS<|3FVjp3DE9{FS;z?RD1z^aoP6|#4Eh37cbv?ZUcE83@!uisuv zLuVcRz;d0a>vPd7MQ_3V5i>qt?%HyO^hAwj&vs8=ASaRDjQ)Q<&YB$%%4&irBmRF{ z{8D36*gF@W{2Jq99Wisr2y*qB`C>(lSPIMnoW8xBbv3i_Yr)&q`)Mg^e3^pz*A+OT zk@qnO4>BG*QTxddwS^ji-YLfk@8&~r7+vJ02x(kqM!f?Fr!?h~CHF$m@0Dr7u-Mwt zh#@j0n}Pi3ButzQ^Pyiipk5_CvtQXYAoQTb7dKRY+AwU~#LZ}-7eg`)?}~V}hnGyf z92_%oN(4?8kH)AF$7oh1==di8hh9`NBCmiqJ>#G*Nn)Kx)_pJ&?wS-C{`m-z@nmjW z{V&oTEoykBf(QrH2#}zej}LcC&S%h7EKH=C^IzH|`Mg*0c|GRfAGla2&0De%?xd?g zp_wZHaQ=_qhO>~?3{*}GNC8MNtKi~mr#T$4oA7)guCchZFZQGGDTv4SL*-dHxUGJ9 zNlD3oFiD)EtsieD&%Guep*tP|FD`^)0w-|Yz&rMj0vA+CX>B~_da-=Ns*rB1HUgUi zHV14D*c`AqU~|CcfXxA$12zY24p_v2vA6vmYiGLR0$4=3U9HUln*%lnY!28QusL9J zz~+F>0hkPOHV14D*c`AqU~|CcfXxA$12zY24%i&9IgpG4 svvby8j`aQW<`kN|StD8P{g!s=!zI^w&wKu6u5jK(3+Al((TxxMA7ob_q5uE@ diff --git a/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2403cf928dadf8de675f7e968f14863ea3092dc8 GIT binary patch literal 16309 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 Tyc`w(rb9tSRl4?r`RD%uuO02g literal 0 HcmV?d00001 diff --git a/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/presentation/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a626af31f893191306ab7ec6a717509cdaadb6f0 GIT binary patch literal 16846 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 a#OwbU-GQ8H|JWG-0000 + + #FFFFFF + \ No newline at end of file From e7e301736571109c1d7c9a96dd7f062832cbef0a Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 27 Jan 2021 15:34:36 +0100 Subject: [PATCH 02/38] Update dependencies --- buildsystem/dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 8a95adc0..4716a0a7 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -38,7 +38,7 @@ ext { timberVersion = '4.7.1' - zxcvbnVersion = '1.3.3' + zxcvbnVersion = '1.3.4' scaleImageViewVersion = '3.10.0' From dc7cef7fb5882761992859ad7f02fc085dc923db Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sun, 31 Jan 2021 16:45:02 +0100 Subject: [PATCH 03/38] #168 implement UI for sorting vault list. Backend still WIP --- .../presenter/VaultListPresenter.kt | 11 +++++++ .../ui/activity/VaultListActivity.kt | 4 +++ .../ui/activity/view/VaultListView.kt | 2 +- .../presentation/ui/adapter/VaultsAdapter.kt | 10 ++++-- .../ui/adapter/VaultsMoveListener.kt | 32 +++++++++++++++++++ .../ui/fragment/VaultListFragment.kt | 29 ++++++++++++++++- 6 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsMoveListener.kt diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 74a3d225..47c67091 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -603,6 +603,17 @@ class VaultListPresenter @Inject constructor( // view?.showDialog(AppIsObscuredInfoDialog.newInstance()) } + fun onVaultMoved(fromPosition: Int, toPosition: Int) { + // FIXME insert position int into the db and update here + + getVaultListUseCase.run(object : DefaultResultHandler>() { + override fun onSuccess(vaults: List) { + val vaultModels = vaults.mapTo(ArrayList()) { VaultModel(it) } + view?.vaultMoved(fromPosition, toPosition, vaultModels) + } + }) + } + fun onBiometricAuthenticationSucceeded(vaultModel: VaultModel) { if (changedVaultPassword) { changedVaultPassword = false diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt index 8d8e4642..e7643f43 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt @@ -150,6 +150,10 @@ class VaultListActivity : BaseActivity(), // return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true } + override fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List) { + vaultListFragment().vaultMoved(fromPosition, toPosition, vaultModelCollection) + } + override fun showVaultSettingsDialog(vaultModel: VaultModel) { val vaultSettingDialog = // SettingsVaultBottomSheet.newInstance(vaultModel) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt index 300ea4da..1682c7a2 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt @@ -23,5 +23,5 @@ interface VaultListView : View { fun isVaultLocked(vaultModel: VaultModel): Boolean fun cancelBasicAuthIfRunning() fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean - + fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt index 322e4f54..779a1ea4 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt @@ -8,14 +8,16 @@ import org.cryptomator.presentation.ui.adapter.VaultsAdapter.VaultViewHolder import javax.inject.Inject class VaultsAdapter @Inject -internal constructor() : RecyclerViewBaseAdapter() { +internal constructor() : RecyclerViewBaseAdapter(), VaultsMoveListener.Listener { - interface OnItemClickListener { + interface OnItemInteractionListener { fun onVaultClicked(vaultModel: VaultModel) fun onVaultSettingsClicked(vaultModel: VaultModel) fun onVaultLockClicked(vaultModel: VaultModel) + + fun onVaultMoved(fromPosition: Int, toPosition: Int) } override fun getItemLayout(viewType: Int): Int { @@ -65,4 +67,8 @@ internal constructor() : RecyclerViewBaseAdapter?) { + if (fromPosition < toPosition) { + for (i in fromPosition until toPosition) { + Collections.swap(vaultModelCollection, i, i + 1) + } + } else { + for (i in fromPosition downTo toPosition + 1) { + Collections.swap(vaultModelCollection, i, i - 1) + } + } + + vaultsAdapter.notifyItemMoved(fromPosition, toPosition) + } + fun rootView(): View = coordinatorLayout } From dc8f2f03334680e9bb912062ab8cbb36f14446a1 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sun, 31 Jan 2021 17:22:56 +0100 Subject: [PATCH 04/38] Update dependencies --- buildsystem/dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 4716a0a7..abbace80 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -31,7 +31,7 @@ ext { gsonVersion = '2.8.6' - okHttpVersion = '4.9.0' + okHttpVersion = '4.9.1' okHttpDigestVersion = '2.5' velocityVersion = '1.7' From 00174fdf5ac94b7dec3a0353fc13a6663102935d Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sun, 31 Jan 2021 22:54:49 +0100 Subject: [PATCH 05/38] #168 implement backend for sorting vault list. --- data/build.gradle | 2 +- .../cryptomator/data/db/DatabaseUpgrades.java | 6 +- .../org/cryptomator/data/db/Upgrade3To4.kt | 66 +++++++++++++++++++ .../data/db/entities/VaultEntity.java | 16 ++++- .../data/db/mappers/VaultEntityMapper.java | 2 + .../java/org/cryptomator/domain/Vault.java | 18 ++++- .../domain/usecases/vault/MoveVault.java | 28 ++++++++ .../domain/usecases/vault/MoveVaultHelper.kt | 45 +++++++++++++ .../presentation/model/VaultModel.kt | 2 + .../presenter/VaultListPresenter.kt | 27 ++++++-- .../ui/activity/VaultListActivity.kt | 8 ++- .../ui/activity/view/VaultListView.kt | 4 +- .../presentation/ui/adapter/VaultsAdapter.kt | 17 ++++- .../ui/adapter/VaultsMoveListener.kt | 25 +++++++ .../ui/fragment/VaultListFragment.kt | 20 +++--- 15 files changed, 258 insertions(+), 28 deletions(-) create mode 100644 data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt create mode 100644 domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java create mode 100644 domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt diff --git a/data/build.gradle b/data/build.gradle index d9b3ca1c..7740b19c 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -74,7 +74,7 @@ android { } greendao { - schemaVersion 3 + schemaVersion 4 } configurations.all { diff --git a/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java b/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java index f188e34f..60458e36 100644 --- a/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java +++ b/data/src/main/java/org/cryptomator/data/db/DatabaseUpgrades.java @@ -21,12 +21,14 @@ class DatabaseUpgrades { public DatabaseUpgrades( // Upgrade0To1 upgrade0To1, // Upgrade1To2 upgrade1To2, // - Upgrade2To3 upgrade2To3) { + Upgrade2To3 upgrade2To3, // + Upgrade3To4 upgrade3To4) { availableUpgrades = defineUpgrades( // upgrade0To1, // upgrade1To2, // - upgrade2To3); + upgrade2To3, // + upgrade3To4); } private Map> defineUpgrades(DatabaseUpgrade... upgrades) { diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt new file mode 100644 index 00000000..5ecb6cb2 --- /dev/null +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt @@ -0,0 +1,66 @@ +package org.cryptomator.data.db + +import org.cryptomator.data.db.Sql.SqlCreateTableBuilder.ForeignKeyBehaviour +import org.cryptomator.data.db.entities.CloudEntityDao +import org.cryptomator.data.db.entities.VaultEntityDao +import org.greenrobot.greendao.database.Database +import org.greenrobot.greendao.internal.DaoConfig +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { + + override fun internalApplyTo(db: Database, origin: Int) { + db.beginTransaction() + try { + upgradeDatabaseScheme(db) + updateVaultPositions(db) + db.setTransactionSuccessful() + } finally { + db.endTransaction() + } + } + + private fun upgradeDatabaseScheme(db: Database) { + Sql.alterTable("VAULT_ENTITY").renameTo("VAULT_ENTITY_OLD").executeOn(db) + Sql.createTable("VAULT_ENTITY") // + .id() // + .optionalInt("FOLDER_CLOUD_ID") // + .optionalText("FOLDER_PATH") // + .optionalText("FOLDER_NAME") // + .requiredText("CLOUD_TYPE") // + .optionalText("PASSWORD") // + .optionalInt("POSITION") // + .foreignKey("FOLDER_CLOUD_ID", "CLOUD_ENTITY", ForeignKeyBehaviour.ON_DELETE_SET_NULL) // + .executeOn(db) + + Sql.insertInto("VAULT_ENTITY") // + .select("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "CLOUD_ENTITY.TYPE") // + .columns("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "CLOUD_TYPE") // + .from("VAULT_ENTITY_OLD") // + .join("CLOUD_ENTITY", "VAULT_ENTITY_OLD.FOLDER_CLOUD_ID") // + .executeOn(db) + + Sql.dropIndex("IDX_VAULT_ENTITY_FOLDER_PATH_FOLDER_CLOUD_ID").executeOn(db) + + Sql.createUniqueIndex("IDX_VAULT_ENTITY_FOLDER_PATH_FOLDER_CLOUD_ID") // + .on("VAULT_ENTITY") // + .asc("FOLDER_PATH") // + .asc("FOLDER_CLOUD_ID") // + .executeOn(db) + + Sql.dropTable("VAULT_ENTITY_OLD").executeOn(db) + } + + private fun updateVaultPositions(db: Database) { + CloudEntityDao(DaoConfig(db, VaultEntityDao::class.java)) // + .loadAll() // + .map { + Sql.update("CLOUD_ENTITY") // + .where("_id", Sql.eq(it.id)) // + .set("POSITION", Sql.toInteger(it.id)) // + .executeOn(db) + } + } +} diff --git a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java index 75baf600..9201131d 100644 --- a/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java +++ b/data/src/main/java/org/cryptomator/data/db/entities/VaultEntity.java @@ -28,6 +28,8 @@ public class VaultEntity extends DatabaseEntity { private String password; + private Integer position; + /** * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}. * Entity must attached to an entity context. @@ -152,6 +154,14 @@ public class VaultEntity extends DatabaseEntity { this.password = password; } + public Integer getPosition() { + return this.position; + } + + public void setPosition(Integer position) { + this.position = position; + } + /** called by internal mechanisms, do not call yourself. */ @Generated(hash = 674742652) public void __setDaoSession(DaoSession daoSession) { @@ -159,14 +169,16 @@ public class VaultEntity extends DatabaseEntity { myDao = daoSession != null ? daoSession.getVaultEntityDao() : null; } - @Generated(hash = 1196809909) - public VaultEntity(Long id, Long folderCloudId, String folderPath, String folderName, @NotNull String cloudType, String password) { + @Generated(hash = 825602374) + public VaultEntity(Long id, Long folderCloudId, String folderPath, String folderName, @NotNull String cloudType, String password, + Integer position) { this.id = id; this.folderCloudId = folderCloudId; this.folderPath = folderPath; this.folderName = folderName; this.cloudType = cloudType; this.password = password; + this.position = position; } @Generated(hash = 691253864) diff --git a/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java b/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java index 645ab322..aabbfff1 100644 --- a/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java +++ b/data/src/main/java/org/cryptomator/data/db/mappers/VaultEntityMapper.java @@ -30,6 +30,7 @@ public class VaultEntityMapper extends EntityMapper { .withCloud(cloudFrom(entity)) // .withCloudType(CloudType.valueOf(entity.getCloudType())) // .withSavedPassword(entity.getPassword()) // + .withPosition(entity.getPosition()) // .build(); } @@ -51,6 +52,7 @@ public class VaultEntityMapper extends EntityMapper { } entity.setCloudType(domainObject.getCloudType().name()); entity.setPassword(domainObject.getPassword()); + entity.setPosition(domainObject.getPosition()); return entity; } } diff --git a/domain/src/main/java/org/cryptomator/domain/Vault.java b/domain/src/main/java/org/cryptomator/domain/Vault.java index 6bcd3669..1290f40b 100644 --- a/domain/src/main/java/org/cryptomator/domain/Vault.java +++ b/domain/src/main/java/org/cryptomator/domain/Vault.java @@ -19,7 +19,8 @@ public class Vault implements Serializable { .withPath(vault.getPath()) // .withUnlocked(vault.isUnlocked()) // .withSavedPassword(vault.getPassword()) // - .withVersion(vault.getVersion()); + .withVersion(vault.getVersion()) + .withPosition(vault.getPosition()); } private final Long id; @@ -30,6 +31,7 @@ public class Vault implements Serializable { private final boolean unlocked; private final String password; private final int version; + private final int position; private Vault(Builder builder) { this.id = builder.id; @@ -40,6 +42,7 @@ public class Vault implements Serializable { this.cloudType = builder.cloudType; this.password = builder.password; this.version = builder.version; + this.position = builder.position; } public Long getId() { @@ -74,6 +77,10 @@ public class Vault implements Serializable { return version; } + public int getPosition() { + return position; + } + public static class Builder { private Long id = NOT_SET; @@ -84,6 +91,7 @@ public class Vault implements Serializable { private boolean unlocked; private String password; private int version = -1; + private int position = -1; private Builder() { } @@ -154,6 +162,11 @@ public class Vault implements Serializable { return this; } + public Builder withPosition(int position) { + this.position = position; + return this; + } + public Vault build() { validate(); return new Vault(this); @@ -172,6 +185,9 @@ public class Vault implements Serializable { if (cloudType == null) { throw new IllegalStateException("cloudtype must be set"); } + if (position == -1) { + throw new IllegalStateException("position must be set"); + } } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java new file mode 100644 index 00000000..10bce6a5 --- /dev/null +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java @@ -0,0 +1,28 @@ +package org.cryptomator.domain.usecases.vault; + +import org.cryptomator.domain.Vault; +import org.cryptomator.domain.exception.BackendException; +import org.cryptomator.domain.repository.VaultRepository; +import org.cryptomator.generator.Parameter; +import org.cryptomator.generator.UseCase; + +import java.util.List; + +@UseCase +class MoveVault { + + private final VaultRepository vaultRepository; + private final int from; + private final int to; + + public MoveVault(VaultRepository vaultRepository, @Parameter Integer from, @Parameter Integer to) { + this.vaultRepository = vaultRepository; + this.from = from; + this.to = to; + } + + public List execute() throws BackendException { + List vaults = MoveVaultHelper.Companion.updateVaultPosition(from, to, vaultRepository); + return MoveVaultHelper.Companion.updateVaultsInDatabase(vaults, vaultRepository); + } +} diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt new file mode 100644 index 00000000..7bd498c6 --- /dev/null +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt @@ -0,0 +1,45 @@ +package org.cryptomator.domain.usecases.vault; + +import org.cryptomator.domain.Vault +import org.cryptomator.domain.repository.VaultRepository +import java.util.* + +class MoveVaultHelper { + + companion object { + fun updateVaultPosition(from: Int, to: Int, vaultRepository: VaultRepository): List { + val vaults = vaultRepository.vaults() + + vaults.sortWith(VaultComparator()) + + if (from < to) { + for (i in from until to) { + Collections.swap(vaults, i, i + 1) + } + } else { + for (i in from downTo to + 1) { + Collections.swap(vaults, i, i - 1) + } + } + + for (i in 0 until vaults.size) { + vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i + 1).build() + } + + vaults.forEach { vault -> vaultRepository.store(vault) } + + return vaults + } + + fun updateVaultsInDatabase(vaults: List, vaultRepository: VaultRepository): List { + vaults.forEach { vault -> vaultRepository.store(vault) } + return vaultRepository.vaults() + } + } + + internal class VaultComparator : Comparator { + override fun compare(o1: Vault, o2: Vault): Int { + return o1.position - o2.position + } + } +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/VaultModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/VaultModel.kt index 762d4a95..f15f1c50 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/VaultModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/VaultModel.kt @@ -13,6 +13,8 @@ class VaultModel(private val vault: Vault) : Serializable { get() = vault.path val isLocked: Boolean get() = !vault.isUnlocked + val position: Int + get() = vault.position fun toVault(): Vault { return vault diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 47c67091..09557a25 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -53,6 +53,7 @@ class VaultListPresenter @Inject constructor( // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, // private val saveVaultUseCase: SaveVaultUseCase, // + private val moveVaultUseCase: MoveVaultUseCase, // private val changePasswordUseCase: ChangePasswordUseCase, // private val removeStoredVaultPasswordsUseCase: RemoveStoredVaultPasswordsUseCase, // private val licenseCheckUseCase: DoLicenseCheckUseCase, // @@ -603,17 +604,33 @@ class VaultListPresenter @Inject constructor( // view?.showDialog(AppIsObscuredInfoDialog.newInstance()) } - fun onVaultMoved(fromPosition: Int, toPosition: Int) { - // FIXME insert position int into the db and update here - + fun onRowMoved(fromPosition: Int, toPosition: Int) { getVaultListUseCase.run(object : DefaultResultHandler>() { override fun onSuccess(vaults: List) { - val vaultModels = vaults.mapTo(ArrayList()) { VaultModel(it) } - view?.vaultMoved(fromPosition, toPosition, vaultModels) + view?.rowMoved(fromPosition, toPosition) + } + + override fun onError(e: Throwable) { + Timber.tag("VaultListPresenter").e(e, "Failed to query vault list while row moving") } }) } + fun onVaultMoved(fromPosition: Int, toPosition: Int) { + moveVaultUseCase + .withFrom(fromPosition) // + .andTo(toPosition) // + .run(object : DefaultResultHandler>() { + override fun onSuccess(vaults: List) { + view?.vaultMoved(vaults.mapTo(ArrayList()) { VaultModel(it) }) + } + + override fun onError(e: Throwable) { + Timber.tag("VaultListPresenter").e(e, "Failed to execute MoveVaultUseCase") + } + }) + } + fun onBiometricAuthenticationSucceeded(vaultModel: VaultModel) { if (changedVaultPassword) { changedVaultPassword = false diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt index e7643f43..73778681 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt @@ -150,8 +150,12 @@ class VaultListActivity : BaseActivity(), // return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true } - override fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List) { - vaultListFragment().vaultMoved(fromPosition, toPosition, vaultModelCollection) + override fun vaultMoved(vaults: List) { + vaultListFragment().vaultMoved(vaults) + } + + override fun rowMoved(fromPosition: Int, toPosition: Int) { + vaultListFragment().rowMoved(fromPosition, toPosition) } override fun showVaultSettingsDialog(vaultModel: VaultModel) { diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt index 1682c7a2..d5d25fb7 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt @@ -23,5 +23,7 @@ interface VaultListView : View { fun isVaultLocked(vaultModel: VaultModel): Boolean fun cancelBasicAuthIfRunning() fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean - fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List) + fun vaultMoved(vaults: List) + fun rowMoved(fromPosition: Int, toPosition: Int) + } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt index 779a1ea4..5d00e96d 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt @@ -8,8 +8,7 @@ import org.cryptomator.presentation.ui.adapter.VaultsAdapter.VaultViewHolder import javax.inject.Inject class VaultsAdapter @Inject -internal constructor() : RecyclerViewBaseAdapter(), VaultsMoveListener.Listener { - +internal constructor() : RecyclerViewBaseAdapter(VaultModelComparator()), VaultsMoveListener.Listener { interface OnItemInteractionListener { fun onVaultClicked(vaultModel: VaultModel) @@ -17,6 +16,8 @@ internal constructor() : RecyclerViewBaseAdapter { + override fun compare(o1: VaultModel, o2: VaultModel): Int { + return o1.position - o2.position + } + } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsMoveListener.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsMoveListener.kt index 4723be1a..6c0ee760 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsMoveListener.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsMoveListener.kt @@ -5,6 +5,9 @@ import androidx.recyclerview.widget.RecyclerView class VaultsMoveListener(val adapter: VaultsAdapter) : ItemTouchHelper.Callback() { + var dragFrom = -1 + var dragTo = -1 + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN return makeMovementFlags(dragFlags, 0) @@ -19,14 +22,36 @@ class VaultsMoveListener(val adapter: VaultsAdapter) : ItemTouchHelper.Callback( } override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + val fromPosition = viewHolder.adapterPosition + val toPosition = target.adapterPosition + + if (dragFrom == -1) { + dragFrom = fromPosition; + } + + dragTo = toPosition; + adapter.onRowMoved(viewHolder.adapterPosition, target.adapterPosition) return true } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + + if (dragFrom != -1 && dragTo != -1 && dragFrom != dragTo) { + adapter.onVaultMoved(dragFrom, dragTo) + } + + dragTo = -1 + dragFrom = -1 + } + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { } interface Listener { fun onRowMoved(fromPosition: Int, toPosition: Int) + fun onVaultMoved(fromPosition: Int, toPosition: Int) } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/VaultListFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/VaultListFragment.kt index 617b2bac..9069acbc 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/VaultListFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/VaultListFragment.kt @@ -13,7 +13,6 @@ import org.cryptomator.presentation.model.VaultModel import org.cryptomator.presentation.presenter.VaultListPresenter import org.cryptomator.presentation.ui.adapter.VaultsAdapter import org.cryptomator.presentation.ui.adapter.VaultsMoveListener -import java.util.* import javax.inject.Inject @Fragment(R.layout.fragment_vault_list) @@ -40,6 +39,10 @@ class VaultListFragment : BaseFragment() { vaultListPresenter.onVaultLockClicked(vaultModel) } + override fun onRowMoved(fromPosition: Int, toPosition: Int) { + vaultListPresenter.onRowMoved(fromPosition, toPosition) + } + override fun onVaultMoved(fromPosition: Int, toPosition: Int) { vaultListPresenter.onVaultMoved(fromPosition, toPosition) } @@ -96,17 +99,12 @@ class VaultListFragment : BaseFragment() { vaultsAdapter.addOrUpdateVault(vaultModel) } - fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List?) { - if (fromPosition < toPosition) { - for (i in fromPosition until toPosition) { - Collections.swap(vaultModelCollection, i, i + 1) - } - } else { - for (i in fromPosition downTo toPosition + 1) { - Collections.swap(vaultModelCollection, i, i - 1) - } - } + fun vaultMoved(vaults: List) { + vaultsAdapter.clear() + vaultsAdapter.addAll(vaults) + } + fun rowMoved(fromPosition: Int, toPosition: Int) { vaultsAdapter.notifyItemMoved(fromPosition, toPosition) } From 52e88b865def5c9ddafde5dcf46de37716c4dae8 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sun, 31 Jan 2021 23:12:43 +0100 Subject: [PATCH 06/38] Fix tests -.- --- .../presentation/presenter/VaultListPresenterTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java index ef80a487..2f1e9248 100644 --- a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java +++ b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java @@ -17,6 +17,7 @@ import org.cryptomator.domain.usecases.vault.ChangePasswordUseCase; import org.cryptomator.domain.usecases.vault.DeleteVaultUseCase; import org.cryptomator.domain.usecases.vault.GetVaultListUseCase; import org.cryptomator.domain.usecases.vault.LockVaultUseCase; +import org.cryptomator.domain.usecases.vault.MoveVaultUseCase; import org.cryptomator.domain.usecases.vault.PrepareUnlockUseCase; import org.cryptomator.domain.usecases.vault.RemoveStoredVaultPasswordsUseCase; import org.cryptomator.domain.usecases.vault.RenameVaultUseCase; @@ -56,6 +57,7 @@ public class VaultListPresenterTest { private static final Vault AN_UNLOCKED_VAULT = Vault.aVault() // .withId(1L) // + .withPosition(1) // .withName("Top Secret") // .withPath("/top secret") // .withCloudType(CloudType.DROPBOX) // @@ -63,6 +65,7 @@ public class VaultListPresenterTest { private static final Vault ANOTHER_VAULT_WITH_CLOUD = Vault.aVault() // .withId(2L) // + .withPosition(2) // .withName("Trip to the moon") // .withPath("/trip to the moon") // .withCloudType(CloudType.ONEDRIVE) // @@ -70,6 +73,7 @@ public class VaultListPresenterTest { private static final Vault A_VAULT_WITH_NEW_NAME = Vault.aVault() // .withId(3L) // + .withPosition(3) // .withName(A_NEW_VAULT_NAME) // .withPath("/trip to the moon") // .withCloudType(CloudType.GOOGLE_DRIVE) // @@ -120,6 +124,8 @@ public class VaultListPresenterTest { private SaveVaultUseCase saveVaultUseCase = Mockito.mock(SaveVaultUseCase.class); + private MoveVaultUseCase moveVaultUseCase = Mockito.mock(MoveVaultUseCase.class); + private ChangePasswordUseCase changePasswordUseCase = Mockito.mock(ChangePasswordUseCase.class); private RemoveStoredVaultPasswordsUseCase removeStoredVaultPasswordsUseCase = Mockito.mock(RemoveStoredVaultPasswordsUseCase.class); @@ -157,6 +163,7 @@ public class VaultListPresenterTest { addExistingVaultWorkflow, // createNewVaultWorkflow, // saveVaultUseCase, // + moveVaultUseCase, // changePasswordUseCase, // removeStoredVaultPasswordsUseCase, // doLicenceCheckUsecase, // From 36f7b800024a5c89f98195778758dbb65090e3f5 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sun, 31 Jan 2021 23:20:47 +0100 Subject: [PATCH 07/38] Preserve vault passwords as well while updating the database schema --- data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt index 5ecb6cb2..8c011b7e 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt @@ -14,7 +14,7 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { override fun internalApplyTo(db: Database, origin: Int) { db.beginTransaction() try { - upgradeDatabaseScheme(db) + upgradeDatabaseSchema(db) updateVaultPositions(db) db.setTransactionSuccessful() } finally { @@ -22,7 +22,7 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { } } - private fun upgradeDatabaseScheme(db: Database) { + private fun upgradeDatabaseSchema(db: Database) { Sql.alterTable("VAULT_ENTITY").renameTo("VAULT_ENTITY_OLD").executeOn(db) Sql.createTable("VAULT_ENTITY") // .id() // @@ -36,8 +36,8 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { .executeOn(db) Sql.insertInto("VAULT_ENTITY") // - .select("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "CLOUD_ENTITY.TYPE") // - .columns("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "CLOUD_TYPE") // + .select("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "PASSWORD", "CLOUD_ENTITY.TYPE") // + .columns("_id", "FOLDER_CLOUD_ID", "FOLDER_PATH", "FOLDER_NAME", "PASSWORD", "CLOUD_TYPE") // .from("VAULT_ENTITY_OLD") // .join("CLOUD_ENTITY", "VAULT_ENTITY_OLD.FOLDER_CLOUD_ID") // .executeOn(db) From a6b327f26458940caf76f52771a3f21307b4d805 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 1 Feb 2021 00:12:16 +0100 Subject: [PATCH 08/38] Remove dead code --- .../presentation/presenter/VaultListPresenter.kt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 09557a25..50930743 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -605,15 +605,7 @@ class VaultListPresenter @Inject constructor( // } fun onRowMoved(fromPosition: Int, toPosition: Int) { - getVaultListUseCase.run(object : DefaultResultHandler>() { - override fun onSuccess(vaults: List) { - view?.rowMoved(fromPosition, toPosition) - } - - override fun onError(e: Throwable) { - Timber.tag("VaultListPresenter").e(e, "Failed to query vault list while row moving") - } - }) + view?.rowMoved(fromPosition, toPosition) } fun onVaultMoved(fromPosition: Int, toPosition: Int) { From 657e2877ba793336358f31c2503403ac74170ab0 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 1 Feb 2021 00:37:31 +0100 Subject: [PATCH 09/38] #168 final clean-up --- .../java/org/cryptomator/data/db/Upgrade3To4.kt | 8 ++++---- .../domain/usecases/vault/MoveVaultHelper.kt | 10 ++++------ .../{MoveVault.java => MoveVaultPosition.java} | 14 +++++++------- .../presentation/presenter/VaultListPresenter.kt | 9 +++++---- .../presentation/ui/activity/VaultListActivity.kt | 8 ++++---- .../presentation/ui/activity/view/VaultListView.kt | 2 +- .../presenter/VaultListPresenterTest.java | 6 +++--- 7 files changed, 28 insertions(+), 29 deletions(-) rename domain/src/main/java/org/cryptomator/domain/usecases/vault/{MoveVault.java => MoveVaultPosition.java} (65%) diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt index 8c011b7e..e31364e2 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt @@ -14,15 +14,15 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { override fun internalApplyTo(db: Database, origin: Int) { db.beginTransaction() try { - upgradeDatabaseSchema(db) - updateVaultPositions(db) + addPositionToVaultSchema(db) + initVaultPositionUsingCurrentSortOrder(db) db.setTransactionSuccessful() } finally { db.endTransaction() } } - private fun upgradeDatabaseSchema(db: Database) { + private fun addPositionToVaultSchema(db: Database) { Sql.alterTable("VAULT_ENTITY").renameTo("VAULT_ENTITY_OLD").executeOn(db) Sql.createTable("VAULT_ENTITY") // .id() // @@ -53,7 +53,7 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { Sql.dropTable("VAULT_ENTITY_OLD").executeOn(db) } - private fun updateVaultPositions(db: Database) { + private fun initVaultPositionUsingCurrentSortOrder(db: Database) { CloudEntityDao(DaoConfig(db, VaultEntityDao::class.java)) // .loadAll() // .map { diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt index 7bd498c6..b405550d 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt @@ -7,17 +7,17 @@ import java.util.* class MoveVaultHelper { companion object { - fun updateVaultPosition(from: Int, to: Int, vaultRepository: VaultRepository): List { + fun updateVaultPosition(fromPosition: Int, toPosition: Int, vaultRepository: VaultRepository): List { val vaults = vaultRepository.vaults() vaults.sortWith(VaultComparator()) - if (from < to) { - for (i in from until to) { + if (fromPosition < toPosition) { + for (i in fromPosition until toPosition) { Collections.swap(vaults, i, i + 1) } } else { - for (i in from downTo to + 1) { + for (i in fromPosition downTo toPosition + 1) { Collections.swap(vaults, i, i - 1) } } @@ -26,8 +26,6 @@ class MoveVaultHelper { vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i + 1).build() } - vaults.forEach { vault -> vaultRepository.store(vault) } - return vaults } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultPosition.java similarity index 65% rename from domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java rename to domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultPosition.java index 10bce6a5..fd7c43d3 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVault.java +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultPosition.java @@ -9,20 +9,20 @@ import org.cryptomator.generator.UseCase; import java.util.List; @UseCase -class MoveVault { +class MoveVaultPosition { private final VaultRepository vaultRepository; - private final int from; - private final int to; + private final int fromPosition; + private final int toPosition; - public MoveVault(VaultRepository vaultRepository, @Parameter Integer from, @Parameter Integer to) { + public MoveVaultPosition(VaultRepository vaultRepository, @Parameter Integer fromPosition, @Parameter Integer toPosition) { this.vaultRepository = vaultRepository; - this.from = from; - this.to = to; + this.fromPosition = fromPosition; + this.toPosition = toPosition; } public List execute() throws BackendException { - List vaults = MoveVaultHelper.Companion.updateVaultPosition(from, to, vaultRepository); + List vaults = MoveVaultHelper.Companion.updateVaultPosition(fromPosition, toPosition, vaultRepository); return MoveVaultHelper.Companion.updateVaultsInDatabase(vaults, vaultRepository); } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 50930743..d4e1867b 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -53,7 +53,7 @@ class VaultListPresenter @Inject constructor( // private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // private val createNewVaultWorkflow: CreateNewVaultWorkflow, // private val saveVaultUseCase: SaveVaultUseCase, // - private val moveVaultUseCase: MoveVaultUseCase, // + private val moveVaultPositionUseCase: MoveVaultPositionUseCase, // private val changePasswordUseCase: ChangePasswordUseCase, // private val removeStoredVaultPasswordsUseCase: RemoveStoredVaultPasswordsUseCase, // private val licenseCheckUseCase: DoLicenseCheckUseCase, // @@ -609,9 +609,9 @@ class VaultListPresenter @Inject constructor( // } fun onVaultMoved(fromPosition: Int, toPosition: Int) { - moveVaultUseCase - .withFrom(fromPosition) // - .andTo(toPosition) // + moveVaultPositionUseCase + .withFromPosition(fromPosition) // + .andToPosition(toPosition) // .run(object : DefaultResultHandler>() { override fun onSuccess(vaults: List) { view?.vaultMoved(vaults.mapTo(ArrayList()) { VaultModel(it) }) @@ -710,6 +710,7 @@ class VaultListPresenter @Inject constructor( // lockVaultUseCase, // getVaultListUseCase, // saveVaultUseCase, // + moveVaultPositionUseCase, // removeStoredVaultPasswordsUseCase, // unlockVaultUseCase, // prepareUnlockUseCase, // diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt index 73778681..b3784a71 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt @@ -150,14 +150,14 @@ class VaultListActivity : BaseActivity(), // return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true } - override fun vaultMoved(vaults: List) { - vaultListFragment().vaultMoved(vaults) - } - override fun rowMoved(fromPosition: Int, toPosition: Int) { vaultListFragment().rowMoved(fromPosition, toPosition) } + override fun vaultMoved(vaults: List) { + vaultListFragment().vaultMoved(vaults) + } + override fun showVaultSettingsDialog(vaultModel: VaultModel) { val vaultSettingDialog = // SettingsVaultBottomSheet.newInstance(vaultModel) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt index d5d25fb7..4551f245 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/VaultListView.kt @@ -23,7 +23,7 @@ interface VaultListView : View { fun isVaultLocked(vaultModel: VaultModel): Boolean fun cancelBasicAuthIfRunning() fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean - fun vaultMoved(vaults: List) fun rowMoved(fromPosition: Int, toPosition: Int) + fun vaultMoved(vaults: List) } diff --git a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java index 2f1e9248..30e66dc2 100644 --- a/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java +++ b/presentation/src/test/java/org/cryptomator/presentation/presenter/VaultListPresenterTest.java @@ -17,7 +17,7 @@ import org.cryptomator.domain.usecases.vault.ChangePasswordUseCase; import org.cryptomator.domain.usecases.vault.DeleteVaultUseCase; import org.cryptomator.domain.usecases.vault.GetVaultListUseCase; import org.cryptomator.domain.usecases.vault.LockVaultUseCase; -import org.cryptomator.domain.usecases.vault.MoveVaultUseCase; +import org.cryptomator.domain.usecases.vault.MoveVaultPositionUseCase; import org.cryptomator.domain.usecases.vault.PrepareUnlockUseCase; import org.cryptomator.domain.usecases.vault.RemoveStoredVaultPasswordsUseCase; import org.cryptomator.domain.usecases.vault.RenameVaultUseCase; @@ -124,7 +124,7 @@ public class VaultListPresenterTest { private SaveVaultUseCase saveVaultUseCase = Mockito.mock(SaveVaultUseCase.class); - private MoveVaultUseCase moveVaultUseCase = Mockito.mock(MoveVaultUseCase.class); + private MoveVaultPositionUseCase moveVaultPositionUseCase = Mockito.mock(MoveVaultPositionUseCase.class); private ChangePasswordUseCase changePasswordUseCase = Mockito.mock(ChangePasswordUseCase.class); @@ -163,7 +163,7 @@ public class VaultListPresenterTest { addExistingVaultWorkflow, // createNewVaultWorkflow, // saveVaultUseCase, // - moveVaultUseCase, // + moveVaultPositionUseCase, // changePasswordUseCase, // removeStoredVaultPasswordsUseCase, // doLicenceCheckUsecase, // From 2ef3824b793109ae2c0a3bafffb18c070b4e871e Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 1 Feb 2021 22:15:10 +0100 Subject: [PATCH 10/38] Fix tablename in upgrade script --- data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt index e31364e2..a6e67481 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt @@ -57,7 +57,7 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { CloudEntityDao(DaoConfig(db, VaultEntityDao::class.java)) // .loadAll() // .map { - Sql.update("CLOUD_ENTITY") // + Sql.update("VAULT_ENTITY") // .where("_id", Sql.eq(it.id)) // .set("POSITION", Sql.toInteger(it.id)) // .executeOn(db) From 0a76b8bcd3633f996222edd67b55ab552dc8d1c2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 3 Feb 2021 16:16:52 +0100 Subject: [PATCH 11/38] Update dependencies --- build.gradle | 2 +- buildsystem/dependencies.gradle | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index fc0461cc..1c8ce9ec 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply from: 'buildsystem/dependencies.gradle' apply plugin: "com.vanniktech.android.junit.jacoco" buildscript { - ext.kotlin_version = '1.4.21' + ext.kotlin_version = '1.4.30' repositories { jcenter() mavenCentral() diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index abbace80..c993458e 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -38,7 +38,7 @@ ext { timberVersion = '4.7.1' - zxcvbnVersion = '1.3.4' + zxcvbnVersion = '1.3.5' scaleImageViewVersion = '3.10.0' @@ -58,7 +58,7 @@ ext { googlePlayServicesVersion = '19.0.0' googleClientVersion = '1.31.2' - msgraphVersion = '2.5.0' + msgraphVersion = '2.6.0' msaAuthVersion = '0.10.0' commonsCodecVersion = '1.15' @@ -88,7 +88,7 @@ ext { androidxPreferenceVersion = '1.0.0' // 1.1.0 and 1.1.2 does have a bug with the text size androidxRecyclerViewVersion = '1.1.0' androidxDocumentfileVersion = '1.0.1' - androidxBiometricVersion = '1.0.1' + androidxBiometricVersion = '1.1.0' androidxTestCoreVersion = '1.3.0' jsonWebTokenApiVersion = '0.11.2' From 9b63b7c525768ff1f571f025f6ca1a756561db79 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Thu, 4 Feb 2021 23:34:48 +0100 Subject: [PATCH 12/38] #168 set vault position while creating, adding and deleting vaults --- .../domain/usecases/vault/CreateVault.java | 7 ++-- .../domain/usecases/vault/DeleteVault.java | 9 ++++- .../domain/usecases/vault/MoveVaultHelper.kt | 13 +++++++ .../workflow/AddExistingVaultWorkflow.java | 35 ++++++++++++------- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java index 9b73b5f2..ee61b6a9 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java @@ -35,7 +35,10 @@ class CreateVault { CloudFolder vaultFolder = cloudContentRepository.folder(folder, vaultName); vaultFolder = cloudContentRepository.create(vaultFolder); cloudRepository.create(vaultFolder, password); - return vaultRepository.store(aVault().thatIsNew().withNamePathAndCloudFrom(vaultFolder).build()); + return vaultRepository.store(aVault() // + .thatIsNew() // + .withNamePathAndCloudFrom(vaultFolder) // + .withPosition(vaultRepository.vaults().size() + 1) // + .build()); } - } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java index 7ff6cb17..7a807060 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/DeleteVault.java @@ -6,6 +6,8 @@ import org.cryptomator.domain.repository.VaultRepository; import org.cryptomator.generator.Parameter; import org.cryptomator.generator.UseCase; +import java.util.List; + @UseCase class DeleteVault { @@ -18,7 +20,12 @@ class DeleteVault { } public Long execute() throws BackendException { - return vaultRepository.delete(vault); + Long vaultId = vaultRepository.delete(vault); + + List reorderVaults = MoveVaultHelper.Companion.reorderVaults(vaultRepository); + MoveVaultHelper.Companion.updateVaultsInDatabase(reorderVaults, vaultRepository); + + return vaultId; } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt index b405550d..40985b64 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt @@ -29,6 +29,19 @@ class MoveVaultHelper { return vaults } + private fun reorderVaults(vaults: MutableList) : List { + for (i in 0 until vaults.size) { + vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i + 1).build() + } + return vaults; + } + + fun reorderVaults(vaultRepository: VaultRepository) : List { + val vaults = vaultRepository.vaults() + vaults.sortWith(VaultComparator()) + return reorderVaults(vaults) + } + fun updateVaultsInDatabase(vaults: List, vaultRepository: VaultRepository): List { vaults.forEach { vault -> vaultRepository.store(vault) } return vaultRepository.vaults() diff --git a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java index 1ec41190..937e07ae 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java +++ b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java @@ -7,6 +7,7 @@ import org.cryptomator.domain.CloudFolder; import org.cryptomator.domain.Vault; import org.cryptomator.domain.di.PerView; import org.cryptomator.domain.usecases.cloud.GetRootFolderUseCase; +import org.cryptomator.domain.usecases.vault.GetVaultListUseCase; import org.cryptomator.domain.usecases.vault.SaveVaultUseCase; import org.cryptomator.generator.Callback; import org.cryptomator.presentation.R; @@ -18,6 +19,7 @@ import org.cryptomator.presentation.model.mappers.CloudModelMapper; import org.cryptomator.presentation.presenter.VaultListPresenter; import java.io.Serializable; +import java.util.List; import javax.inject.Inject; @@ -30,6 +32,7 @@ import static org.cryptomator.presentation.intent.Intents.chooseCloudServiceInte public class AddExistingVaultWorkflow extends Workflow { private final SaveVaultUseCase saveVaultUseCase; + private final GetVaultListUseCase getVaultListUseCase; private final GetRootFolderUseCase getRootFolderUseCase; private final CloudModelMapper cloudModelMapper; private final AuthenticationExceptionHandler authenticationExceptionHandler; @@ -38,13 +41,15 @@ public class AddExistingVaultWorkflow extends Workflow() { - @Override - public void onSuccess(Vault vault) { - ((VaultListPresenter) presenter()).onAddOrCreateVaultCompleted(vault); - } - }); + getVaultListUseCase.run(presenter().new ProgressCompletingResultHandler>() { + @Override + public void onSuccess(List vaults) { + saveVaultUseCase// + .withVault(aVault() // + .withNamePathAndCloudFrom(state().masterkeyFile.getParent()) // + .withPosition(vaults.size() + 1) // + .thatIsNew() // + .build()) // + .run(presenter().new ProgressCompletingResultHandler() { + @Override + public void onSuccess(Vault vault) { + ((VaultListPresenter) presenter()).onAddOrCreateVaultCompleted(vault); + } + }); + } + }); } public static class State implements Serializable { From af456eb99420e033809d804d1dc094e193411039 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 5 Feb 2021 22:09:54 +0100 Subject: [PATCH 13/38] Add fastlane :rocket: --- .gitignore | 12 +- Gemfile | 9 + Gemfile.lock | 211 ++++++++++++++++++ fastlane/.default.env | 19 ++ fastlane/Appfile | 2 + fastlane/Fastfile | 174 +++++++++++++++ fastlane/Pluginfile | 5 + fastlane/README.md | 34 +++ .../android/de-DE/changelogs/default.txt | 1 + .../android/de-DE/full_description.txt | 39 ++++ .../android/de-DE/short_description.txt | 1 + fastlane/metadata/android/de-DE/title.txt | 1 + fastlane/metadata/android/de-DE/video.txt | 0 .../android/en-US/changelogs/default.txt | 1 + .../android/en-US/full_description.txt | 39 ++++ .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + fastlane/metadata/android/en-US/video.txt | 0 .../android/fr-FR/changelogs/default.txt | 1 + .../android/fr-FR/full_description.txt | 39 ++++ .../android/fr-FR/short_description.txt | 1 + fastlane/metadata/android/fr-FR/title.txt | 1 + fastlane/metadata/android/fr-FR/video.txt | 0 fastlane/release_notes_apkstore_en.html | 3 + 24 files changed, 587 insertions(+), 8 deletions(-) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 fastlane/.default.env create mode 100644 fastlane/Appfile create mode 100644 fastlane/Fastfile create mode 100644 fastlane/Pluginfile create mode 100644 fastlane/README.md create mode 100644 fastlane/metadata/android/de-DE/changelogs/default.txt create mode 100644 fastlane/metadata/android/de-DE/full_description.txt create mode 100644 fastlane/metadata/android/de-DE/short_description.txt create mode 100644 fastlane/metadata/android/de-DE/title.txt create mode 100644 fastlane/metadata/android/de-DE/video.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/default.txt create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt create mode 100644 fastlane/metadata/android/en-US/video.txt create mode 100644 fastlane/metadata/android/fr-FR/changelogs/default.txt create mode 100644 fastlane/metadata/android/fr-FR/full_description.txt create mode 100644 fastlane/metadata/android/fr-FR/short_description.txt create mode 100644 fastlane/metadata/android/fr-FR/title.txt create mode 100644 fastlane/metadata/android/fr-FR/video.txt create mode 100644 fastlane/release_notes_apkstore_en.html diff --git a/.gitignore b/.gitignore index a18d2645..a4db20d4 100644 --- a/.gitignore +++ b/.gitignore @@ -31,11 +31,7 @@ build/ local.properties # fastlane -secret_key_file.json -**/**/fastlane/fastlane/** -**/**/fastlane/metadata/** -**/**/fastlane/report.xml -**/**/fastlane/mappings/** -**/**/fastlane/release_notes/** -**/**/fastlane/latest_versions/** -.env.default +**/fastlane/.env +**/fastlane/metadata/**/images/** +**/fastlane/report.xml +**/fastlane/latest_versions/** diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000..448c34f4 --- /dev/null +++ b/Gemfile @@ -0,0 +1,9 @@ +source "https://rubygems.org" + +gem "fastlane" +gem "net-sftp" +gem "ed25519" +gem "bcrypt_pbkdf" + +plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') +eval_gemfile(plugins_path) if File.exist?(plugins_path) diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000..97697954 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,211 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.3) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.1.0) + aws-partitions (1.424.0) + aws-sdk-core (3.112.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.239.0) + aws-sigv4 (~> 1.1) + jmespath (~> 1.0) + aws-sdk-kms (1.42.0) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.88.0) + aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.1) + aws-sigv4 (1.2.2) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + bcrypt_pbkdf (1.0.1) + claide (1.0.3) + colored (1.2) + colored2 (3.1.2) + commander-fastlane (4.4.6) + highline (~> 1.7.2) + declarative (0.0.20) + declarative-option (0.1.0) + digest-crc (0.6.3) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.7.6) + ed25519 (1.2.4) + emoji_regex (3.2.1) + excon (0.79.0) + faraday (1.3.0) + faraday-net_http (~> 1.0) + multipart-post (>= 1.2, < 3) + ruby2_keywords + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-net_http (1.0.1) + faraday_middleware (1.0.0) + faraday (~> 1.0) + fastimage (2.2.2) + fastlane (2.173.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.3, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander-fastlane (>= 4.4.6, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-api-client (>= 0.37.0, < 0.39.0) + google-cloud-storage (>= 1.15.0, < 2.0.0) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (~> 2.0.0) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + slack-notifier (>= 2.0.0, < 3.0.0) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-get_version_name (0.2.2) + gh_inspector (1.1.3) + google-api-client (0.38.0) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.9) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + signet (~> 0.12) + google-apis-core (0.2.1) + addressable (~> 2.5, >= 2.5.1) + googleauth (~> 0.14) + httpclient (>= 2.8.1, < 3.0) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + rexml + signet (~> 0.14) + webrick + google-apis-iamcredentials_v1 (0.1.0) + google-apis-core (~> 0.1) + google-apis-storage_v1 (0.1.0) + google-apis-core (~> 0.1) + google-cloud-core (1.5.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.4.0) + faraday (>= 0.17.3, < 2.0) + google-cloud-errors (1.0.1) + google-cloud-storage (1.30.0) + addressable (~> 2.5) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.1) + google-cloud-core (~> 1.2) + googleauth (~> 0.9) + mini_mime (~> 1.0) + googleauth (0.15.0) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.4, < 3.0) + memoist (~> 0.16) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (~> 0.14) + highline (1.7.10) + http-cookie (1.0.3) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.4.0) + json (2.5.1) + jwt (2.2.2) + memoist (0.16.2) + mini_magick (4.11.0) + mini_mime (1.0.2) + multi_json (1.15.0) + multipart-post (2.0.0) + nanaimo (0.3.0) + naturally (2.2.1) + net-sftp (2.1.2) + net-ssh (>= 2.6.5) + net-ssh (5.2.0) + os (1.1.1) + plist (3.6.0) + public_suffix (4.0.6) + rake (13.0.3) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.4) + rouge (2.0.7) + ruby2_keywords (0.0.4) + rubyzip (2.3.0) + security (0.1.3) + signet (0.14.1) + addressable (~> 2.3) + faraday (>= 0.17.3, < 2.0) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.8) + CFPropertyList + naturally + slack-notifier (2.3.2) + terminal-notifier (2.0.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (1.7.0) + webrick (1.7.0) + word_wrap (1.0.0) + xcodeproj (1.19.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + bcrypt_pbkdf + ed25519 + fastlane + fastlane-plugin-get_version_name + net-sftp + +BUNDLED WITH + 2.2.5 diff --git a/fastlane/.default.env b/fastlane/.default.env new file mode 100644 index 00000000..d79b8d49 --- /dev/null +++ b/fastlane/.default.env @@ -0,0 +1,19 @@ +# This file is just a template and should remain untouched +# COPY this file to .env and fill out the env variables + +GOOGLE_PLAYSTORE_PRIVATE_KEY_FILE_PATH= + +SIGNING_KEYSOTRE_PATH= +SIGNING_KEYSOTRE_PASSWORD= +SIGNING_KEY_ALIAS= +SIGNING_KEY_PASSWORD= + +SIGNING_UPDATE_APK_STORE_KEY_PATH= +SIGNING_UPDATE_APK_STORE_PUB_KEY_PATH= +APK_STORE_BASIC_URL= + +FTP_SERVER_USERNAME= +FTP_SERVER_KEY_FILE= +FTP_SERVER_PORT= + +SLACK_URL= diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 00000000..864808dc --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1,2 @@ +json_key_file(ENV["GOOGLE_PLAYSTORE_PRIVATE_KEY_FILE_PATH"]) +package_name("org.cryptomator") diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 00000000..6ac8b339 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,174 @@ +fastlane_require 'dotenv' +fastlane_require 'jwt' +fastlane_require 'base64' +fastlane_require 'net/sftp' + +default_platform(:android) + +branch_name = `git rev-parse --abbrev-ref HEAD` +build = `git rev-list --count #{branch_name} | tr -d " \t\n\r"` +build = build.to_i + 1958 # adding 1958 for legacy reasons. Must be in sync with getVersionCode() from build.gradle +version = get_version_name( + gradle_file_path:"build.gradle", + ext_constant_name:"androidVersionName") +version = version.delete "'" + +platform :android do |options| + + desc "Run all the tests" + lane :test do |options| + gradle(task: "test") + end + + desc "Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default)" + lane :deploy do |options| + release_note_path_en = "metadata/android/en-US/changelogs/default.txt" + + # use english-change-log for french language too + FileUtils.cp(release_note_path_en, "metadata/android/fr-FR/changelogs/default.txt") + + deployToPlaystore(scheduled:options[:scheduled], beta:options[:beta]) + + if options[:beta] + puts "Skipping deployment to server cause there isn't currently a beta channel" + + slack( + default_payloads: [], # reduce the notification to the minimum + message: ":rocket: Successfully deployed #{version} with code #{build} to the Play Store :cryptomator:", + payload: { + "Changes" => File.read(release_note_path_en) + } + ) + else + deployToServer(scheduled:options[:scheduled], beta:options[:beta]) + + slack( + default_payloads: [], # reduce the notification to the minimum + message: ":rocket: Successfully deployed #{version} with code #{build} to the Play Store and APK store :cryptomator:", + payload: { + "Changes" => File.read(release_note_path_en) + } + ) + end + + end + + desc "Deploy new version to Playstore" + private_lane :deployToPlaystore do |options| + deploy_target = "production" + + if options[:beta] + deploy_target = "beta" + end + + gradle(task: "clean") + + gradle( + task: "assemble", + build_type: "Release", + flavor: "playstore", + print_command: false, + properties: { + "android.injected.signing.store.file" => ENV["SIGNING_KEYSOTRE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSOTRE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], + "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], + } + ) + + upload_to_play_store( + package_name: 'org.cryptomator', + track: deploy_target, + apk: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], + mapping: lane_context[SharedValues::GRADLE_MAPPING_TXT_OUTPUT_PATH], + version_name: version, + version_code: build, + release_status: "draft", + json_key: ENV["GOOGLE_PLAYSTORE_PRIVATE_KEY_FILE_PATH"], + skip_upload_aab: true, + skip_upload_metadata: false, + skip_upload_images: true, + skip_upload_screenshots: true, + metadata_path: "fastlane/metadata/android" + ) + end + + desc "Deploy new version to server" + private_lane :deployToServer do |options| + gradle(task: "clean") + + gradle( + task: "assemble", + build_type: "Release", + flavor: "apkstore", + print_command: false, + properties: { + "android.injected.signing.store.file" => ENV["SIGNING_KEYSOTRE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSOTRE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], + "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], + } + ) + + server_host = ENV["APK_STORE_BASIC_URL"] + server_relative_folder = "/mnt/data/android/" + base_url = "https://#{server_host}/android/" + apk_url = "#{base_url}#{version}/Cryptomator-#{version}.apk" + relative_apk_url = "#{server_relative_folder}#{version}/Cryptomator-#{version}.apk" + release_note_url = "#{base_url}#{version}/release-notes.html" + relative_release_note_url = "#{server_relative_folder}#{version}/release-notes.html" + + claims = { + "version": version, + "url": apk_url, + "release_notes": release_note_url + } + + private_key = OpenSSL::PKey.read(File.read(ENV["SIGNING_UPDATE_APK_STORE_KEY_PATH"])) + token = JWT.encode claims, private_key, "ES256" + + latest_version_filename = "latest-version.json" + if options[:scheduled] + latest_version_filename = "latest-version-#{version}.json" + puts "Scheduled upload activated, uploading latest-version.json to #{latest_version_filename} with claims #{claims}" + else + puts "#{latest_version_filename} has claims #{claims}" + end + + latest_version_jsn = File.new("latest_versions/#{latest_version_filename}","w") + latest_version_jsn.write(token) + latest_version_jsn.close + latest_version_jsn = File.open("latest_versions/#{latest_version_filename}","r") + + release_note_path = "release_notes_apkstore_en.html" + release_note_file = File.open(release_note_path,"r") + + puts latest_version_filename + + Net::SFTP.start( + ENV["FTP_SERVER_URL"], + ENV["FTP_SERVER_USERNAME"], + :keys=>[ENV["FTP_SERVER_KEY_FILE"]], + keys_only: true, + verify_host_key: :never, + :port=>ENV["FTP_SERVER_PORT"] + ) do |sftp| + puts "Uploading files to server..." + sftp.mkdir! "#{server_relative_folder}#{version}" + sftp.upload!(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], relative_apk_url) + sftp.upload!(release_note_file, relative_release_note_url) + sftp.upload!(latest_version_jsn, "#{server_relative_folder}#{latest_version_filename}") + end + + latest_version_jsn.close + release_note_file.close + end + + after_all do |lane| + #error do |lane, exception| + # slack( + # message: exception.message, + # success:false + # ) + end +end diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile new file mode 100644 index 00000000..45823f1d --- /dev/null +++ b/fastlane/Pluginfile @@ -0,0 +1,5 @@ +# Autogenerated by fastlane +# +# Ensure this file is checked in to source control! + +gem 'fastlane-plugin-get_version_name' diff --git a/fastlane/README.md b/fastlane/README.md new file mode 100644 index 00000000..0302bf6f --- /dev/null +++ b/fastlane/README.md @@ -0,0 +1,34 @@ +fastlane documentation +================ +# Installation + +Make sure you have the latest version of the Xcode command line tools installed: + +``` +xcode-select --install +``` + +Install _fastlane_ using +``` +[sudo] gem install fastlane -NV +``` +or alternatively using `brew install fastlane` + +# Available Actions +## Android +### android test +``` +fastlane android test +``` +Run all the tests +### android deploy +``` +fastlane android deploy +``` +Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default) + +---- + +This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. +More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). +The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/fastlane/metadata/android/de-DE/changelogs/default.txt b/fastlane/metadata/android/de-DE/changelogs/default.txt new file mode 100644 index 00000000..96332f4f --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/default.txt @@ -0,0 +1 @@ +- Foo \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt new file mode 100644 index 00000000..bebbf920 --- /dev/null +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -0,0 +1,39 @@ +Cryptomator macht Cloud-Speicher vertrauenswürdig. Die App verschlüsselt Dateien auf Ihrem Smartphone, bevor diese in die Cloud gelangen. Selbst im Falle eines unberechtigten Zugriffs auf Ihre Cloud (z.B. Hacker-Angriffe), sind Ihre Dateien durch die Verschlüsselung trotzdem sicher geschützt. + +

EINFACHHEIT

+ +Bei der Entwicklung von Cryptomator steht die Benutzerfreundlichkeit im Fokus. + +• Erstellen Sie einen Tresor und vergeben Sie ein Passwort +• Keine komplizierte Konfiguration und keine weiteren Accounts notwendig +• Entsperren Sie Tresore mit Ihrem Fingerabdruck* + +* ab Android 6.0 and Smartphones mit Fingerabdruck-Sensor + +

KOMPATIBILITÄT

+ +Cryptomator ist kompatibel mit den meistgenutzten Cloud-Speichern und verfügbar für alle gängigen Betriebssysteme. + +• Kompatibel mit Dropbox, Google Drive, OneDrive und WebDAV-basierten Cloudspeicher-Diensten +• Erstellen Sie auch Tresore in Androids lokalem Speicher (funktioniert bspw. zusammen mit Sync-Apps von Drittanbietern) +• Greifen Sie auf Ihre Tresore von allen Ihren mobilen Endgeräten und Computern zu + +

SICHERHEIT

+ +Cryptomator für Android basiert auf dem bewährten Open-Source-Fundament Cryptomator für Desktop. + +• Verschlüsselung der Dateiinhalte und Dateinamen mit AES und 256-Bit-Schlüssellänge +• Erhöhte Brute-Force-Resistenz des Tresor-Passworts durch Einsatz von scrypt +• Tresore werden automatisch gesperrt, wenn die App in den Hintergrund geschickt wird +• Verschlüsselungsimplementierung basiert auf der Open-Source-Bibliothek CryptoLib und ist öffentlich dokumentiert + +

SENSATIONELLE VERSCHLÜSSELUNGSTECHNOLOGIEIMPLEMENTIERUNG

+ +Cryptomator wurde mit dem CeBIT Innovation Award 2016 for Usable Security and Privacy ausgezeichnet. Wir freuen uns, hunderttausenden Cryptomator-Nutzern Sicherheit und Privatsphärenschutz bieten zu können. + +

CRYPTOMATOR COMMUNITY

+ +Treten Sie der Cryptomator Community bei und tauschen Sie sich mit Cryptomator-Nutzern aus: https://community.cryptomator.org + +• Folgen Sie uns auf Twitter @Cryptomator +• Liken Sie uns auf Facebook /Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt new file mode 100644 index 00000000..591a40e1 --- /dev/null +++ b/fastlane/metadata/android/de-DE/short_description.txt @@ -0,0 +1 @@ +Nimm die Sicherung deiner Cloud-Daten selbst in die Hand \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt new file mode 100644 index 00000000..f9944b4a --- /dev/null +++ b/fastlane/metadata/android/de-DE/title.txt @@ -0,0 +1 @@ +Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/video.txt b/fastlane/metadata/android/de-DE/video.txt new file mode 100644 index 00000000..e69de29b diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt new file mode 100644 index 00000000..96332f4f --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/default.txt @@ -0,0 +1 @@ +- Foo \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 00000000..eef1cf2d --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,39 @@ +Cryptomator makes your cloud storage trustworthy. The app encrypts files on your mobile device before they are uploaded to your cloud. Even if a third party gained unauthorized access to your files (e.g., hacker attack), your files are secure from prying eyes. + +

SIMPLICITY

+ +Cryptomator has been developed with a strong focus on user-friendliness. + +• Simply create a vault and assign a password +• No additional account or configuration needed +• Unlock vaults with your fingerprint* + +* from Android 6.0 and smartphones with fingerprint sensor + +

COMPATIBILITY

+ +Cryptomator is compatible with the most commonly used cloud storages and available for all major operating systems. + +• Compatible with Dropbox, Google Drive, OneDrive, and WebDAV-based cloud storage services +• Create vaults in Android’s local storage (e.g., works with third-party sync apps) +• Access your vaults on all your mobile devices and computers + +

SECURITY

+ +Cryptomator for Android is based on the solid open-source foundation of Cryptomator for Desktop. + +• File content and filename encryption with AES and 256 bit key length +• Vault password is secured with scrypt for enhanced brute-force resistance +• Vaults are automatically locked after sending app to background +• Crypto implementation is based on the open-source library CryptoLib and is publicly documented + +

GENERAL AWESOMENESS

+ +Cryptomator received the CeBIT Innovation Award 2016 for Usable Security and Privacy. We're proud to provide security and privacy for hundreds of thousands of Cryptomator users. + +

CRYPTOMATOR COMMUNITY

+ +Join the Cryptomator Community and participate in the conversations with other Cryptomator users. + +• Follow us on Twitter @Cryptomator +• Like us on Facebook /Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 00000000..7a0ae9a7 --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Put a lock on your cloud: Take the security of your data into your own hands \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 00000000..f9944b4a --- /dev/null +++ b/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/video.txt b/fastlane/metadata/android/en-US/video.txt new file mode 100644 index 00000000..e69de29b diff --git a/fastlane/metadata/android/fr-FR/changelogs/default.txt b/fastlane/metadata/android/fr-FR/changelogs/default.txt new file mode 100644 index 00000000..96332f4f --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/default.txt @@ -0,0 +1 @@ +- Foo \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt new file mode 100644 index 00000000..3da0e77f --- /dev/null +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -0,0 +1,39 @@ +Cryptomator rend votre stockage dans le cloud beaucoup plus sûr. L'application chiffre les fichiers sur votre appareil mobile avant qu'ils ne soient envoyés dans votre cloud. Même si une tierce partie obtient un accès non autorisé à vos fichiers (par exemple, une attaque de pirates informatiques), vos fichiers sont à l'abri des regards indiscrets. + +

SIMPLICITÉ

+ +Cryptomator a été développé en mettant l'accent sur la convivialité. + +• Il suffit de créer un coffre-fort et d'y attribuer un mot de passe +• Aucun compte ou configuration supplémentaire n'est nécessaire +• Déverrouillez les coffres-forts avec votre empreinte digitale*. + +* à partir d'Android 6.0 et sur smartphones avec capteur biométrique d'empreintes digitales + +

COMPATIBILITÉ

+ +Cryptomator est compatible avec les systèmes de stockage dans le cloud les plus couramment utilisés et disponible pour tous les principaux systèmes d'exploitation. + +• Compatible avec Dropbox, Google Drive, OneDrive et les services de stockage dans le nuage basés sur WebDAV +• Créer des coffres-forts dans le stockage local d'Android (par exemple, fonctionne avec des applications de synchronisation tierces) +• Accédez à vos coffres-forts sur tous vos appareils mobiles et ordinateurs + +

SÉCURITÉ

+ +Cryptomator pour Android est basé sur le projet open-source de Cryptomator pour Ordinateur de bureau. + +• Chiffrement du contenu et des noms de fichiers via AES et une longueur de clé de 256 bits +• Le mot de passe du coffre-fort est sécurisé par cryptage pour une meilleure résistance aux attaque par force brut +• Les coffre-forts sont automatiquement verrouillées après la mise en arrière-plan de l'application +• La mise en œuvre de Crypto est basée sur la bibliothèque open-source CryptoLib et est documentée publiquement + +

UNE GÉNIALITUDE GÉNÉRAL

+ +Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs du Cryptomator. + +

LA COMMUNAUTÉ CRYPTOMATOR

+ +Rejoignez la communauté de Cryptomator et participez aux conversations avec les autres utilisateurs de Cryptomator: https://community.cryptomator.org + +- Suivez-nous sur Twitter @Cryptomator +- Comme nous sur Facebook/Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt new file mode 100644 index 00000000..0a4252a1 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/short_description.txt @@ -0,0 +1 @@ +Verrouillé votre cloud: Prenez en mains la sécurité de vos données \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt new file mode 100644 index 00000000..f9944b4a --- /dev/null +++ b/fastlane/metadata/android/fr-FR/title.txt @@ -0,0 +1 @@ +Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/video.txt b/fastlane/metadata/android/fr-FR/video.txt new file mode 100644 index 00000000..e69de29b diff --git a/fastlane/release_notes_apkstore_en.html b/fastlane/release_notes_apkstore_en.html new file mode 100644 index 00000000..8066f97b --- /dev/null +++ b/fastlane/release_notes_apkstore_en.html @@ -0,0 +1,3 @@ +
    +
  • Foo
  • +
\ No newline at end of file From c87a37a25a68b78dd2f7485668552e7d11782e2a Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sat, 6 Feb 2021 12:33:19 +0100 Subject: [PATCH 14/38] Apply suggestions from code review Co-authored-by: Tobias Hagemann --- fastlane/.default.env | 4 ++-- fastlane/Fastfile | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/fastlane/.default.env b/fastlane/.default.env index d79b8d49..fe1d804a 100644 --- a/fastlane/.default.env +++ b/fastlane/.default.env @@ -3,8 +3,8 @@ GOOGLE_PLAYSTORE_PRIVATE_KEY_FILE_PATH= -SIGNING_KEYSOTRE_PATH= -SIGNING_KEYSOTRE_PASSWORD= +SIGNING_KEYSTORE_PATH= +SIGNING_KEYSTORE_PASSWORD= SIGNING_KEY_ALIAS= SIGNING_KEY_PASSWORD= diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 6ac8b339..16c926f0 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -53,7 +53,7 @@ platform :android do |options| end - desc "Deploy new version to Playstore" + desc "Deploy new version to Play Store" private_lane :deployToPlaystore do |options| deploy_target = "production" @@ -69,15 +69,14 @@ platform :android do |options| flavor: "playstore", print_command: false, properties: { - "android.injected.signing.store.file" => ENV["SIGNING_KEYSOTRE_PATH"], - "android.injected.signing.store.password" => ENV["SIGNING_KEYSOTRE_PASSWORD"], + "android.injected.signing.store.file" => ENV["SIGNING_KEYSTORE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSTORE_PASSWORD"], "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], } ) upload_to_play_store( - package_name: 'org.cryptomator', track: deploy_target, apk: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], mapping: lane_context[SharedValues::GRADLE_MAPPING_TXT_OUTPUT_PATH], @@ -103,8 +102,8 @@ platform :android do |options| flavor: "apkstore", print_command: false, properties: { - "android.injected.signing.store.file" => ENV["SIGNING_KEYSOTRE_PATH"], - "android.injected.signing.store.password" => ENV["SIGNING_KEYSOTRE_PASSWORD"], + "android.injected.signing.store.file" => ENV["SIGNING_KEYSTORE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSTORE_PASSWORD"], "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], } From 656276e991970a72c0c3f30958b6a1c4047953c8 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 8 Feb 2021 14:30:19 +0100 Subject: [PATCH 15/38] Create lane for F-Droid build and save all variants to release folder --- .gitignore | 1 - fastlane/Fastfile | 27 +++++++++++++++++++++++++++ fastlane/README.md | 5 +++++ fastlane/latest_versions/.gitignore | 4 ++++ fastlane/release/.gitignore | 4 ++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 fastlane/latest_versions/.gitignore create mode 100644 fastlane/release/.gitignore diff --git a/.gitignore b/.gitignore index a4db20d4..c4f61d1c 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,3 @@ local.properties **/fastlane/.env **/fastlane/metadata/**/images/** **/fastlane/report.xml -**/fastlane/latest_versions/** diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 16c926f0..2c2ec138 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -41,6 +41,7 @@ platform :android do |options| ) else deployToServer(scheduled:options[:scheduled], beta:options[:beta]) + deployToFDroid(scheduled:options[:scheduled], beta:options[:beta]) slack( default_payloads: [], # reduce the notification to the minimum @@ -90,6 +91,8 @@ platform :android do |options| skip_upload_screenshots: true, metadata_path: "fastlane/metadata/android" ) + + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_playstore_signed.apk") end desc "Deploy new version to server" @@ -161,6 +164,30 @@ platform :android do |options| latest_version_jsn.close release_note_file.close + + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_signed.apk") + + end + + desc "Deploy new version to F-Droid" + lane :deployToFDroid do |options| + gradle(task: "clean") + + gradle( + task: "assemble", + build_type: "Release", + flavor: "fdroid", + print_command: false, + properties: { + "android.injected.signing.store.file" => ENV["SIGNING_KEYSTORE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], + "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], + } + ) + + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") + end after_all do |lane| diff --git a/fastlane/README.md b/fastlane/README.md index 0302bf6f..3b2609ba 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -26,6 +26,11 @@ Run all the tests fastlane android deploy ``` Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default) +### android deployToFDroid +``` +fastlane android deployToFDroid +``` +Deploy new version to F-Droid ---- diff --git a/fastlane/latest_versions/.gitignore b/fastlane/latest_versions/.gitignore new file mode 100644 index 00000000..5e7d2734 --- /dev/null +++ b/fastlane/latest_versions/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/fastlane/release/.gitignore b/fastlane/release/.gitignore new file mode 100644 index 00000000..5e7d2734 --- /dev/null +++ b/fastlane/release/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore From cd4fd204b969baa3bdd0e2f1207a6a157ad8e749 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 8 Feb 2021 15:29:51 +0100 Subject: [PATCH 16/38] Add deployment chapter to README.md [ci skip] --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 48aafde9..171f7bd0 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,41 @@ Please read our [contribution guide](.github/CONTRIBUTING.md), if you would like Help us keep Cryptomator open and inclusive. Please read and follow our [Code of Conduct](.github/CODE_OF_CONDUCT.md). +## Deployment + +Follow these steps to deploy a release: + +1. Check `TODO`/`FIXME` comments + - Create issue for or delete + - Regexp for "Find in Path": `\W(TODO|FIXME)(?! #[0-9]{1,4}:)` +1. Merge translations +1. Check latest dependencies +1. Create release branch +1. Test database migration +1. Smoke-Test changed or added functionality +1. Update version +1. Create and commit release notes +1. Merge in `master` +1. Create tag and execute deploy app using Fastlane +1. Close GitHub-issues or move them to next milestone +1. Close milestone + +### Release Notes + +Before tagging the release, create and commit the release notes. For Playstore create [fastlane/metadata/android/de-DE/changelogs/default.txt](https://github.com/cryptomator/android/blob/develop/fastlane/metadata/android/de-DE/changelogs/default.txt), [fastlane/metadata/android/en-US/changelogs/default.txt](https://github.com/cryptomator/android/blob/develop/fastlane/metadata/android/en-US/changelogs/default.txt) and for the website create [fastlane/release_notes_apkstore_en.html](https://github.com/cryptomator/android/blob/develop/fastlane/release_notes_apkstore_en.html). + +### Deploy app using Fastlane + +Deploy production version to Google Play, Website/GitHub-Releases and F-Droid using `fastlane android deploy` or `bundle exec fastlane deploy` + +There are further targets and options like `beta`, see [fastlane/README.md](https://github.com/cryptomator/android/blob/develop/fastlane/README.md) + +### Initial setup Fastlane + +1. Make sure you copied `.default.env` to `.env` in the `fastlane` folder and filled out those variables. +1. Install Ruby (depends on OS, Ubuntu): `sudo apt install ruby-dev` +1. Install fastlane (depends on OS, Ubuntu): `gem install fastlane -N` + ## License This project is dual-licensed under the GPLv3 for FOSS projects as well as a commercial license for independent software vendors and resellers. If you want to modify this application under different conditions, feel free to contact our support team. From df3664d0319c4c4828db58f1a84928d2de1863ae Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Mon, 8 Feb 2021 16:25:16 +0100 Subject: [PATCH 17/38] updated full description --- .../android/de-DE/full_description.txt | 34 +++++++++---------- .../android/en-US/full_description.txt | 18 +++++----- .../android/fr-FR/full_description.txt | 10 +++--- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index bebbf920..11885796 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -1,39 +1,39 @@ -Cryptomator macht Cloud-Speicher vertrauenswürdig. Die App verschlüsselt Dateien auf Ihrem Smartphone, bevor diese in die Cloud gelangen. Selbst im Falle eines unberechtigten Zugriffs auf Ihre Cloud (z.B. Hacker-Angriffe), sind Ihre Dateien durch die Verschlüsselung trotzdem sicher geschützt. +Mit Cryptomator liegt der Schlüssel zu deinen Daten bei dir. Durch Cryptomator ver­schlüsselst du deine Daten schnell und unkompliziert. Anschließend lädst du sie geschützt in deinen Lieblingscloudservice hoch. -

EINFACHHEIT

+EINFACH -Bei der Entwicklung von Cryptomator steht die Benutzerfreundlichkeit im Fokus. +Cryptomator ist ein einfaches Tool zur digitalen Selbstverteidigung. Es ermöglicht dir, deine Cloud-Daten eigenständig und unabhängig zu schützen. -• Erstellen Sie einen Tresor und vergeben Sie ein Passwort +• Erstelle einen Tresor und vergib ein Passwort • Keine komplizierte Konfiguration und keine weiteren Accounts notwendig -• Entsperren Sie Tresore mit Ihrem Fingerabdruck* +• Entsperr Tresore mit deinem Fingerabdruck* * ab Android 6.0 and Smartphones mit Fingerabdruck-Sensor -

KOMPATIBILITÄT

+KOMPATIBEL -Cryptomator ist kompatibel mit den meistgenutzten Cloud-Speichern und verfügbar für alle gängigen Betriebssysteme. +Cryptomator ist kompatibel mit den meistgenutzten Cloudspeichern und verfügbar für alle gängigen Betriebssysteme. • Kompatibel mit Dropbox, Google Drive, OneDrive und WebDAV-basierten Cloudspeicher-Diensten -• Erstellen Sie auch Tresore in Androids lokalem Speicher (funktioniert bspw. zusammen mit Sync-Apps von Drittanbietern) -• Greifen Sie auf Ihre Tresore von allen Ihren mobilen Endgeräten und Computern zu +• Erstelle auch Tresore in Androids lokalem Speicher (funktioniert bspw. zusammen mit Sync-Apps von Drittanbietern) +• Greife auf deine Tresore von allen deinen mobilen Endgeräten und Computern zu -

SICHERHEIT

+SICHER -Cryptomator für Android basiert auf dem bewährten Open-Source-Fundament Cryptomator für Desktop. +Du musst Cryptomator nicht blind vertrauen, denn die App ist quelloffen, was für dich als Nutzer bedeutet, dass jeder den Code einsehen kann. • Verschlüsselung der Dateiinhalte und Dateinamen mit AES und 256-Bit-Schlüssellänge • Erhöhte Brute-Force-Resistenz des Tresor-Passworts durch Einsatz von scrypt • Tresore werden automatisch gesperrt, wenn die App in den Hintergrund geschickt wird -• Verschlüsselungsimplementierung basiert auf der Open-Source-Bibliothek CryptoLib und ist öffentlich dokumentiert +• Verschlüsselungsimplementierung ist öffentlich dokumentiert -

SENSATIONELLE VERSCHLÜSSELUNGSTECHNOLOGIEIMPLEMENTIERUNG

+PREISGEKRÖNT Cryptomator wurde mit dem CeBIT Innovation Award 2016 for Usable Security and Privacy ausgezeichnet. Wir freuen uns, hunderttausenden Cryptomator-Nutzern Sicherheit und Privatsphärenschutz bieten zu können. -

CRYPTOMATOR COMMUNITY

+CRYPTOMATOR COMMUNITY -Treten Sie der Cryptomator Community bei und tauschen Sie sich mit Cryptomator-Nutzern aus: https://community.cryptomator.org +Tritt der Cryptomator Community bei und tausche dich mit Cryptomator-Nutzern aus: https://community.cryptomator.org -• Folgen Sie uns auf Twitter @Cryptomator -• Liken Sie uns auf Facebook /Cryptomator \ No newline at end of file +• Folge uns auf Twitter @Cryptomator +• Like uns auf Facebook /Cryptomator \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index eef1cf2d..f1841971 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,8 +1,8 @@ -Cryptomator makes your cloud storage trustworthy. The app encrypts files on your mobile device before they are uploaded to your cloud. Even if a third party gained unauthorized access to your files (e.g., hacker attack), your files are secure from prying eyes. +With Cryptomator, the key to your data is in your hands. Cryptomator encrypts your data quickly and easily. Afterwards you upload them protected to your favorite cloud service. -

SIMPLICITY

+EASY-TO-USE -Cryptomator has been developed with a strong focus on user-friendliness. +Cryptomator is a simple tool for digital self-defense. It allows you to protect your cloud data by yourself and independently. • Simply create a vault and assign a password • No additional account or configuration needed @@ -10,7 +10,7 @@ Cryptomator has been developed with a strong focus on user-friendliness. * from Android 6.0 and smartphones with fingerprint sensor -

COMPATIBILITY

+COMPATIBLE Cryptomator is compatible with the most commonly used cloud storages and available for all major operating systems. @@ -18,20 +18,20 @@ Cryptomator is compatible with the most commonly used cloud storages and availab • Create vaults in Android’s local storage (e.g., works with third-party sync apps) • Access your vaults on all your mobile devices and computers -

SECURITY

+SECURE -Cryptomator for Android is based on the solid open-source foundation of Cryptomator for Desktop. +You don't have to trust Cryptomator blindly, because it is open source software. For you as a user, this means that everyone can see the code. • File content and filename encryption with AES and 256 bit key length • Vault password is secured with scrypt for enhanced brute-force resistance • Vaults are automatically locked after sending app to background -• Crypto implementation is based on the open-source library CryptoLib and is publicly documented +• Crypto implementation is publicly documented -

GENERAL AWESOMENESS

+AWARD-WINNING Cryptomator received the CeBIT Innovation Award 2016 for Usable Security and Privacy. We're proud to provide security and privacy for hundreds of thousands of Cryptomator users. -

CRYPTOMATOR COMMUNITY

+CRYPTOMATOR COMMUNITY Join the Cryptomator Community and participate in the conversations with other Cryptomator users. diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 3da0e77f..4bfd34cb 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -1,6 +1,6 @@ Cryptomator rend votre stockage dans le cloud beaucoup plus sûr. L'application chiffre les fichiers sur votre appareil mobile avant qu'ils ne soient envoyés dans votre cloud. Même si une tierce partie obtient un accès non autorisé à vos fichiers (par exemple, une attaque de pirates informatiques), vos fichiers sont à l'abri des regards indiscrets. -

SIMPLICITÉ

+SIMPLICITÉ Cryptomator a été développé en mettant l'accent sur la convivialité. @@ -10,7 +10,7 @@ Cryptomator a été développé en mettant l'accent sur la convivialité. * à partir d'Android 6.0 et sur smartphones avec capteur biométrique d'empreintes digitales -

COMPATIBILITÉ

+COMPATIBILITÉ Cryptomator est compatible avec les systèmes de stockage dans le cloud les plus couramment utilisés et disponible pour tous les principaux systèmes d'exploitation. @@ -18,7 +18,7 @@ Cryptomator est compatible avec les systèmes de stockage dans le cloud les plus • Créer des coffres-forts dans le stockage local d'Android (par exemple, fonctionne avec des applications de synchronisation tierces) • Accédez à vos coffres-forts sur tous vos appareils mobiles et ordinateurs -

SÉCURITÉ

+SÉCURITÉ Cryptomator pour Android est basé sur le projet open-source de Cryptomator pour Ordinateur de bureau. @@ -27,11 +27,11 @@ Cryptomator pour Android est basé sur le projet open-source de Cryptomator pour • Les coffre-forts sont automatiquement verrouillées après la mise en arrière-plan de l'application • La mise en œuvre de Crypto est basée sur la bibliothèque open-source CryptoLib et est documentée publiquement -

UNE GÉNIALITUDE GÉNÉRAL

+UNE GÉNIALITUDE GÉNÉRAL Cryptomator a reçu le prix de l'innovation CeBIT 2016 pour la sécurité pratique et la confidentialité. Nous sommes fiers d'assurer la sécurité et la confidentialité des centaines de milliers d'utilisateurs du Cryptomator. -

LA COMMUNAUTÉ CRYPTOMATOR

+LA COMMUNAUTÉ CRYPTOMATOR Rejoignez la communauté de Cryptomator et participez aux conversations avec les autres utilisateurs de Cryptomator: https://community.cryptomator.org From f5114b09043bda6f9d845bf9c7f40051b98ab034 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 8 Feb 2021 17:15:37 +0100 Subject: [PATCH 18/38] Bump version to 1.5.12-SNAPSHOT --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dd1ed6d4..feadbf81 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.5.11' + androidVersionName = '1.5.12-SNAPSHOT' } repositories { mavenCentral() From 9b4a9a2ae2d75a76d5bf1cb238300f3dca391344 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 8 Feb 2021 20:57:03 +0100 Subject: [PATCH 19/38] Remove string resource cycles --- presentation/src/main/res/values-de/strings.xml | 6 +++--- presentation/src/main/res/values/strings.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/presentation/src/main/res/values-de/strings.xml b/presentation/src/main/res/values-de/strings.xml index 6af46287..ffeaba07 100644 --- a/presentation/src/main/res/values-de/strings.xml +++ b/presentation/src/main/res/values-de/strings.xml @@ -99,7 +99,7 @@ Speicherort Speichern Dateien verschlüsselt - text.txt + @string/dialog_file_name_placeholder Cloud-Dienst Neuen Tresor anlegen @@ -219,7 +219,7 @@ Möchten Sie wirklich beenden, ohne zu speichern? Verwerfen @string/dialog_button_cancel - @string/screen_share_files_new_text_file + text.txt Sind Sie sicher, dass sie den Tresor entfernen wollen? Dieser Vorgang wird den Tresor nur aus dieser Liste entfernen und nicht tatsächlich löschen. Lade hoch… @@ -341,7 +341,7 @@ Intervall der Aktualisierungsprüfung Nach Aktualisierungen suchen Letzte Ausführung %1$s - Noch nie + @string/lock_timeout_never Noch nie ~ Wenn aus technischen Gründen keine Update-Prüfung durchgeführt werden kann, können Updates manuell über die Website https://cryptomator.org/android/ heruntergeladen und installiert werden. Zwischenspeichergröße pro Cloud diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index fa95a7bd..dcc26ed5 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -509,7 +509,7 @@ Update check interval Check for updates Last run %1$s - Never + @string/lock_timeout_never Never ~ If an update check cannot be performed for technical reasons, updates can be downloaded and installed manually from the website https://cryptomator.org/android/. Cache size per Cloud @@ -520,7 +520,7 @@ 2 minutes 5 minutes 10 minutes - @string/screen_settings_last_check_updates_never + Never 50 MB @@ -540,6 +540,6 @@ Once a day Once a week Once a month - @string/screen_settings_last_check_updates_never + @string/lock_timeout_never From d72b39c1b07ca50c5b14603cfea1976999ec6432 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 9 Feb 2021 14:33:52 +0100 Subject: [PATCH 20/38] Add note to update the version on the website during deployment [ci skip] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 171f7bd0..303c40e3 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ Follow these steps to deploy a release: 1. Create tag and execute deploy app using Fastlane 1. Close GitHub-issues or move them to next milestone 1. Close milestone +1. Update version on website ([cryptomator.org/android](https://cryptomator.org/android/)) ### Release Notes From 8d7700331a71b4378004039486958709338ece95 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 12:34:55 +0100 Subject: [PATCH 21/38] Switch from SFTP to s3 in Fastlane for publishing release to server [ci skip] --- Gemfile.lock | 18 ++++- fastlane/.default.env | 8 +- fastlane/Fastfile | 79 ++++++++++--------- fastlane/Pluginfile | 1 + fastlane/README.md | 12 ++- ...es_apkstore_en.html => release-notes.html} | 0 6 files changed, 71 insertions(+), 47 deletions(-) rename fastlane/{release_notes_apkstore_en.html => release-notes.html} (100%) diff --git a/Gemfile.lock b/Gemfile.lock index 97697954..0e25b8aa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,10 +4,12 @@ GEM CFPropertyList (3.0.3) addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) + apktools (0.7.4) + rubyzip (~> 2.0) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.1.0) - aws-partitions (1.424.0) + aws-partitions (1.426.0) aws-sdk-core (3.112.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) @@ -50,7 +52,7 @@ GEM faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.2) - fastlane (2.173.0) + fastlane (2.174.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.3, < 3.0.0) artifactory (~> 3.0) @@ -87,6 +89,10 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-aws_s3 (1.8.0) + apktools (~> 0.7) + aws-sdk-s3 (~> 1) + mime-types (~> 3.3) fastlane-plugin-get_version_name (0.2.2) gh_inspector (1.1.3) google-api-client (0.38.0) @@ -109,7 +115,7 @@ GEM webrick google-apis-iamcredentials_v1 (0.1.0) google-apis-core (~> 0.1) - google-apis-storage_v1 (0.1.0) + google-apis-storage_v1 (0.2.0) google-apis-core (~> 0.1) google-cloud-core (1.5.0) google-cloud-env (~> 1.0) @@ -125,7 +131,7 @@ GEM google-cloud-core (~> 1.2) googleauth (~> 0.9) mini_mime (~> 1.0) - googleauth (0.15.0) + googleauth (0.15.1) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -140,6 +146,9 @@ GEM json (2.5.1) jwt (2.2.2) memoist (0.16.2) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2020.1104) mini_magick (4.11.0) mini_mime (1.0.2) multi_json (1.15.0) @@ -204,6 +213,7 @@ DEPENDENCIES bcrypt_pbkdf ed25519 fastlane + fastlane-plugin-aws_s3 fastlane-plugin-get_version_name net-sftp diff --git a/fastlane/.default.env b/fastlane/.default.env index fe1d804a..228ca9a5 100644 --- a/fastlane/.default.env +++ b/fastlane/.default.env @@ -12,8 +12,10 @@ SIGNING_UPDATE_APK_STORE_KEY_PATH= SIGNING_UPDATE_APK_STORE_PUB_KEY_PATH= APK_STORE_BASIC_URL= -FTP_SERVER_USERNAME= -FTP_SERVER_KEY_FILE= -FTP_SERVER_PORT= +S3_BUCKET= +S3_ENDPOINT= +S3_REGION= +S3_ACCESS_KEY= +S3_SECRET_ACCESS_KEY= SLACK_URL= diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 2c2ec138..348e5fa2 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -20,14 +20,14 @@ platform :android do |options| gradle(task: "test") end - desc "Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default)" + desc "Deploy new version to Google Play and APK Store options: beta:false (default)" lane :deploy do |options| release_note_path_en = "metadata/android/en-US/changelogs/default.txt" # use english-change-log for french language too FileUtils.cp(release_note_path_en, "metadata/android/fr-FR/changelogs/default.txt") - deployToPlaystore(scheduled:options[:scheduled], beta:options[:beta]) + deployToPlaystore(beta:options[:beta]) if options[:beta] puts "Skipping deployment to server cause there isn't currently a beta channel" @@ -40,8 +40,8 @@ platform :android do |options| } ) else - deployToServer(scheduled:options[:scheduled], beta:options[:beta]) - deployToFDroid(scheduled:options[:scheduled], beta:options[:beta]) + deployToServer(beta:options[:beta]) + deployToFDroid(beta:options[:beta]) slack( default_payloads: [], # reduce the notification to the minimum @@ -55,7 +55,7 @@ platform :android do |options| end desc "Deploy new version to Play Store" - private_lane :deployToPlaystore do |options| + lane :deployToPlaystore do |options| deploy_target = "production" if options[:beta] @@ -96,7 +96,7 @@ platform :android do |options| end desc "Deploy new version to server" - private_lane :deployToServer do |options| + lane :deployToServer do |options| gradle(task: "clean") gradle( @@ -112,13 +112,12 @@ platform :android do |options| } ) + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}.apk") + server_host = ENV["APK_STORE_BASIC_URL"] - server_relative_folder = "/mnt/data/android/" base_url = "https://#{server_host}/android/" apk_url = "#{base_url}#{version}/Cryptomator-#{version}.apk" - relative_apk_url = "#{server_relative_folder}#{version}/Cryptomator-#{version}.apk" release_note_url = "#{base_url}#{version}/release-notes.html" - relative_release_note_url = "#{server_relative_folder}#{version}/release-notes.html" claims = { "version": version, @@ -129,44 +128,47 @@ platform :android do |options| private_key = OpenSSL::PKey.read(File.read(ENV["SIGNING_UPDATE_APK_STORE_KEY_PATH"])) token = JWT.encode claims, private_key, "ES256" - latest_version_filename = "latest-version.json" - if options[:scheduled] - latest_version_filename = "latest-version-#{version}.json" - puts "Scheduled upload activated, uploading latest-version.json to #{latest_version_filename} with claims #{claims}" - else - puts "#{latest_version_filename} has claims #{claims}" - end + latest_version_filename = "latest-version-#{version}.json" latest_version_jsn = File.new("latest_versions/#{latest_version_filename}","w") latest_version_jsn.write(token) latest_version_jsn.close - latest_version_jsn = File.open("latest_versions/#{latest_version_filename}","r") - release_note_path = "release_notes_apkstore_en.html" - release_note_file = File.open(release_note_path,"r") + puts "Uploading APK and release note" - puts latest_version_filename + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android/#{version}", + files: [ + "fastlane/release/Cryptomator-#{version}.apk", + "fastlane/release-notes.html" + ], + skip_html_upload: true, + apk: '' + ) - Net::SFTP.start( - ENV["FTP_SERVER_URL"], - ENV["FTP_SERVER_USERNAME"], - :keys=>[ENV["FTP_SERVER_KEY_FILE"]], - keys_only: true, - verify_host_key: :never, - :port=>ENV["FTP_SERVER_PORT"] - ) do |sftp| - puts "Uploading files to server..." - sftp.mkdir! "#{server_relative_folder}#{version}" - sftp.upload!(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], relative_apk_url) - sftp.upload!(release_note_file, relative_release_note_url) - sftp.upload!(latest_version_jsn, "#{server_relative_folder}#{latest_version_filename}") - end + puts "Uploading #{latest_version_filename} with claims #{claims}" + puts "Rename #{latest_version_filename} to latest-version.json for deployment" - latest_version_jsn.close - release_note_file.close - - FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_signed.apk") + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android", + files: [ + "fastlane/latest_versions/#{latest_version_filename}" + ], + skip_html_upload: true, + apk: '' + ) + FileUtils.mv("release/Cryptomator-#{version}.apk", "release/Cryptomator-#{version}_signed.apk") end desc "Deploy new version to F-Droid" @@ -187,7 +189,6 @@ platform :android do |options| ) FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") - end after_all do |lane| diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index 45823f1d..9b434483 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -3,3 +3,4 @@ # Ensure this file is checked in to source control! gem 'fastlane-plugin-get_version_name' +gem 'fastlane-plugin-aws_s3' diff --git a/fastlane/README.md b/fastlane/README.md index 3b2609ba..eee28971 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -25,7 +25,17 @@ Run all the tests ``` fastlane android deploy ``` -Deploy new version to Google Play and APK Store options: beta:false scheduled:false (default) +Deploy new version to Google Play and APK Store options: beta:false (default) +### android deployToPlaystore +``` +fastlane android deployToPlaystore +``` +Deploy new version to Play Store +### android deployToServer +``` +fastlane android deployToServer +``` +Deploy new version to server ### android deployToFDroid ``` fastlane android deployToFDroid diff --git a/fastlane/release_notes_apkstore_en.html b/fastlane/release-notes.html similarity index 100% rename from fastlane/release_notes_apkstore_en.html rename to fastlane/release-notes.html From cfd204faeaf0bf6f12363bb4206e4d2b2bc55df2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 12:44:06 +0100 Subject: [PATCH 22/38] Update dependencies --- buildsystem/dependencies.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index c993458e..698c33bf 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -27,7 +27,7 @@ ext { rxAndroidVersion = '2.1.1' rxBindingVersion = '2.2.0' - daggerVersion = '2.31.2' + daggerVersion = '2.32' gsonVersion = '2.8.6' @@ -38,7 +38,7 @@ ext { timberVersion = '4.7.1' - zxcvbnVersion = '1.3.5' + zxcvbnVersion = '1.3.6' scaleImageViewVersion = '3.10.0' @@ -58,7 +58,7 @@ ext { googlePlayServicesVersion = '19.0.0' googleClientVersion = '1.31.2' - msgraphVersion = '2.6.0' + msgraphVersion = '2.7.0' msaAuthVersion = '0.10.0' commonsCodecVersion = '1.15' @@ -67,7 +67,7 @@ ext { // testing dependencies - jUnitVersion = '5.7.0' + jUnitVersion = '5.7.1' jUnit4Version = '4.13.1' assertJVersion = '1.7.1' mockitoVersion = '3.7.7' From 8dc310bcee595758f17f7d900a77e16ecdffb2d7 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 15:15:08 +0100 Subject: [PATCH 23/38] Remove version handling in some methods due to min version increase --- .../LocalStorageContentRepositoryFactory.java | 3 +-- .../presentation/model/CloudTypeModel.kt | 27 +++++-------------- .../presenter/BrowseFilesPresenter.kt | 15 ++--------- .../presenter/CloudConnectionListPresenter.kt | 2 +- .../ui/activity/ImagePreviewActivity.kt | 10 ++----- .../ui/fragment/SettingsFragment.kt | 6 +---- .../src/main/res/values-de/strings.xml | 1 - .../src/main/res/values-fr/strings.xml | 1 - .../src/main/res/values-tr/strings.xml | 1 - presentation/src/main/res/values/strings.xml | 1 - 10 files changed, 13 insertions(+), 54 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageContentRepositoryFactory.java b/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageContentRepositoryFactory.java index 1a7427a6..c3ea26b0 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageContentRepositoryFactory.java +++ b/data/src/main/java/org/cryptomator/data/cloud/local/LocalStorageContentRepositoryFactory.java @@ -1,7 +1,6 @@ package org.cryptomator.data.cloud.local; import android.content.Context; -import android.os.Build; import org.cryptomator.data.cloud.local.file.LocalStorageContentRepository; import org.cryptomator.data.cloud.local.storageaccessframework.LocalStorageAccessFrameworkContentRepository; @@ -43,7 +42,7 @@ public class LocalStorageContentRepositoryFactory implements CloudContentReposit if (!hasPermissions(WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE)) { throw new NoAuthenticationProvidedException(cloud); } - if (((LocalStorageCloud) cloud).rootUri() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (((LocalStorageCloud) cloud).rootUri() != null) { return new LocalStorageAccessFrameworkContentRepository(context, mimeTypes, (LocalStorageCloud) cloud); } else { return new LocalStorageContentRepository(context, (LocalStorageCloud) cloud); diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt index a9c3dfcf..74f9d2b6 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt @@ -1,6 +1,5 @@ package org.cryptomator.presentation.model -import android.os.Build import org.cryptomator.domain.CloudType import org.cryptomator.presentation.R @@ -22,14 +21,13 @@ enum class CloudTypeModel(builder: Builder) { .withMultiInstances()), // LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) // .withCloudImageResource(R.drawable.storage_type_local) // - .withCloudImageLargeResource(R.drawable.storage_type_local_large) // - .withMultiInstancesIfLollipopOrLater()); + .withCloudImageLargeResource(R.drawable.storage_type_local_large)); - val cloudName: String - val displayNameResource: Int - val cloudImageResource: Int - val cloudImageLargeResource: Int - val isMultiInstance: Boolean + val cloudName: String = builder.cloudName + val displayNameResource: Int = builder.displayNameResource + val cloudImageResource: Int = builder.cloudImageResource + val cloudImageLargeResource: Int = builder.cloudImageLargeResource + val isMultiInstance: Boolean = builder.multiInstances private class Builder(val cloudName: String, val displayNameResource: Int) { var cloudImageResource = 0 @@ -50,11 +48,6 @@ enum class CloudTypeModel(builder: Builder) { multiInstances = true return this } - - fun withMultiInstancesIfLollipopOrLater(): Builder { - multiInstances = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP - return this - } } companion object { @@ -66,12 +59,4 @@ enum class CloudTypeModel(builder: Builder) { return CloudType.valueOf(type.name) } } - - init { - cloudName = builder.cloudName - displayNameResource = builder.displayNameResource - cloudImageResource = builder.cloudImageResource - cloudImageLargeResource = builder.cloudImageLargeResource - isMultiInstance = builder.multiInstances - } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index c3f9f7fe..d053b17a 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -673,22 +673,11 @@ class BrowseFilesPresenter @Inject constructor( // } fun onExportFileClicked(cloudFile: CloudFileModel, trigger: ExportOperation) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - exportFileToDownloadDirectory(cloudFile, trigger) - } else { - exportFileToUserSelectedLocation(cloudFile, trigger) - } + exportFileToUserSelectedLocation(cloudFile, trigger) } fun onExportNodesClicked(selectedCloudFiles: ArrayList>, trigger: ExportOperation) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - exportNodesToUserSelectedLocation(selectedCloudFiles, trigger) - } - } - - private fun exportFileToDownloadDirectory(fileToExport: CloudFileModel, exportOperation: ExportOperation) { - requestPermissions(PermissionsResultCallbacks.exportFileToDownloadDirectory(fileToExport, exportOperation), // - R.string.permission_message_export_file, Manifest.permission.WRITE_EXTERNAL_STORAGE) + exportNodesToUserSelectedLocation(selectedCloudFiles, trigger) } @Callback diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt index e4e565ac..b4a11094 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -103,7 +103,7 @@ class CloudConnectionListPresenter @Inject constructor( // } private fun releaseUriPermissionForLocalStorageCloud(cloudModel: LocalStorageModel) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && (cloudModel.toCloud() as LocalStorageCloud).rootUri() != null) { + if ((cloudModel.toCloud() as LocalStorageCloud).rootUri() != null) { releaseUriPermission(cloudModel.uri()) } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt index 4b4f7d59..5d70f3b1 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/ImagePreviewActivity.kt @@ -1,7 +1,6 @@ package org.cryptomator.presentation.ui.activity import android.net.Uri -import android.os.Build import android.view.View.* import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment @@ -91,9 +90,7 @@ class ImagePreviewActivity : BaseActivity(), ImagePreviewView, ConfirmDeleteClou } private fun setupStatusBar() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - window.statusBarColor = ContextCompat.getColor(this, R.color.colorBlack) - } + window.statusBarColor = ContextCompat.getColor(this, R.color.colorBlack) } private fun setupToolbar(index: Int) { @@ -131,10 +128,7 @@ class ImagePreviewActivity : BaseActivity(), ImagePreviewView, ConfirmDeleteClou var newUiOptions = window.decorView.systemUiVisibility newUiOptions = newUiOptions or SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION newUiOptions = newUiOptions xor SYSTEM_UI_FLAG_FULLSCREEN - - if (Build.VERSION.SDK_INT >= 19) { - newUiOptions = newUiOptions xor SYSTEM_UI_FLAG_IMMERSIVE_STICKY - } + newUiOptions = newUiOptions xor SYSTEM_UI_FLAG_IMMERSIVE_STICKY window.decorView.systemUiVisibility = newUiOptions } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt index f27a3af0..5c912189 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt @@ -179,11 +179,7 @@ class SettingsFragment : PreferenceFragmentCompat() { val strDate: String = dateFormatUser.format(lastUpdateCheck) format(getString(R.string.screen_settings_last_check_updates), strDate) } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - getString(R.string.screen_settings_last_check_updates_never) - } else { - getString(R.string.screen_settings_last_check_updates_never_pre_marshmallow) - } + getString(R.string.screen_settings_last_check_updates_never) } val date = SpannableString(readableDate) diff --git a/presentation/src/main/res/values-de/strings.xml b/presentation/src/main/res/values-de/strings.xml index ffeaba07..227eca18 100644 --- a/presentation/src/main/res/values-de/strings.xml +++ b/presentation/src/main/res/values-de/strings.xml @@ -342,7 +342,6 @@ Nach Aktualisierungen suchen Letzte Ausführung %1$s @string/lock_timeout_never - Noch nie ~ Wenn aus technischen Gründen keine Update-Prüfung durchgeführt werden kann, können Updates manuell über die Website https://cryptomator.org/android/ heruntergeladen und installiert werden. Zwischenspeichergröße pro Cloud Sofort diff --git a/presentation/src/main/res/values-fr/strings.xml b/presentation/src/main/res/values-fr/strings.xml index ccdf0340..312cd807 100644 --- a/presentation/src/main/res/values-fr/strings.xml +++ b/presentation/src/main/res/values-fr/strings.xml @@ -350,7 +350,6 @@ Vérifier les mises à jour Dernière exécution %1$s @string/lock_timeout_never - Jamais ~ Si la vérification de mise à jour ne peut être effectué pour des raisons techniques, les mises à jour peuvent être téléchargées et installées manuellement à partir du site https://cryptomator.org/android/. Taille du cache par cloud Instantané diff --git a/presentation/src/main/res/values-tr/strings.xml b/presentation/src/main/res/values-tr/strings.xml index c74cf321..43ceaef7 100644 --- a/presentation/src/main/res/values-tr/strings.xml +++ b/presentation/src/main/res/values-tr/strings.xml @@ -342,7 +342,6 @@ Güncellemeleri kontrol et Son çalıştırma %1$s @string/lock_timeout_never - Teknik nedenlerle güncelleme kontrolü yapılamıyorsa, güncellemeler, https://cryptomator.org/android/ web sitesinden manuel olarak indirilebilir ve yüklenebilir. Bulut başına önbellek boyutu Anında diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index dcc26ed5..240d713f 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -510,7 +510,6 @@ Check for updates Last run %1$s @string/lock_timeout_never - Never ~ If an update check cannot be performed for technical reasons, updates can be downloaded and installed manually from the website https://cryptomator.org/android/. Cache size per Cloud From 22c53f5abe3bae4245fec9e94c59722880d5187d Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 19:15:44 +0100 Subject: [PATCH 24/38] #168 start position indices by 0 and test position helper --- .../org/cryptomator/data/db/Upgrade3To4.kt | 2 +- .../domain/usecases/vault/CreateVault.java | 2 +- .../domain/usecases/vault/MoveVaultHelper.kt | 9 +- .../usecases/vault/MoveVaultHelperTest.kt | 100 ++++++++++++++++++ .../workflow/AddExistingVaultWorkflow.java | 2 +- 5 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt diff --git a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt index a6e67481..8be61f62 100644 --- a/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt +++ b/data/src/main/java/org/cryptomator/data/db/Upgrade3To4.kt @@ -59,7 +59,7 @@ internal class Upgrade3To4 @Inject constructor() : DatabaseUpgrade(3, 4) { .map { Sql.update("VAULT_ENTITY") // .where("_id", Sql.eq(it.id)) // - .set("POSITION", Sql.toInteger(it.id)) // + .set("POSITION", Sql.toInteger(it.id - 1)) // .executeOn(db) } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java b/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java index ee61b6a9..6df1bcde 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/CreateVault.java @@ -38,7 +38,7 @@ class CreateVault { return vaultRepository.store(aVault() // .thatIsNew() // .withNamePathAndCloudFrom(vaultFolder) // - .withPosition(vaultRepository.vaults().size() + 1) // + .withPosition(vaultRepository.vaults().size()) // .build()); } } diff --git a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt index 40985b64..e42c5bbf 100644 --- a/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt +++ b/domain/src/main/java/org/cryptomator/domain/usecases/vault/MoveVaultHelper.kt @@ -21,17 +21,12 @@ class MoveVaultHelper { Collections.swap(vaults, i, i - 1) } } - - for (i in 0 until vaults.size) { - vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i + 1).build() - } - - return vaults + return reorderVaults(vaults) } private fun reorderVaults(vaults: MutableList) : List { for (i in 0 until vaults.size) { - vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i + 1).build() + vaults[i] = Vault.aCopyOf(vaults[i]).withPosition(i).build() } return vaults; } diff --git a/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt new file mode 100644 index 00000000..0a9fb96c --- /dev/null +++ b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt @@ -0,0 +1,100 @@ +package org.cryptomator.domain.usecases.vault + +import org.cryptomator.domain.CloudType +import org.cryptomator.domain.Vault +import org.cryptomator.domain.repository.VaultRepository +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito + + +class MoveVaultHelperTest { + + private lateinit var orderedVaults: ArrayList + private lateinit var unorderedVaults: ArrayList + + private lateinit var vaultRepository: VaultRepository + private lateinit var cloudType: CloudType + + @Test + fun reorderVaults() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(unorderedVaults) + assertEquals(orderedVaults, MoveVaultHelper.Companion.reorderVaults(vaultRepository), "Failed to reorderVaults") + } + + @Test + fun movePositionUp() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) + + val resultList = ArrayList() + resultList.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(0).build()) + resultList.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(1).build()) + resultList.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(2).build()) + resultList.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + + assertEquals(resultList, MoveVaultHelper.Companion.updateVaultPosition(0, 2, vaultRepository), "Failed to movePositionUp") + } + + @Test + fun movePositionDown() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) + + val resultList2 = ArrayList() + resultList2.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(0).build()) + resultList2.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(1).build()) + resultList2.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(2).build()) + resultList2.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + + assertEquals(resultList2, MoveVaultHelper.Companion.updateVaultPosition(2, 0, vaultRepository), "Failed to movePositionDown") + } + + @Test + fun movePositionToSelf() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) + + val resultList2 = ArrayList() + resultList2.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(0).build()) + resultList2.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(1).build()) + resultList2.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(2).build()) + resultList2.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + + assertEquals(resultList2, MoveVaultHelper.Companion.updateVaultPosition(1, 1, vaultRepository), "Failed to movePositionToSelf") + } + + @Test + fun movePositionOutOfBounds() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) + Assertions.assertThrows(IndexOutOfBoundsException::class.java) { MoveVaultHelper.Companion.updateVaultPosition(1, 4, vaultRepository) } + } + + @Test + fun verifyStoreInVaultRepo() { + Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) + val result = MoveVaultHelper.Companion.updateVaultsInDatabase(orderedVaults, vaultRepository) + assertEquals(orderedVaults, result, "Failed to verifyStoreInVaultRepo") + + orderedVaults.forEach { + Mockito.verify(vaultRepository).store(Mockito.eq(it)) + } + } + + @BeforeEach + fun setup() { + vaultRepository = Mockito.mock(VaultRepository::class.java) + cloudType = Mockito.mock(CloudType::class.java) + + unorderedVaults = ArrayList() + unorderedVaults.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(1).build()) + unorderedVaults.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(10).build()) + unorderedVaults.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(5).build()) + unorderedVaults.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(15).build()) + + orderedVaults = ArrayList() + orderedVaults.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(0).build()) + orderedVaults.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(1).build()) + orderedVaults.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(2).build()) + orderedVaults.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + } +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java index 937e07ae..a0bb9fe5 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java +++ b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java @@ -128,7 +128,7 @@ public class AddExistingVaultWorkflow extends Workflow() { From 6f7caf902877169043462f67206ed3b3945c9c9f Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 19:32:33 +0100 Subject: [PATCH 25/38] Fix test which fails only using gradlew -.- --- .../cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt index 0a9fb96c..fe5630f0 100644 --- a/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt +++ b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt @@ -83,7 +83,7 @@ class MoveVaultHelperTest { @BeforeEach fun setup() { vaultRepository = Mockito.mock(VaultRepository::class.java) - cloudType = Mockito.mock(CloudType::class.java) + cloudType = CloudType.LOCAL unorderedVaults = ArrayList() unorderedVaults.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(1).build()) From 93ae29e1a2dac787442c8af47c120b686319014f Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Wed, 10 Feb 2021 19:39:46 +0100 Subject: [PATCH 26/38] Final clean-up [ci skip] --- .../java/org/cryptomator/domain/Vault.java | 2 +- .../usecases/vault/MoveVaultHelperTest.kt | 24 +++++++++---------- .../workflow/AddExistingVaultWorkflow.java | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/domain/src/main/java/org/cryptomator/domain/Vault.java b/domain/src/main/java/org/cryptomator/domain/Vault.java index 1290f40b..7a1be5e2 100644 --- a/domain/src/main/java/org/cryptomator/domain/Vault.java +++ b/domain/src/main/java/org/cryptomator/domain/Vault.java @@ -19,7 +19,7 @@ public class Vault implements Serializable { .withPath(vault.getPath()) // .withUnlocked(vault.isUnlocked()) // .withSavedPassword(vault.getPassword()) // - .withVersion(vault.getVersion()) + .withVersion(vault.getVersion()) // .withPosition(vault.getPosition()); } diff --git a/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt index fe5630f0..36fd6a4a 100644 --- a/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt +++ b/domain/src/test/java/org/cryptomator/domain/usecases/vault/MoveVaultHelperTest.kt @@ -41,26 +41,26 @@ class MoveVaultHelperTest { fun movePositionDown() { Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) - val resultList2 = ArrayList() - resultList2.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(0).build()) - resultList2.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(1).build()) - resultList2.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(2).build()) - resultList2.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + val resultList = ArrayList() + resultList.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(0).build()) + resultList.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(1).build()) + resultList.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(2).build()) + resultList.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) - assertEquals(resultList2, MoveVaultHelper.Companion.updateVaultPosition(2, 0, vaultRepository), "Failed to movePositionDown") + assertEquals(resultList, MoveVaultHelper.Companion.updateVaultPosition(2, 0, vaultRepository), "Failed to movePositionDown") } @Test fun movePositionToSelf() { Mockito.`when`(vaultRepository.vaults()).thenReturn(orderedVaults) - val resultList2 = ArrayList() - resultList2.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(0).build()) - resultList2.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(1).build()) - resultList2.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(2).build()) - resultList2.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) + val resultList = ArrayList() + resultList.add(Vault.aVault().withId(24).withPath("").withCloudType(cloudType).withName("foo 1").withPosition(0).build()) + resultList.add(Vault.aVault().withId(2).withPath("").withCloudType(cloudType).withName("foo 5").withPosition(1).build()) + resultList.add(Vault.aVault().withId(3).withPath("").withCloudType(cloudType).withName("foo 10").withPosition(2).build()) + resultList.add(Vault.aVault().withId(4).withPath("").withCloudType(cloudType).withName("foo 15").withPosition(3).build()) - assertEquals(resultList2, MoveVaultHelper.Companion.updateVaultPosition(1, 1, vaultRepository), "Failed to movePositionToSelf") + assertEquals(resultList, MoveVaultHelper.Companion.updateVaultPosition(1, 1, vaultRepository), "Failed to movePositionToSelf") } @Test diff --git a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java index a0bb9fe5..6548e311 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java +++ b/presentation/src/main/java/org/cryptomator/presentation/workflow/AddExistingVaultWorkflow.java @@ -41,7 +41,7 @@ public class AddExistingVaultWorkflow extends Workflow Date: Thu, 11 Feb 2021 21:33:14 +0100 Subject: [PATCH 27/38] Add logging to Google Drive cloud --- .../googledrive/GoogleDriveClientFactory.java | 33 ++++++++++++++++++- .../cloud/googledrive/GoogleDriveImpl.java | 2 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.java b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.java index 02532be4..13c64b0a 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.java +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.java @@ -9,18 +9,49 @@ import com.google.api.services.drive.DriveScopes; import org.cryptomator.data.BuildConfig; import org.cryptomator.domain.exception.FatalBackendException; +import org.cryptomator.util.SharedPreferencesHandler; import java.util.Collections; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +import timber.log.Timber; class GoogleDriveClientFactory { private final Context context; + private final SharedPreferencesHandler sharedPreferencesHandler; - GoogleDriveClientFactory(Context context) { + GoogleDriveClientFactory(Context context, SharedPreferencesHandler sharedPreferencesHandler) { this.context = context; + this.sharedPreferencesHandler = sharedPreferencesHandler; } Drive getClient(String accountName) throws FatalBackendException { + if(sharedPreferencesHandler.debugMode()) { + Logger.getLogger("com.google.api.client").setLevel(Level.CONFIG); + Logger.getLogger("com.google.api.client").addHandler(new Handler() { + @Override + public void publish(LogRecord record) { + if(record.getMessage().startsWith("-------------- RESPONSE --------------") + || record.getMessage().startsWith("-------------- REQUEST --------------") + || record.getMessage().startsWith("{\n \"files\": [\n")) { + Timber.tag("GoogleDriveClient").d(record.getMessage()); + } + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + }); + } + try { FixedGoogleAccountCredential credential = FixedGoogleAccountCredential.usingOAuth2(context, Collections.singleton(DriveScopes.DRIVE)); credential.setAccountName(accountName); diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.java b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.java index 0ccebe23..0bb53f0f 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.java +++ b/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.java @@ -69,7 +69,7 @@ class GoogleDriveImpl { } private Drive client() { - return new GoogleDriveClientFactory(context) // + return new GoogleDriveClientFactory(context, sharedPreferencesHandler) // .getClient(googleDriveCloud.accessToken()); } From 8d6bc95073d67c9fe6a942f594c633d7b3851625 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 12 Feb 2021 18:38:57 +0100 Subject: [PATCH 28/38] #265 unlocking vaults after changing OneDrive password displays error This should be still enhanced by displaying the login screen but is already better than being stuck in a black screen. --- .../data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java | 2 +- .../presentation/presenter/AuthenticateCloudPresenter.kt | 4 +++- .../presentation/presenter/AuthenticateCloudPresenter.kt | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java index cc901de8..a9b1a723 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java +++ b/data/src/main/java/org/cryptomator/data/cloud/onedrive/graph/MSAAuthAndroidAdapter.java @@ -152,7 +152,7 @@ public abstract class MSAAuthAndroidAdapter implements IAuthenticationAdapter { public void onAuthComplete(final LiveStatus status, final LiveConnectSession session, final Object userState) { Timber.tag("MSAAuthAndroidAdapter").d(String.format("LiveStatus: %s, LiveConnectSession good?: %s, UserState %s", status, session != null, userState)); - if (status == LiveStatus.NOT_CONNECTED) { + if (status == LiveStatus.NOT_CONNECTED && session.getRefreshToken() == null) { Timber.tag("MSAAuthAndroidAdapter").d("Received invalid login failure from silent authentication, ignoring."); return; } diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index 1c76fb07..a8fee1c0 100644 --- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -112,7 +112,9 @@ class AuthenticateCloudPresenter @Inject constructor( // } private fun failAuthentication(cloudName: Int) { - view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName))) + activity().runOnUiThread { + view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName))) + } finish() } diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index 14bcac5a..35095a8f 100644 --- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -116,7 +116,9 @@ class AuthenticateCloudPresenter @Inject constructor( // } private fun failAuthentication(cloudName: Int) { - view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName))) + activity().runOnUiThread { + view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName))) + } finish() } From a42919911d14e9aee4cefcf944892acbcf5fea60 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 15 Feb 2021 12:19:25 +0100 Subject: [PATCH 29/38] Update dependencies --- buildsystem/dependencies.gradle | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 698c33bf..889e44f0 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -18,12 +18,11 @@ ext { // support lib androidSupportAnnotationsVersion = '1.1.0' androidSupportAppcompatVersion = '1.2.0' - // check https://stackoverflow.com/questions/41025200/android-view-inflateexception-error-inflating-class-android-webkit-webview/57968071#57968071 !!!!!! - androidSupportDesignVersion = '1.2.1' + androidSupportDesignVersion = '1.3.0' // app frameworks and utilities - rxJavaVersion = '2.2.20' + rxJavaVersion = '2.2.21' rxAndroidVersion = '2.1.1' rxBindingVersion = '2.2.0' @@ -58,7 +57,7 @@ ext { googlePlayServicesVersion = '19.0.0' googleClientVersion = '1.31.2' - msgraphVersion = '2.7.0' + msgraphVersion = '2.7.1' msaAuthVersion = '0.10.0' commonsCodecVersion = '1.15' @@ -82,7 +81,7 @@ ext { uiautomatorVersion = '2.2.0' androidxCoreVersion = '1.3.2' - androidxFragmentVersion = '1.2.5' + androidxFragmentVersion = '1.3.0' androidxViewpagerVersion = '1.0.0' androidxSwiperefreshVersion = '1.1.0' androidxPreferenceVersion = '1.0.0' // 1.1.0 and 1.1.2 does have a bug with the text size From 7dca46864d2e38faa992e9d9958211126aea7a13 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 15 Feb 2021 16:49:56 +0100 Subject: [PATCH 30/38] Register photo creation receiver for internal storage for auto upload --- .../presentation/service/PhotoContentJob.kt | 74 +++++++++---------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt b/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt index 68ee0e5a..66537386 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt @@ -7,12 +7,13 @@ import android.app.job.JobScheduler import android.app.job.JobService import android.content.ComponentName import android.content.Context -import android.database.Cursor +import android.database.MergeCursor import android.net.Uri import android.os.Build import android.os.Handler import android.provider.MediaStore import android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI +import android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI import androidx.annotation.RequiresApi import org.cryptomator.domain.exception.FatalBackendException import org.cryptomator.presentation.R @@ -21,72 +22,69 @@ import org.cryptomator.presentation.util.ResourceHelper import org.cryptomator.util.file.MimeTypeMap_Factory import org.cryptomator.util.file.MimeTypes import timber.log.Timber -import java.lang.String.format -import java.util.* @RequiresApi(api = Build.VERSION_CODES.N) class PhotoContentJob : JobService() { - private val mHandler = Handler() - private val mWorker: Runnable = Runnable { + private val handler = Handler() + private val worker: Runnable = Runnable { scheduleJob(applicationContext) - jobFinished(mRunningParams, false) + jobFinished(runningParams, false) } - private lateinit var mRunningParams: JobParameters + private lateinit var runningParams: JobParameters override fun onStartJob(params: JobParameters): Boolean { Timber.tag("PhotoContentJob").i("Job started!") val fileUtil = FileUtil(baseContext, MimeTypes(MimeTypeMap_Factory.newInstance())) - mRunningParams = params - if (params.triggeredContentAuthorities != null) { + runningParams = params + + params.triggeredContentAuthorities?.let { if (params.triggeredContentUris != null) { val ids = getIds(params) - if (ids != null && ids.size > 0) { + if (ids != null && ids.isNotEmpty()) { val selection = buildSelection(ids) - var cursor: Cursor? = null - try { - cursor = contentResolver.query(EXTERNAL_CONTENT_URI, PROJECTION, selection, null, null) - cursor?.let { - while (cursor.moveToNext()) { - val dir = cursor.getString(PROJECTION_DATA) - try { - fileUtil.addImageToAutoUploads(dir) - Timber.tag("PhotoContentJob").i("Added file to UploadList") - Timber.tag("PhotoContentJob").d(format("Added file to UploadList %s", dir)) - } catch (e: FatalBackendException) { - Timber.tag("PhotoContentJob").e(e, "Failed to add image to auto upload list") + contentResolver.query(EXTERNAL_CONTENT_URI, PROJECTION, selection, null, null).use { externalCursor -> + contentResolver.query(INTERNAL_CONTENT_URI, PROJECTION, selection, null, null).use { internalCursor -> + MergeCursor(arrayOf(externalCursor, internalCursor)).use { cursor -> + while (cursor.moveToNext()) { + try { + val dir = cursor.getString(PROJECTION_DATA) + fileUtil.addImageToAutoUploads(dir) + Timber.tag("PhotoContentJob").i("Added file to UploadList") + Timber.tag("PhotoContentJob").d(String.format("Added file to UploadList %s", dir)) + } catch (e: FatalBackendException) { + Timber.tag("PhotoContentJob").e(e, "Failed to add image to auto upload list") + } catch (e: SecurityException) { + Timber.tag("PhotoContentJob").e(e, "No access to storage") + } } } - } ?: Timber.tag("PhotoContentJob").e("Error: no access to media!") - } catch (e: SecurityException) { - Timber.tag("PhotoContentJob").e("Error: no access to media!") - } finally { - cursor?.close() + } } + } else { + Timber.tag("PhotoContentJob").d("ids are null or 0: %s", ids) } } else { Timber.tag("PhotoContentJob").w("Photos rescan needed!") return true } - } else { - Timber.tag("PhotoContentJob").w("No photos content") - } + } ?: Timber.tag("PhotoContentJob").w("No photos content") - mHandler.post(mWorker) + handler.post(worker) return false } - private fun getIds(params: JobParameters): ArrayList? { + private fun getIds(params: JobParameters): Set? { return params.triggeredContentUris ?.map { it.pathSegments } - ?.filter { it != null && it.size == EXTERNAL_PATH_SEGMENTS.size + 1 } - ?.mapTo(ArrayList()) { it[it.size - 1] } + ?.filter { it != null && (it.size == EXTERNAL_CONTENT_URI.pathSegments.size + 1 || it.size == INTERNAL_CONTENT_URI.pathSegments.size + 1) } + ?.mapTo(HashSet()) { it[it.size - 1] } } - private fun buildSelection(ids: ArrayList): String { + private fun buildSelection(ids: Set): String { val selection = StringBuilder() ids.indices.forEach { i -> if (selection.isNotEmpty()) { @@ -94,7 +92,7 @@ class PhotoContentJob : JobService() { } selection.append(MediaStore.Images.ImageColumns._ID) selection.append("='") - selection.append(ids[i]) + selection.append(ids.elementAt(i)) selection.append("'") } return selection.toString() @@ -102,7 +100,7 @@ class PhotoContentJob : JobService() { override fun onStopJob(params: JobParameters): Boolean { Timber.tag("PhotoContentJob").i("onStopJob called, must stop, reschedule later") - mHandler.removeCallbacks(mWorker) + handler.removeCallbacks(worker) return true } @@ -114,7 +112,6 @@ class PhotoContentJob : JobService() { companion object { private val MEDIA_URI = Uri.parse("content://" + MediaStore.AUTHORITY + "/") - internal val EXTERNAL_PATH_SEGMENTS = EXTERNAL_CONTENT_URI.pathSegments internal val PROJECTION = arrayOf(MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA) internal const val PROJECTION_DATA = 1 @@ -125,6 +122,7 @@ class PhotoContentJob : JobService() { init { val builder = JobInfo.Builder(PHOTOS_CONTENT_JOB, ComponentName(ResourceHelper.getString(R.string.app_id), PhotoContentJob::class.java.name)) builder.addTriggerContentUri(JobInfo.TriggerContentUri(EXTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) + builder.addTriggerContentUri(JobInfo.TriggerContentUri(INTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) builder.addTriggerContentUri(JobInfo.TriggerContentUri(MEDIA_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) jobInfo = builder.build() } From 8d5762a6c05dc0a8669861dadf0f46e77ac118a2 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 16 Feb 2021 12:27:18 +0100 Subject: [PATCH 31/38] Bump version to 1.5.12-beta1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index feadbf81..d9b5b4b7 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.5.12-SNAPSHOT' + androidVersionName = '1.5.12-beta1' } repositories { mavenCentral() From 2452ddb5a2d7385564a79fc03854a09dc62b22b3 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 16 Feb 2021 13:56:23 +0100 Subject: [PATCH 32/38] Add release notes for v1.5.12-beta1 --- fastlane/metadata/android/de-DE/changelogs/default.txt | 5 ++++- fastlane/metadata/android/en-US/changelogs/default.txt | 5 ++++- fastlane/metadata/android/fr-FR/changelogs/default.txt | 1 - fastlane/release-notes.html | 5 ++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fastlane/metadata/android/de-DE/changelogs/default.txt b/fastlane/metadata/android/de-DE/changelogs/default.txt index 96332f4f..d723022d 100644 --- a/fastlane/metadata/android/de-DE/changelogs/default.txt +++ b/fastlane/metadata/android/de-DE/changelogs/default.txt @@ -1 +1,4 @@ -- Foo \ No newline at end of file +- Möglichkeit zum Sortieren der Tresorliste hinzugefügt +- Logging in Google Drive Cloud hinzugefügt +- Verhalten bei Änderung des OneDrive-Passworts verbessert +- CryptoBot-Symbole aufpoliert \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt index 96332f4f..c52505db 100644 --- a/fastlane/metadata/android/en-US/changelogs/default.txt +++ b/fastlane/metadata/android/en-US/changelogs/default.txt @@ -1 +1,4 @@ -- Foo \ No newline at end of file +- Added possibility to sort vault list +- Added logging to Google drive cloud +- Enhanced behaviour when OneDrive password changed +- Polished CryptoBot icons \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/default.txt b/fastlane/metadata/android/fr-FR/changelogs/default.txt index 96332f4f..e69de29b 100644 --- a/fastlane/metadata/android/fr-FR/changelogs/default.txt +++ b/fastlane/metadata/android/fr-FR/changelogs/default.txt @@ -1 +0,0 @@ -- Foo \ No newline at end of file diff --git a/fastlane/release-notes.html b/fastlane/release-notes.html index 8066f97b..58c05bfb 100644 --- a/fastlane/release-notes.html +++ b/fastlane/release-notes.html @@ -1,3 +1,6 @@
    -
  • Foo
  • +
  • Added possibility to sort vault list
  • +
  • Added logging to Google drive cloud
  • +
  • Enhanced behaviour when OneDrive password changed
  • +
  • Polished CryptoBot icons
\ No newline at end of file From 0c3671e74724ff3db05caa500cb44f29d902a73b Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 16 Feb 2021 15:07:26 +0100 Subject: [PATCH 33/38] Create APK's in deployToServer- and deployToFDroid-lane for GitHub --- fastlane/Fastfile | 108 +++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 63 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 348e5fa2..f219606b 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -28,30 +28,16 @@ platform :android do |options| FileUtils.cp(release_note_path_en, "metadata/android/fr-FR/changelogs/default.txt") deployToPlaystore(beta:options[:beta]) + deployToServer(beta:options[:beta]) + deployToFDroid(beta:options[:beta]) - if options[:beta] - puts "Skipping deployment to server cause there isn't currently a beta channel" - - slack( - default_payloads: [], # reduce the notification to the minimum - message: ":rocket: Successfully deployed #{version} with code #{build} to the Play Store :cryptomator:", - payload: { - "Changes" => File.read(release_note_path_en) - } - ) - else - deployToServer(beta:options[:beta]) - deployToFDroid(beta:options[:beta]) - - slack( - default_payloads: [], # reduce the notification to the minimum - message: ":rocket: Successfully deployed #{version} with code #{build} to the Play Store and APK store :cryptomator:", - payload: { - "Changes" => File.read(release_note_path_en) - } - ) - end - + slack( + default_payloads: [], # reduce the notification to the minimum + message: ":rocket: Successfully deployed #{version} with code #{build} to the Play Store :cryptomator:", + payload: { + "Changes" => File.read(release_note_path_en) + } + ) end desc "Deploy new version to Play Store" @@ -134,39 +120,43 @@ platform :android do |options| latest_version_jsn.write(token) latest_version_jsn.close - puts "Uploading APK and release note" + if options[:beta] + puts "Skipping deployment to server cause there isn't currently a beta channel" + else + puts "Uploading APK and release note" - aws_s3( - bucket: ENV['S3_BUCKET'], - endpoint: ENV['S3_ENDPOINT'], - region: ENV['S3_REGION'], - access_key: ENV['S3_ACCESS_KEY'], - secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], - path: "android/#{version}", - files: [ - "fastlane/release/Cryptomator-#{version}.apk", - "fastlane/release-notes.html" - ], - skip_html_upload: true, - apk: '' - ) - - puts "Uploading #{latest_version_filename} with claims #{claims}" - puts "Rename #{latest_version_filename} to latest-version.json for deployment" - - aws_s3( - bucket: ENV['S3_BUCKET'], - endpoint: ENV['S3_ENDPOINT'], - region: ENV['S3_REGION'], - access_key: ENV['S3_ACCESS_KEY'], - secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], - path: "android", - files: [ - "fastlane/latest_versions/#{latest_version_filename}" - ], - skip_html_upload: true, - apk: '' - ) + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android/#{version}", + files: [ + "fastlane/release/Cryptomator-#{version}.apk", + "fastlane/release-notes.html" + ], + skip_html_upload: true, + apk: '' + ) + + puts "Uploading #{latest_version_filename} with claims #{claims}" + puts "Rename #{latest_version_filename} to latest-version.json for deployment" + + aws_s3( + bucket: ENV['S3_BUCKET'], + endpoint: ENV['S3_ENDPOINT'], + region: ENV['S3_REGION'], + access_key: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], + path: "android", + files: [ + "fastlane/latest_versions/#{latest_version_filename}" + ], + skip_html_upload: true, + apk: '' + ) + end FileUtils.mv("release/Cryptomator-#{version}.apk", "release/Cryptomator-#{version}_signed.apk") end @@ -190,12 +180,4 @@ platform :android do |options| FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") end - - after_all do |lane| - #error do |lane, exception| - # slack( - # message: exception.message, - # success:false - # ) - end end From 174016dd37c68be8f22db52c78d34d6f15d6eb4e Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 16 Feb 2021 18:13:49 +0100 Subject: [PATCH 34/38] Partially revert 8dc310b to re-add custom storage location like SD cards --- .../java/org/cryptomator/presentation/model/CloudTypeModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt index 74f9d2b6..ca16deb3 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/CloudTypeModel.kt @@ -21,7 +21,8 @@ enum class CloudTypeModel(builder: Builder) { .withMultiInstances()), // LOCAL(Builder("LOCAL", R.string.cloud_names_local_storage) // .withCloudImageResource(R.drawable.storage_type_local) // - .withCloudImageLargeResource(R.drawable.storage_type_local_large)); + .withCloudImageLargeResource(R.drawable.storage_type_local_large) // + .withMultiInstances()); val cloudName: String = builder.cloudName val displayNameResource: Int = builder.displayNameResource From 503a6cf0c13fda047709b3f760121f065162c679 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Tue, 16 Feb 2021 18:28:26 +0100 Subject: [PATCH 35/38] Bump version to 1.5.12-beta2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d9b5b4b7..ed8df4be 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.5.12-beta1' + androidVersionName = '1.5.12-beta2' } repositories { mavenCentral() From 9767466064ed0d11374c638e2bdd501cc548c1e8 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Sat, 20 Feb 2021 17:11:20 +0100 Subject: [PATCH 36/38] Apply sorting of vaults when sharing with CM and biometric setup too --- .../model/comparator/VaultPositionComparator.kt | 10 ++++++++++ .../ui/adapter/BiometricAuthSettingsAdapter.kt | 7 +++++-- .../ui/adapter/SharedLocationsAdapter.kt | 9 +++++++-- .../presentation/ui/adapter/VaultsAdapter.kt | 17 +++++++++-------- .../ui/fragment/SharedFilesFragment.kt | 8 +++++--- 5 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 presentation/src/main/java/org/cryptomator/presentation/model/comparator/VaultPositionComparator.kt diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/comparator/VaultPositionComparator.kt b/presentation/src/main/java/org/cryptomator/presentation/model/comparator/VaultPositionComparator.kt new file mode 100644 index 00000000..08324c77 --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/model/comparator/VaultPositionComparator.kt @@ -0,0 +1,10 @@ +package org.cryptomator.presentation.model.comparator + +import org.cryptomator.presentation.model.VaultModel + +class VaultPositionComparator : Comparator { + + override fun compare(v1: VaultModel, v2: VaultModel): Int { + return v1.position - v2.position + } +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BiometricAuthSettingsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BiometricAuthSettingsAdapter.kt index e1e2bfef..b01a9050 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BiometricAuthSettingsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/BiometricAuthSettingsAdapter.kt @@ -2,15 +2,18 @@ package org.cryptomator.presentation.ui.adapter import android.view.View import com.google.android.material.switchmaterial.SwitchMaterial -import kotlinx.android.synthetic.main.item_biometric_auth_vault.view.* import org.cryptomator.presentation.R import org.cryptomator.presentation.model.VaultModel +import org.cryptomator.presentation.model.comparator.VaultPositionComparator import org.cryptomator.presentation.ui.adapter.BiometricAuthSettingsAdapter.BiometricAuthSettingsViewHolder import javax.inject.Inject +import kotlinx.android.synthetic.main.item_biometric_auth_vault.view.cloud +import kotlinx.android.synthetic.main.item_biometric_auth_vault.view.toggleBiometricAuth +import kotlinx.android.synthetic.main.item_biometric_auth_vault.view.vaultName class BiometricAuthSettingsAdapter // @Inject -constructor() : RecyclerViewBaseAdapter() { +constructor() : RecyclerViewBaseAdapter(VaultPositionComparator()) { private var onVaultBiometricAuthSettingsChanged: OnVaultBiometricAuthSettingsChanged? = null diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedLocationsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedLocationsAdapter.kt index 6ec8b950..28f85a17 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedLocationsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedLocationsAdapter.kt @@ -1,14 +1,19 @@ package org.cryptomator.presentation.ui.adapter import android.view.View -import kotlinx.android.synthetic.main.item_shareable_location.view.* import org.cryptomator.presentation.R import org.cryptomator.presentation.model.VaultModel +import org.cryptomator.presentation.model.comparator.VaultPositionComparator import org.cryptomator.presentation.ui.adapter.SharedLocationsAdapter.VaultViewHolder import javax.inject.Inject +import kotlinx.android.synthetic.main.item_shareable_location.view.chooseFolderLocation +import kotlinx.android.synthetic.main.item_shareable_location.view.chosenLocation +import kotlinx.android.synthetic.main.item_shareable_location.view.cloudImage +import kotlinx.android.synthetic.main.item_shareable_location.view.selectedVault +import kotlinx.android.synthetic.main.item_shareable_location.view.vaultName class SharedLocationsAdapter @Inject -constructor() : RecyclerViewBaseAdapter() { +constructor() : RecyclerViewBaseAdapter(VaultPositionComparator()) { private var selectedVault: VaultModel? = null private var selectedLocation: String? = null diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt index 5d00e96d..946aebfe 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/VaultsAdapter.kt @@ -1,15 +1,22 @@ package org.cryptomator.presentation.ui.adapter import android.view.View -import kotlinx.android.synthetic.main.item_vault.view.* import org.cryptomator.presentation.R import org.cryptomator.presentation.model.VaultModel +import org.cryptomator.presentation.model.comparator.VaultPositionComparator import org.cryptomator.presentation.ui.adapter.VaultsAdapter.VaultViewHolder import javax.inject.Inject +import kotlinx.android.synthetic.main.item_vault.view.cloudImage +import kotlinx.android.synthetic.main.item_vault.view.settings +import kotlinx.android.synthetic.main.item_vault.view.unlockedImage +import kotlinx.android.synthetic.main.item_vault.view.vaultName +import kotlinx.android.synthetic.main.item_vault.view.vaultPath class VaultsAdapter @Inject -internal constructor() : RecyclerViewBaseAdapter(VaultModelComparator()), VaultsMoveListener.Listener { +internal constructor() : RecyclerViewBaseAdapter(VaultPositionComparator()), VaultsMoveListener.Listener { + interface OnItemInteractionListener { + fun onVaultClicked(vaultModel: VaultModel) fun onVaultSettingsClicked(vaultModel: VaultModel) @@ -76,10 +83,4 @@ internal constructor() : RecyclerViewBaseAdapter { - override fun compare(o1: VaultModel, o2: VaultModel): Int { - return o1.position - o2.position - } - } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SharedFilesFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SharedFilesFragment.kt index 9d6f8e51..4a45076b 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SharedFilesFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SharedFilesFragment.kt @@ -8,6 +8,7 @@ import org.cryptomator.presentation.R import org.cryptomator.presentation.model.CloudFolderModel import org.cryptomator.presentation.model.SharedFileModel import org.cryptomator.presentation.model.VaultModel +import org.cryptomator.presentation.model.comparator.VaultPositionComparator import org.cryptomator.presentation.presenter.SharedFilesPresenter import org.cryptomator.presentation.ui.adapter.SharedFilesAdapter import org.cryptomator.presentation.ui.adapter.SharedFilesAdapter.Callback @@ -69,9 +70,10 @@ class SharedFilesFragment : BaseFragment() { } fun displayVaults(vaults: List?) { - if (vaults?.isNotEmpty() == true) { - presenter.selectedVault?.let { presenter.selectedVault = vaults[vaults.indexOf(it)] } - val preselectedVault = presenter.selectedVault ?: vaults[0] + val sortedVaults = vaults?.sortedWith(VaultPositionComparator()) + if (sortedVaults?.isNotEmpty() == true) { + presenter.selectedVault?.let { presenter.selectedVault = sortedVaults[sortedVaults.indexOf(it)] } + val preselectedVault = presenter.selectedVault ?: sortedVaults[0] locationsAdapter.setPreselectedVault(preselectedVault) presenter.onVaultSelected(preselectedVault) } From 8fe48c095af905d10827aa4f6c9b8d5cdd644650 Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 22 Feb 2021 11:36:30 +0100 Subject: [PATCH 37/38] Bump version to 1.5.12 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ed8df4be..4e29c087 100644 --- a/build.gradle +++ b/build.gradle @@ -42,7 +42,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.5.12-beta2' + androidVersionName = '1.5.12' } repositories { mavenCentral() From b5e516798edf35a3b109323b864ab69df30ba37d Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Mon, 22 Feb 2021 11:40:54 +0100 Subject: [PATCH 38/38] Adjust release notes for version 1.5.12 --- fastlane/metadata/android/en-US/changelogs/default.txt | 2 +- fastlane/release-notes.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/en-US/changelogs/default.txt b/fastlane/metadata/android/en-US/changelogs/default.txt index c52505db..22075f45 100644 --- a/fastlane/metadata/android/en-US/changelogs/default.txt +++ b/fastlane/metadata/android/en-US/changelogs/default.txt @@ -1,4 +1,4 @@ - Added possibility to sort vault list - Added logging to Google drive cloud -- Enhanced behaviour when OneDrive password changed +- Enhanced behavior when OneDrive password changed - Polished CryptoBot icons \ No newline at end of file diff --git a/fastlane/release-notes.html b/fastlane/release-notes.html index 58c05bfb..839af27d 100644 --- a/fastlane/release-notes.html +++ b/fastlane/release-notes.html @@ -1,6 +1,6 @@
  • Added possibility to sort vault list
  • Added logging to Google drive cloud
  • -
  • Enhanced behaviour when OneDrive password changed
  • +
  • Enhanced behavior when OneDrive password changed
  • Polished CryptoBot icons
\ No newline at end of file