From efa886b4551ad9121f202713272c0352908f7b69 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Tue, 16 Aug 2022 16:57:58 +0200 Subject: [PATCH] Add dashboard widgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tobiasKaminsky Signed-off-by: Álvaro Brey Signed-off-by: tobiasKaminsky --- .../com.nextcloud.ui.BitmapIT_glideSVG.png | Bin 0 -> 10872 bytes .../com.nextcloud.ui.BitmapIT_roundBitmap.png | Bin 0 -> 143341 bytes .../java/com/nextcloud/ui/BitmapIT.kt | 139 ++++++++++ app/src/main/AndroidManifest.xml | 43 ++-- .../nextcloud/client/di/ComponentsModule.java | 14 +- .../client/network/ClientFactoryImpl.java | 8 +- .../preferences/AppPreferencesImpl.java | 88 ++++--- .../client/preferences/PreferencesModule.java | 6 +- .../DashboardWidgetConfigurationActivity.kt | 236 +++++++++++++++++ .../DashboardWidgetConfigurationInterface.kt | 29 +++ .../client/widget/DashboardWidgetProvider.kt | 80 ++++++ .../client/widget/DashboardWidgetService.kt | 243 ++++++++++++++++++ .../client/widget/DashboardWidgetUpdater.kt | 166 ++++++++++++ .../client/widget/WidgetConfiguration.kt | 37 +++ .../client/widget/WidgetRepository.kt | 150 +++++++++++ .../ui/ChooseAccountDialogFragment.kt | 1 + .../android/ui/EmptyRecyclerView.java | 18 ++ .../android/ui/activity/DrawerActivity.java | 10 +- .../ui/activity/ManageAccountsActivity.java | 3 + .../ReceiveExternalFilesActivity.java | 12 +- .../ui/adapter/DashboardWidgetListAdapter.kt | 72 ++++++ .../ui/adapter/NotificationListAdapter.java | 11 +- .../android/ui/adapter/UserListAdapter.java | 22 +- .../ui/adapter/WidgetListItemViewHolder.kt | 77 ++++++ .../ui/dialog/AccountChooserInterface.kt | 29 +++ .../ui/dialog/MultipleAccountsDialog.java | 10 +- .../contactsbackup/BackupListAdapter.kt | 4 +- .../owncloud/android/utils/BitmapUtils.java | 41 ++- .../owncloud/android/utils/DisplayUtils.java | 23 +- .../android/utils/svg/SvgDecoder.java | 18 +- .../utils/svg/SvgDrawableTranscoder.java | 25 +- .../utils/svg/SvgSoftwareLayerSetter.java | 8 +- app/src/main/res/drawable/ic_check.xml | 11 + app/src/main/res/drawable/ic_dashboard.xml | 35 +++ app/src/main/res/layout/dashboard_widget.xml | 142 ++++++++++ .../dashboard_widget_configuration_layout.xml | 79 ++++++ app/src/main/res/layout/widget_item.xml | 68 +++++ .../main/res/layout/widget_item_load_more.xml | 37 +++ app/src/main/res/layout/widget_list_item.xml | 47 ++++ app/src/main/res/values/attrs.xml | 25 +- app/src/main/res/values/colors.xml | 3 +- app/src/main/res/values/strings.xml | 15 +- app/src/main/res/values/styles.xml | 17 +- app/src/main/res/values/themes.xml | 39 +++ .../main/res/xml/dashboard_widget_info.xml | 32 +++ .../preferences/TestAppPreferences.java | 6 +- .../ui/adapter/UserListAdapterTest.java | 3 + drawable_resources/dashboard.svg | 15 ++ 48 files changed, 2033 insertions(+), 164 deletions(-) create mode 100644 app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png create mode 100644 app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_roundBitmap.png create mode 100644 app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationActivity.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationInterface.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/DashboardWidgetProvider.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/DashboardWidgetService.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/DashboardWidgetUpdater.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/WidgetConfiguration.kt create mode 100644 app/src/main/java/com/nextcloud/client/widget/WidgetRepository.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/adapter/DashboardWidgetListAdapter.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/adapter/WidgetListItemViewHolder.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/dialog/AccountChooserInterface.kt create mode 100644 app/src/main/res/drawable/ic_check.xml create mode 100644 app/src/main/res/drawable/ic_dashboard.xml create mode 100644 app/src/main/res/layout/dashboard_widget.xml create mode 100644 app/src/main/res/layout/dashboard_widget_configuration_layout.xml create mode 100644 app/src/main/res/layout/widget_item.xml create mode 100644 app/src/main/res/layout/widget_item_load_more.xml create mode 100644 app/src/main/res/layout/widget_list_item.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/dashboard_widget_info.xml create mode 100644 drawable_resources/dashboard.svg diff --git a/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png b/app/screenshots/gplay/debug/com.nextcloud.ui.BitmapIT_glideSVG.png new file mode 100644 index 0000000000000000000000000000000000000000..668c4cd0e8da22b093305a70268d66a4bb6bab8b GIT binary patch literal 10872 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�uKCk4F0eKz_I#TZltz0$!U3L9cXU6X~fmYk3hE^M(uaKGG zQ60B@1VPr#J6Z8pPW+t%czBeTf~))sG)G{ar^~ zVt=HX=ZOnLZ1Y#U2B7u9fXAUPPz1Q)jDA&FAhG@x`?q)hM%+9pd*8ZpRPA}Z4f*Es zBxv&_$&G!ZeTNj?6Y5l-hS6ZM0WDLWstCr!xx$3Q!N$rNN?hw}!6Lu^J4IZK+RhFF_wyip_Q3oZi%*9az489Zd^u z6Cr73iw)uZ6Vs$9bqpyy+ie*>9nRYA0r3`L{l;ax8$xXz$J9T|o*(9` zrFNl6%K3688!VC51>%AJX`;+qIE(hn8@m2=0p-$lMW$lYa>}GqqvQ;Ha3-=}wrDyD)FXoi8 z{Aa4F>7A>(zogf1=ece(8KP*&eRprc3DKpmZ`Sy4O%hVzZ&I!5VrO{NLKhS6yO;&@YT53AzZp>0mO zh*5z)4eQ^ES7PzWXkL`PE=rk5VLOVkBw|WAs0{Vyj_@W8iAJRf&g*+A+!(!PnoFW*b9u`G5hebb;g)LylL@cr{fqLG^FHE^vk2X?)Ybg^&Q3YpxsJg~SkBi1(mM-qXDHweQ*L~y z^%`2cRg@EJbdtLMie{2y&-2Mg_8L{Phf zIoj~me!j+Cex8auajgAk`JgT}BOlIA#`ycDajw(10y!nN2lDvE2s2JFJDL*qp3e=~ z>&u^6U4z3SMH0asBRaa3;c$L#g!c`JQ>`B9L1oSvrSW&{`?t9FQCU=!x$~j)u7GC{1iM0YL>7>AeJ01XKjE z(0fNpB$SW@0)iq)lOjm(MS2lJ3q_;}At1d*N(c~0ga9Fdz~%kD|Np&nzua$k?#!L{ z%=xmRp{&iChx<9RP@pHsT0n4|zGab@%wonq%00qoW}GG4J93B@tK6xRa#iY~MCt4nS@9A9d46`b5Z zPeRoa(fb6UDI1kq7g4Z?z~dTbTt3 zXL}0sw~AKR4MtWx@F$!>iTK+hBRx~M>B?Y zwJYT!yyXzatPVVnTZe3OiaV;=~skXl>oZlK> z_F%oH5ipbgq6*$fdXI5gi9}p2tPy6lO)>fOCci?uWg;QDnXGtrs&0zhp}C1@36`D} zQgO0%4>Tg!(#XC5kJ+c_ek;J09-wmc&XH~i1p0R8$66N*sWykV^R$>e5y<;u) z{wStaGCkm$hfYfO@V~ogF1DA`>+u>(U-r^+7~q)g{tBf^Wfg_-r^5b?{C0Y zn`aLK7fQz158D(wFn5-6)vf(vriG%%V}?$vGVI*;q;?LWAI8Kr6i>uuUZmIQn8+}c zS&}UYiE#Si&?E4U4!SZ`!0DvS-lM+?lqY=Cjk}`7qXp36dn@u&U$Nsn?O?Mla6287 ze6rMj48$HSibh@_DwsDOidca#MX;W~>hi2NCW1&oS@r`6)nhg7!^ zKI$f2_nB0cK4T-{%41Lo-+X<|DMLZ(-*dP0u9ha?{UDLQ9MJ@VgV6LpU@-R7;U zmJ)A5ESEKOx`xsBa-hk(3Pg`4o3$Jr4KTW7StWyw>&`;FA8|s~zrG;q72!0K5OZ)$ zUMV96TL`uuC;x;7iTy(lrce>A7ZM9YE_}V8q;@ofxS^&JkMfix3GsC%)s_yDhCi4% z-oDK9sph6>&PuE-MBvI&W6X$%u1;wPV3Z$jvUYfwanncn3o8}>iVLrg=0SR+cWW(} zb`9!?PPOvfC28*tD}Yb-d4N8svljA(mjcz{4dQ=o1^IqfbaGybhUE#>T75#$joIlf znZ5Xmdi!mP`7QtE6z`e&#fYmuFZO@1yj;>1f?)C&;=

0H$PHuicbu!?xMAlEc~C z4I9V>a+A)p`CFK{h7_;y@d}a5FHYTnGbO|+oZ?@eXVdN8)-er{TLa5Y27pHkEeyV0 zGeSIXc`F${PVQ##Iw>RD0QH{tyocpt-KpwB*c!Ol0))uFgFHDRV^LB;k(dwv0EyEk zG_|za8T|F)+m4@e9QU3W90kJ-!-KbhEBWn5xdkoewF?fnRHAjtR~jl0$k8-YrhT&_ zGe5B!`$ypbe}Ra^4@-sb%DsS$kLIS44%>Cw@9GlvHjGz0YkrdSp=W<g_%Sn{W=#PP`3=4Yn?d*2RlN^Yx3cxT8vMPpRSbd`UpE;bW6@=J2za-Gj1y! zu6Iq}IWUD@^6-Va!pyV*(@kdQpdK#jDQOJYb9d=T0LZaqne+ z2Fyxj%a>32+=gh)WsN zI%Y+k7W)mDO*3=8TX-(&waNX=guF_-4o<6LtvA}w#Jl-!{}vy9sKOp9*~fK1G!gK* zP2xapH`J(YYv3Fp|M$a}0uDCR4guBSp)MYNCtI~`)qI;z2?wkGHyy_Hl2N-zjae4J z7|xfU%hgRmPFGWa7Bo0Hn)Fk~Kc~+U*-=ND6J>IP-W~jnP^j~Y%la!Q=l*#%5VP#v z<&E+$_p=G|KJ1Bw?S)Shx>5#Ri$yQS&40e3k&$R_*Ek+#Ff994!hJ!8`d65aekIo@ z&V_DJn0hnc#h2(e`^9~A=%GedW*hTFNtSy6-CFw9q|CC7o$d9vLa4?tNL$J?Q7T*4)r|p@SuNW)<9xoA$DhZrN23{{v%29b6YGn|2+S2SL1Vr}Fnr zFMaM#U2TW>=gY!_dCXTG7pc%FqS_nqF}ad$#Cx$RB< zO$vL@<=7y<{q=6+8yO}~0vPv_JD*HJ{K$&czv< zyT5w-Kv3wWZ}dYq_3CE)XTwKM9WOg97~>buYlS=_VD^-PIb{>K>o zD;xF)N+Dc#94n6n%lC55qoP&6Zk#K!E=a8meGF-df6&$~5L{^bnio7$=5i3f)OqYcUXUcReGKiZO4@17E5fC1Iq zA=Us{Vl+46%$aMNF3q&F?>iQfcEI-C&YNq3{d+}yS{zz=yhGccG8 z+tHKTWuVRf8)1N#qgw-~QbE@Ts)Ed%f$GVBDs+DzOMUSOHh`$W41 zW_O953L{>hf>cY94sMY`ra5fbNhdp{;faQ=M#w`lxM#@MhLOAcmLLbt{2 zMy7~pAGoW5tC;tarQe~E{sg3@-wEa;I*=$D$+^1Zlq;W}sok8d+fwM8UXg^qjB=I! zE4T(|wVZ#uFW>+hn9kTFZ1~^xkxB@YPRw+s*mk${Ri9Z)(!ZvB!p?$_?k`DTskMyB zVako+fBNpphtL+mOy|`L6>hghquzuF&dTbq%yYFx3#e|`K z>37G9y~A{Al^32pa%QE|jzlt0*q3hJ7q4-~IwbJe_;B^jBs(h6t$qeCp&Y#BmkIQf z;z&0-x_G{J!ohKvjBvpSnqT#A8@-F-a=Bk|&gLX5D@>Yu8~N2y!STTQ_0v?MV=-NJ zVJf5eBK{C;q5P9l+xNl?p+i(*TYEAw!A`z-&DAurc}+>T2yMV``gPQ{Qc&ZlHo2f~ z_13xC65HoX4W0#yz9G^%Ds0@3e?)MXK`e~avIV!QB|IM`JLtX0a)F(E-RoLY3Vm-G zouWq9R2Swg8si8}-gcp8EngST>C!-t3fq?98afnm*d)^lJN0CF(UXb8otBdWFqUL< zAj0}-LEh%yK6AE}mROfr=RN3=R^BARJFxVt)M=s&`7~?Pa>SMCMwzi3%DirM6SzDGV|oVqeqG7jpHJ((L`xj&lYIs`r=)QWR8bJq zQWz!SxsIQF5OMfUh#Qx1v(UBoZoZmxkM3|#_lKXdzyM>y42N`95JtXF8D}Ic1|IMQ zG&)$`ds48c4^e%sCm>@Vr$~<+uJCAa|2`wrgMBE^>;%+EmR!3%u{7ECo|?t$`}_Xi zuB-=Uv7k~0xt+1|PL()$-AF;Uz0T?*vrok6X!fuB7lIaIECg1F9k#&z&a{R0I9kM!ce5T%f7x)Gr?BDH=)@v{{{CPE!@*EX^Pti-`TgvRTiT`Gp<_haP1K z!C`I3`!}A5A-px@(oUhu|$WUT=bJ#Wh?oD-e$V`~i3W z9uWCTiH}BTB1_0vCXaaWdgAnGE1UAo*axc6=rO*ruup`cJwXW|k7zeq;qe*d(>uH0%WKI$Iq!k6WHyp^~i2 zrWrKzv*d{Qyso+HgaiM;?J}E~_Jba!rT#=Q@5B8q>cN>1OheA(JA2mom@e5+LQmyn z+;}?Jfiy3q9f)hG2_({#Q!`U8Y^XOojUm>h@ZuUuhTnQWZ#K(hqc&b8^&dRySQ}c(bPGbMBM7&C#SOmXPY&7Cudt#YOPX? zJYp@?%38JhY!Mp~E%g#MF5?1@ztj0?=#y0`qbQm&be0sc3_P^X1jgWPTm z2dBVtt9(eQs}lhle2N%Q-c0S0MX_12rr`bn@u@FMCdlsMUK6dTwE_Cd?eSI)V^A`N zq!?F>igb6nWR1Rup2e!vz2z$2%6NtN)D1Nfo5uF8TD?PZ@2RfetCWOqaCdmJg9+PN zqyv*Cp`h4}-h7_u9`CnA>p9v|UBJN?Oq>|8^`a7SzTSu}B(7c#z+9W)IETcEKE{TD}{Oex-c zUvWy-@+|vf9osD@{WLWGYPz%7_qiUwxflapC(dN-vJUn^j+gaIomqv9n-kd3>$(`; z#qpf!i;^iIPZDX>S@vcl-h1rYGIOHccgda+h#y~F;%H-oX?ICoBqy%UIcj2uHSX3& z8HxNubwa)1o7(l{w+MHA(#T#wAQ!f3BcZOfBHJdv{f)xK`Cm+3uEA3K{wO>7(H#g2 zGGkYYc$<*-=Uo7xxZV3@fGYGo z3^;vN^1jB;Lc)`jx*Y@S!yZKJb9d zqscdfD`Q(eJ`E?eO-xxvXtnc{DdEXTtaIIbVC!eKfk$=c=RgPvp_JL`hNT=#8RjLd zsX}z03i$}zvv+DVpYU|?0WB1bW-z9>kI&*QizYn%69+6#CUt6>eJ&w;fjylrSwBZy zg2e>eX#VP(MzArkGBt*Jn~&_H{e&17hm zlx)Y%4VO{VFC#nHh3Z&UFyw5%z2LkoA4;yff9N1fLa{IN1cUo!l&{^&B zmKc~!_qsBofh@m|5!_AJ=$HGxY{wedB3W4GFav#H;gj*kDhz2k$zZ&3xY{Gz1&^VW zXhsiM@>|1$#SFa%DjWw&g3TpG6!VRuIc}li%T+D{meXO+RO%AmILJB+aX1_1 zMT%AhPgp3`4U+uW5H!_N^wru%Rdz}88;n%dbwh|6#sDu!>dN?S41hPzMs@83wGXlf zRXWcB%~7}An;vZj1Z(b7^BZM&diO_=Ye>=u<>NZdQW#5gTy!_B=J|cs%s}`22)PRxciX<9+ewNP z#k18*p}8aFs7lTm<

>kPVmfg`6W9+l zf%ug3Ty%`I$@9=iP+K>gcSO)SY9G1GWAMcGS5*a(=2H&ew;Qy{`Y9_`i8>um zq?+wYgJ4n&4KJ8V%mtR8<=6C(2=V8X%QU=)<$=dqvZ3z^O8R;!0pB zgp#__i?!VKuRJ4=l)cz#SFRftVKJHSccSbC2;!d9B;DZ9Bv11QVoI+X(Ve9R)07(8 zO)%k{n20^0ll%IZLty{~-yUNUOh%ao|IJ^+s{S3SCY&|l^h}-5aLcRnY)JORmhW)y z1`hB7yCxbJ(!4xpQEtFY{~(Ucff0~s3L8|C(<0>pK_sQ*i_u%aEu#K@9gFIzM%6aU2*sKCJC)KcNj+dgy6E%$)z0+@uCd+W^-eI0i9m=W_qKk0Ltc(el zrLdhgmES`a%jvS*Rj{9As!R#`cgtS=Dqu&&-ez@^{5mTot2ondd2^{8Acii%Wq#a# zd&yBUEN)rs&b40xXwV_&C9+EU8!+PWFpG&6EaqVK}`hs3P*ju~r zd$NP~{)?6B-b9k~_h{tho$Q5s`TMUoi|VE%(nzB|^I(I#fwQY=JKcfTNON*X#x^UR z+-G>tLUOy-kXQI>Ie8(`qav_LnPw`~o#i_(oX%o$>L7Nrpm8dp&;ZP@okE z8q3JXx9WXOx^R&98f=k1r+VihSr*jR7=iV;5``5p*dcU4ly23SkUfYitUg=T9?1}y zn%IE>x1gbUA+L?JqlKJQ9{#x)Oq@ z(}7SkhiM{Pn$N@}-dX!NN@4EVG+w(tLncd<)*ORxn2uFUD?tq42q}LIDupJN?OB{| z1f6aHOnyT@89T&ILQS6r#h{oTwuK)RD2xsG(FRaZ3(lr~yi^>YhsWN#k5f(C!~N8*w3W z-lQ!-1l%z2uA?~dez2M7W$fA$56=&*1eBupd}=M)F^piOIL4$&*~}NWwmA(v(rpYsZ-9Z+PE$a$)frfoWQ)TJE}yV=r~UhMmZj6zL5Yo?(3SZq=1^OTlB?5ZMV zJ8UPYvNv<;+O-J{JV`orYcI?dqZ~an604SYwvfk?ZtGYG~_VWUzS)GqM%CU&njo>RgWV*z>Ql zNf~DcF$Ytci(QKSDxeE5Y)~nCc{hmXc7GjWbtEaL(E@6mZ+FKDbO|8Xvp;h`l5Dr> zWfN!I6tIp#UZ&0JUT|_;X!escZ_-AK|I0tK>2q>~9P}gAF7P%XG%XNNRM_hVDa}an zeDc<*LeZAvei3c7VdhXM)EfN?{rC;GZn$VIvw%-!I0qpitDZYgGVB*<4&6}V6ZTkLgx4xSxIoHgHTfZ|fDFVck`pE!ER<(GT|vhb?5FaVz6R0ofBf7UaiA|4D-kMKvv6W1Ce4VY0`b zxi2kj1@9RmWglQNZIa?C0y4Vkr zDFd?&s56p~0CUMiHH<{w>tiodK+(&*46*)k4G$>9`p^!UnT?-7bnQ^~dljZy+z)G- z;P?D*&Q!1+EW$~8ohLB5(4i{n9I5LlM1;+tPt>Gt!l1Pcr*_@rxh0dMjE^SmlEIX; zCCpJ1iAp#_7fR5jqYLGrJF7}3yhaz2!*F{4ulBzm{a5>czVfg3|Fus}yZnF9>;L|5 x|Cy72$-{r<?*j~^LmS3a-}{U1%NDQExy literal 0 HcmV?d00001 diff --git a/app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt b/app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt new file mode 100644 index 0000000000..23bfb671c8 --- /dev/null +++ b/app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt @@ -0,0 +1,139 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.ui + +import android.graphics.BitmapFactory +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.test.espresso.intent.rule.IntentsTestRule +import com.nextcloud.client.TestActivity +import com.owncloud.android.AbstractIT +import com.owncloud.android.R +import com.owncloud.android.utils.BitmapUtils +import com.owncloud.android.utils.ScreenshotTest +import org.junit.Rule +import org.junit.Test + +class BitmapIT : AbstractIT() { + @get:Rule + val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false) + + @Test + @ScreenshotTest + fun roundBitmap() { + val file = getFile("christine.jpg") + val bitmap = BitmapFactory.decodeFile(file.absolutePath) + + val activity = testActivityRule.launchActivity(null) + val imageView = ImageView(activity).apply { + setImageBitmap(bitmap) + } + + val bitmap2 = BitmapFactory.decodeFile(file.absolutePath) + val imageView2 = ImageView(activity).apply { + setImageBitmap(BitmapUtils.roundBitmap(bitmap2)) + } + + val linearLayout = LinearLayout(activity).apply { + orientation = LinearLayout.VERTICAL + setBackgroundColor(context.getColor(R.color.grey_200)) + } + linearLayout.addView(imageView, 200, 200) + linearLayout.addView(imageView2, 200, 200) + activity.addView(linearLayout) + + screenshot(activity) + } + + // @Test + // @ScreenshotTest + // fun glideSVG() { + // val activity = testActivityRule.launchActivity(null) + // val accountProvider = UserAccountManagerImpl.fromContext(activity) + // val clientFactory = ClientFactoryImpl(activity) + // + // val linearLayout = LinearLayout(activity).apply { + // orientation = LinearLayout.VERTICAL + // setBackgroundColor(context.getColor(R.color.grey_200)) + // } + // + // val file = getFile("christine.jpg") + // val bitmap = BitmapFactory.decodeFile(file.absolutePath) + // + // ImageView(activity).apply { + // setImageBitmap(bitmap) + // linearLayout.addView(this, 50, 50) + // } + // + // downloadIcon( + // client.baseUri.toString() + "/apps/files/img/app.svg", + // activity, + // linearLayout, + // accountProvider, + // clientFactory + // ) + // + // downloadIcon( + // client.baseUri.toString() + "/core/img/actions/group.svg", + // activity, + // linearLayout, + // accountProvider, + // clientFactory + // ) + // + // activity.addView(linearLayout) + // + // longSleep() + // + // screenshot(activity) + // } + // + // private fun downloadIcon( + // url: String, + // activity: TestActivity, + // linearLayout: LinearLayout, + // accountProvider: UserAccountManager, + // clientFactory: ClientFactory + // ) { + // val view = ImageView(activity).apply { + // linearLayout.addView(this, 50, 50) + // } + // val target = object : SimpleTarget() { + // override fun onResourceReady(resource: Drawable?, glideAnimation: GlideAnimation?) { + // view.setColorFilter(targetContext.getColor(R.color.dark), PorterDuff.Mode.SRC_ATOP) + // view.setImageDrawable(resource) + // } + // } + // + // testActivityRule.runOnUiThread { + // DisplayUtils.downloadIcon( + // accountProvider, + // clientFactory, + // activity, + // url, + // target, + // R.drawable.ic_user + // ) + // } + // } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e389fb86cb..40520d51cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,9 +40,7 @@ - - + @@ -151,6 +149,13 @@ + + + + + + + + + + + + - + - - - - + android:permission="android.permission.MANAGE_DOCUMENTS"> - - - - - - - - + * Users should not use this class directly. Please use {@link AppPreferences} interface instead. */ public final class AppPreferencesImpl implements AppPreferences { /** - * Constant to access value of last path selected by the user to upload a file shared from other app. - * Value handled by the app without direct access in the UI. + * Constant to access value of last path selected by the user to upload a file shared from other app. Value handled + * by the app without direct access in the UI. */ public static final String AUTO_PREF__LAST_SEEN_VERSION_CODE = "lastSeenVersionCode"; public static final String STORAGE_PATH = "storage_path"; @@ -101,7 +100,7 @@ public final class AppPreferencesImpl implements AppPreferences { private final Context context; private final SharedPreferences preferences; - private final CurrentAccountProvider currentAccountProvider; + private final UserAccountManager userAccountManager; private final ListenerRegistry listeners; /** @@ -123,7 +122,7 @@ public final class AppPreferencesImpl implements AppPreferences { } } - void remove(@Nullable final Listener listener) { + void remove(@Nullable final Listener listener) { if (listener != null) { listeners.remove(listener); } @@ -133,7 +132,7 @@ public final class AppPreferencesImpl implements AppPreferences { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PREF__DARK_THEME.equals(key)) { DarkMode mode = preferences.getDarkThemeMode(); - for(Listener l : listeners) { + for (Listener l : listeners) { l.onDarkThemeModeChanged(mode); } } @@ -141,9 +140,9 @@ public final class AppPreferencesImpl implements AppPreferences { } /** - * This is a temporary workaround to access app preferences in places that cannot use - * dependency injection yet. Use injected component via {@link AppPreferences} interface. - * + * This is a temporary workaround to access app preferences in places that cannot use dependency injection yet. Use + * injected component via {@link AppPreferences} interface. + *

* WARNING: this creates new instance! it does not return app-wide singleton * * @param context Context used to create shared preferences @@ -151,15 +150,15 @@ public final class AppPreferencesImpl implements AppPreferences { */ @Deprecated public static AppPreferences fromContext(Context context) { - final CurrentAccountProvider currentAccountProvider = UserAccountManagerImpl.fromContext(context); + final UserAccountManager userAccountManager = UserAccountManagerImpl.fromContext(context); final SharedPreferences prefs = android.preference.PreferenceManager.getDefaultSharedPreferences(context); - return new AppPreferencesImpl(context, prefs, currentAccountProvider); + return new AppPreferencesImpl(context, prefs, userAccountManager); } - AppPreferencesImpl(Context appContext, SharedPreferences preferences, CurrentAccountProvider currentAccountProvider) { + AppPreferencesImpl(Context appContext, SharedPreferences preferences, UserAccountManager userAccountManager) { this.context = appContext; this.preferences = preferences; - this.currentAccountProvider = currentAccountProvider; + this.userAccountManager = userAccountManager; this.listeners = new ListenerRegistry(this); this.preferences.registerOnSharedPreferenceChangeListener(listeners); } @@ -277,7 +276,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public String[] getPassCode() { - return new String[] { + return new String[]{ preferences.getString(PassCodeActivity.PREFERENCE_PASSCODE_D1, null), preferences.getString(PassCodeActivity.PREFERENCE_PASSCODE_D2, null), preferences.getString(PassCodeActivity.PREFERENCE_PASSCODE_D3, null), @@ -293,7 +292,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public String getFolderLayout(OCFile folder) { return getFolderPreference(context, - currentAccountProvider.getUser(), + userAccountManager.getUser(), PREF__FOLDER_LAYOUT, folder, FOLDER_LAYOUT_LIST); @@ -302,7 +301,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public void setFolderLayout(@Nullable OCFile folder, String layoutName) { setFolderPreference(context, - currentAccountProvider.getUser(), + userAccountManager.getUser(), PREF__FOLDER_LAYOUT, folder, layoutName); @@ -311,7 +310,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public FileSortOrder getSortOrderByFolder(OCFile folder) { return FileSortOrder.sortOrders.get(getFolderPreference(context, - currentAccountProvider.getUser(), + userAccountManager.getUser(), PREF__FOLDER_SORT_ORDER, folder, FileSortOrder.sort_a_to_z.name)); @@ -320,7 +319,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public void setSortOrder(@Nullable OCFile folder, FileSortOrder sortOrder) { setFolderPreference(context, - currentAccountProvider.getUser(), + userAccountManager.getUser(), PREF__FOLDER_SORT_ORDER, folder, sortOrder.name); @@ -333,7 +332,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public FileSortOrder getSortOrderByType(FileSortOrder.Type type, FileSortOrder defaultOrder) { - User user = currentAccountProvider.getUser(); + User user = userAccountManager.getUser(); if (user.isAnonymous()) { return defaultOrder; } @@ -347,7 +346,7 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public void setSortOrder(FileSortOrder.Type type, FileSortOrder sortOrder) { - User user = currentAccountProvider.getUser(); + User user = userAccountManager.getUser(); ArbitraryDataProvider dataProvider = new ArbitraryDataProvider(context.getContentResolver()); dataProvider.storeOrUpdateKeyValue(user.getAccountName(), PREF__FOLDER_SORT_ORDER + "_" + type, sortOrder.name); } @@ -506,19 +505,19 @@ public final class AppPreferencesImpl implements AppPreferences { @Override public void removeLegacyPreferences() { preferences.edit() - .remove("instant_uploading") - .remove("instant_video_uploading") - .remove("instant_upload_path") - .remove("instant_upload_path_use_subfolders") - .remove("instant_upload_on_wifi") - .remove("instant_upload_on_charging") - .remove("instant_video_upload_path") - .remove("instant_video_upload_path_use_subfolders") - .remove("instant_video_upload_on_wifi") - .remove("instant_video_uploading") - .remove("instant_video_upload_on_charging") - .remove("prefs_instant_behaviour") - .apply(); + .remove("instant_uploading") + .remove("instant_video_uploading") + .remove("instant_upload_path") + .remove("instant_upload_path_use_subfolders") + .remove("instant_upload_on_wifi") + .remove("instant_upload_on_charging") + .remove("instant_video_upload_path") + .remove("instant_video_upload_path_use_subfolders") + .remove("instant_video_upload_on_wifi") + .remove("instant_video_uploading") + .remove("instant_video_upload_on_charging") + .remove("prefs_instant_behaviour") + .apply(); } @Override @@ -588,13 +587,12 @@ public final class AppPreferencesImpl implements AppPreferences { } /** - * Get preference value for a folder. - * If folder is not set itself, it finds an ancestor that is set. + * Get preference value for a folder. If folder is not set itself, it finds an ancestor that is set. * - * @param context Context object. + * @param context Context object. * @param preferenceName Name of the preference to lookup. - * @param folder Folder. - * @param defaultValue Fallback value in case no ancestor is set. + * @param folder Folder. + * @param defaultValue Fallback value in case no ancestor is set. * @return Preference value */ private static String getFolderPreference(final Context context, @@ -621,10 +619,10 @@ public final class AppPreferencesImpl implements AppPreferences { /** * Set preference value for a folder. * - * @param context Context object. + * @param context Context object. * @param preferenceName Name of the preference to set. - * @param folder Folder. - * @param value Preference value to set. + * @param folder Folder. + * @param value Preference value to set. */ private static void setFolderPreference(final Context context, final User user, @@ -637,7 +635,7 @@ public final class AppPreferencesImpl implements AppPreferences { private static String getKeyFromFolder(String preferenceName, @Nullable OCFile folder) { final String folderIdString = String.valueOf(folder != null ? folder.getFileId() : - FileDataStorageManager.ROOT_PARENT_ID); + FileDataStorageManager.ROOT_PARENT_ID); return preferenceName + "_" + folderIdString; } diff --git a/app/src/main/java/com/nextcloud/client/preferences/PreferencesModule.java b/app/src/main/java/com/nextcloud/client/preferences/PreferencesModule.java index 6d3338fb37..d0b1d37103 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/PreferencesModule.java +++ b/app/src/main/java/com/nextcloud/client/preferences/PreferencesModule.java @@ -3,7 +3,7 @@ package com.nextcloud.client.preferences; import android.content.Context; import android.content.SharedPreferences; -import com.nextcloud.client.account.CurrentAccountProvider; +import com.nextcloud.client.account.UserAccountManager; import javax.inject.Singleton; @@ -23,7 +23,7 @@ public class PreferencesModule { @Singleton public AppPreferences appPreferences(Context context, SharedPreferences sharedPreferences, - CurrentAccountProvider currentAccountProvider) { - return new AppPreferencesImpl(context, sharedPreferences, currentAccountProvider); + UserAccountManager userAccountManager) { + return new AppPreferencesImpl(context, sharedPreferences, userAccountManager); } } diff --git a/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationActivity.kt b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationActivity.kt new file mode 100644 index 0000000000..ce1aeaeee0 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationActivity.kt @@ -0,0 +1,236 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.nextcloud.client.widget + +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.content.res.AppCompatResources +import androidx.recyclerview.widget.LinearLayoutManager +import com.nextcloud.android.lib.resources.dashboard.DashBoardButtonType +import com.nextcloud.android.lib.resources.dashboard.DashboardListWidgetsRemoteOperation +import com.nextcloud.android.lib.resources.dashboard.DashboardWidget +import com.nextcloud.client.account.User +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.di.Injectable +import com.nextcloud.client.network.ClientFactory +import com.nextcloud.client.network.ClientFactory.CreationException +import com.owncloud.android.R +import com.owncloud.android.databinding.DashboardWidgetConfigurationLayoutBinding +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.ui.adapter.DashboardWidgetListAdapter +import com.owncloud.android.ui.dialog.AccountChooserInterface +import com.owncloud.android.ui.dialog.MultipleAccountsDialog +import com.owncloud.android.utils.theme.ThemeDrawableUtils +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import javax.inject.Inject + +class DashboardWidgetConfigurationActivity : + AppCompatActivity(), + DashboardWidgetConfigurationInterface, + Injectable, + AccountChooserInterface { + private lateinit var mAdapter: DashboardWidgetListAdapter + private lateinit var binding: DashboardWidgetConfigurationLayoutBinding + private lateinit var currentUser: User + + @Inject + lateinit var themeDrawableUtils: ThemeDrawableUtils + + @Inject + lateinit var accountManager: UserAccountManager + + @Inject + lateinit var clientFactory: ClientFactory + + @Inject + lateinit var widgetRepository: WidgetRepository + + @Inject + lateinit var widgetUpdater: DashboardWidgetUpdater + + var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID + + public override fun onCreate(bundle: Bundle?) { + super.onCreate(bundle) + + // Set the result to CANCELED. This will cause the widget host to cancel + // out of the widget placement if the user presses the back button. + setResult(RESULT_CANCELED) + + binding = DashboardWidgetConfigurationLayoutBinding.inflate(layoutInflater) + setContentView(binding.root) + + themeDrawableUtils.tintDrawable(binding.icon.drawable, getColor(R.color.dark)) + + val layoutManager = LinearLayoutManager(this) + // TODO follow our new architecture + mAdapter = DashboardWidgetListAdapter(themeDrawableUtils, accountManager, clientFactory, this, this) + binding.list.apply { + setHasFooter(false) + setAdapter(mAdapter) + setLayoutManager(layoutManager) + setEmptyView(binding.emptyView.emptyListView) + } + + currentUser = accountManager.user + if (accountManager.allUsers.size > 1) { + binding.chooseWidget.visibility = View.GONE + + binding.accountName.apply { + setCompoundDrawablesWithIntrinsicBounds( + null, + null, + themeDrawableUtils.tintDrawable( + AppCompatResources.getDrawable( + context, + R.drawable.ic_baseline_arrow_drop_down_24 + ), + R.color.black + ), + null + ) + visibility = View.VISIBLE + text = currentUser.accountName + setOnClickListener { + val dialog = MultipleAccountsDialog() + dialog.highlightCurrentlyActiveAccount = false + dialog.show(supportFragmentManager, null) + } + } + } + loadWidgets(currentUser) + + binding.close.setOnClickListener { finish() } + + // Find the widget id from the intent. + appWidgetId = intent?.extras?.getInt( + AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID + ) ?: AppWidgetManager.INVALID_APPWIDGET_ID + + // If this activity was started with an intent without an app widget ID, finish with an error. + if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish() + return + } + } + + private fun loadWidgets(user: User) { + CoroutineScope(Dispatchers.IO).launch { + withContext(Dispatchers.Main) { + binding.emptyView.root.visibility = View.GONE + if (accountManager.allUsers.size > 1) { + binding.accountName.text = user.accountName + } + } + + try { + val client = clientFactory.createNextcloudClient(user) + val result = DashboardListWidgetsRemoteOperation().execute(client) + + withContext(Dispatchers.Main) { + if (result.code == RemoteOperationResult.ResultCode.FILE_NOT_FOUND) { + withContext(Dispatchers.Main) { + mAdapter.setWidgetList(null) + binding.emptyView.root.visibility = View.VISIBLE + binding.emptyView.emptyListViewHeadline.setText(R.string.widgets_not_available_title) + + binding.emptyView.emptyListIcon.apply { + setImageResource(R.drawable.ic_list_empty_error) + visibility = View.VISIBLE + } + binding.emptyView.emptyListViewText.apply { + setText( + String.format( + getString(R.string.widgets_not_available), + getString(R.string.app_name) + ) + ) + visibility = View.VISIBLE + } + } + } else { + mAdapter.setWidgetList(result.resultData) + } + } + } catch (e: CreationException) { + Log_OC.e(this, "Error loading widgets for user $user", e) + + withContext(Dispatchers.Main) { + mAdapter.setWidgetList(null) + binding.emptyView.root.visibility = View.VISIBLE + + binding.emptyView.emptyListIcon.apply { + setImageResource(R.drawable.ic_list_empty_error) + visibility = View.VISIBLE + } + binding.emptyView.emptyListViewText.apply { + setText(R.string.common_error) + visibility = View.VISIBLE + } + binding.emptyView.emptyListViewAction.apply { + visibility = View.VISIBLE + setText(R.string.reload) + setOnClickListener { + loadWidgets(user) + } + } + } + } + } + } + + override fun onItemClicked(dashboardWidget: DashboardWidget) { + widgetRepository.saveWidget(appWidgetId, dashboardWidget, currentUser) + + // update widget + val appWidgetManager = AppWidgetManager.getInstance(this) + + widgetUpdater.updateAppWidget( + appWidgetManager, + appWidgetId, + dashboardWidget.title, + dashboardWidget.iconUrl, + dashboardWidget.buttons?.find { it.type == DashBoardButtonType.NEW } + ) + + val resultValue = Intent().apply { + putExtra(EXTRA_APPWIDGET_ID, appWidgetId) + } + + setResult(RESULT_OK, resultValue) + finish() + } + + override fun onAccountChosen(user: User) { + currentUser = user + loadWidgets(user) + } +} diff --git a/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationInterface.kt b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationInterface.kt new file mode 100644 index 0000000000..1901349f26 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetConfigurationInterface.kt @@ -0,0 +1,29 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import com.nextcloud.android.lib.resources.dashboard.DashboardWidget + +interface DashboardWidgetConfigurationInterface { + fun onItemClicked(dashboardWidget: DashboardWidget) +} diff --git a/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetProvider.kt b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetProvider.kt new file mode 100644 index 0000000000..220298dd3e --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetProvider.kt @@ -0,0 +1,80 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProvider +import android.content.Context +import android.content.Intent +import dagger.android.AndroidInjection +import javax.inject.Inject + +/** + * Manages widgets + */ +class DashboardWidgetProvider : AppWidgetProvider() { + @Inject + lateinit var widgetRepository: WidgetRepository + + @Inject + lateinit var widgetUpdater: DashboardWidgetUpdater + + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + AndroidInjection.inject(this, context) + + for (appWidgetId in appWidgetIds) { + val widgetConfiguration = widgetRepository.getWidget(appWidgetId) + + widgetUpdater.updateAppWidget( + appWidgetManager, + appWidgetId, + widgetConfiguration.title, + widgetConfiguration.iconUrl, + widgetConfiguration.addButton + ) + } + } + + override fun onReceive(context: Context?, intent: Intent?) { + super.onReceive(context, intent) + AndroidInjection.inject(this, context) + + if (intent?.action == OPEN_INTENT) { + val clickIntent = Intent(Intent.ACTION_VIEW, intent.data) + clickIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context?.startActivity(clickIntent) + } + } + + override fun onDeleted(context: Context?, appWidgetIds: IntArray) { + AndroidInjection.inject(this, context) + + for (appWidgetId in appWidgetIds) { + widgetRepository.deleteWidget(appWidgetId) + } + } + + companion object { + const val OPEN_INTENT = "open" + } +} diff --git a/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetService.kt b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetService.kt new file mode 100644 index 0000000000..aed8a70fff --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetService.kt @@ -0,0 +1,243 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import android.appwidget.AppWidgetManager +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.view.View +import android.widget.RemoteViews +import android.widget.RemoteViewsService +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.model.StreamEncoder +import com.bumptech.glide.load.resource.file.FileToStreamDecoder +import com.bumptech.glide.request.FutureTarget +import com.nextcloud.android.lib.resources.dashboard.DashboardGetWidgetItemsRemoteOperation +import com.nextcloud.android.lib.resources.dashboard.DashboardWidgetItem +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.network.ClientFactory +import com.owncloud.android.R +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.utils.BitmapUtils +import com.owncloud.android.utils.DisplayUtils.SVG_SIZE +import com.owncloud.android.utils.glide.CustomGlideStreamLoader +import com.owncloud.android.utils.glide.CustomGlideUriLoader +import com.owncloud.android.utils.svg.SVGorImage +import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder +import com.owncloud.android.utils.svg.SvgOrImageDecoder +import dagger.android.AndroidInjection +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.io.InputStream +import javax.inject.Inject + +class DashboardWidgetService : RemoteViewsService() { + @Inject + lateinit var userAccountManager: UserAccountManager + + @Inject + lateinit var clientFactory: ClientFactory + + @Inject + lateinit var widgetRepository: WidgetRepository + + override fun onCreate() { + super.onCreate() + AndroidInjection.inject(this) + } + + override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { + return StackRemoteViewsFactory( + this.applicationContext, + userAccountManager, + clientFactory, + intent, + widgetRepository + ) + } +} + +class StackRemoteViewsFactory( + private val context: Context, + val userAccountManager: UserAccountManager, + val clientFactory: ClientFactory, + val intent: Intent, + val widgetRepository: WidgetRepository +) : RemoteViewsService.RemoteViewsFactory { + + private lateinit var widgetConfiguration: WidgetConfiguration + private var widgetItems: List = emptyList() + private var hasLoadMore = false + + override fun onCreate() { + Log_OC.d(this, "onCreate") + val appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) + + widgetConfiguration = widgetRepository.getWidget(appWidgetId) + + if (!widgetConfiguration.user.isPresent) { + // TODO show error + Log_OC.e(this, "No user found!") + } + + onDataSetChanged() + } + + override fun onDataSetChanged() { + CoroutineScope(Dispatchers.IO).launch { + try { + val client = clientFactory.createNextcloudClient(widgetConfiguration.user.get()) + val result = + DashboardGetWidgetItemsRemoteOperation(widgetConfiguration.widgetId, LIMIT_SIZE).execute(client) + widgetItems = result.resultData[widgetConfiguration.widgetId] ?: emptyList() + + hasLoadMore = widgetConfiguration.moreButton != null && + widgetItems.size == LIMIT_SIZE + } catch (e: ClientFactory.CreationException) { + Log_OC.e(this, "Error updating widget", e) + } + } + + Log_OC.d("WidgetService", "onDataSetChanged") + } + + override fun onDestroy() { + Log_OC.d("WidgetService", "onDestroy") + + widgetItems = emptyList() + } + + override fun getCount(): Int { + return if (hasLoadMore && widgetItems.isNotEmpty()) { + widgetItems.size + 1 + } else { + widgetItems.size + } + } + + override fun getViewAt(position: Int): RemoteViews { + return if (position == widgetItems.size) { + createLoadMoreView() + } else { + createItemView(position) + } + } + + private fun createLoadMoreView(): RemoteViews { + return RemoteViews(context.packageName, R.layout.widget_item_load_more).apply { + val clickIntent = Intent(Intent.ACTION_VIEW, Uri.parse(widgetConfiguration.moreButton?.link)) + setTextViewText(R.id.load_more, widgetConfiguration.moreButton?.text) + setOnClickFillInIntent(R.id.load_more_container, clickIntent) + } + } + + // we will switch soon to coil and then streamline all of this + // Kotlin cannot catch multiple exception types at same time + @Suppress("NestedBlockDepth", "TooGenericExceptionCaught") + private fun createItemView(position: Int): RemoteViews { + return RemoteViews(context.packageName, R.layout.widget_item).apply { + val widgetItem = widgetItems[position] + + // icon bitmap/svg + if (widgetItem.iconUrl.isNotEmpty()) { + val glide: FutureTarget + if (Uri.parse(widgetItem.iconUrl).encodedPath!!.endsWith(".svg")) { + glide = Glide.with(context) + .using( + CustomGlideUriLoader(userAccountManager.user, clientFactory), + InputStream::class.java + ) + .from(Uri::class.java) + .`as`(SVGorImage::class.java) + .transcode(SvgOrImageBitmapTranscoder(SVG_SIZE, SVG_SIZE), Bitmap::class.java) + .sourceEncoder(StreamEncoder()) + .cacheDecoder(FileToStreamDecoder(SvgOrImageDecoder())) + .decoder(SvgOrImageDecoder()) + .diskCacheStrategy(DiskCacheStrategy.SOURCE) + .load(Uri.parse(widgetItem.iconUrl)) + .into(SVG_SIZE, SVG_SIZE) + } else { + glide = Glide.with(context) + .using(CustomGlideStreamLoader(widgetConfiguration.user.get(), clientFactory)) + .load(widgetItem.iconUrl) + .asBitmap() + .into(SVG_SIZE, SVG_SIZE) + } + + try { + if (widgetConfiguration.roundIcon) { + setImageViewBitmap(R.id.icon, BitmapUtils.roundBitmap(glide.get())) + } else { + setImageViewBitmap(R.id.icon, glide.get()) + } + } catch (e: Exception) { + Log_OC.d(this, "Error setting icon", e) + setImageViewResource(R.id.icon, R.drawable.ic_dashboard) + } + } + + // text + setTextViewText(R.id.title, widgetItem.title) + + if (widgetItem.subtitle.isNotEmpty()) { + setViewVisibility(R.id.subtitle, View.VISIBLE) + setTextViewText(R.id.subtitle, widgetItem.subtitle) + } else { + setViewVisibility(R.id.subtitle, View.GONE) + } + + if (widgetItem.link.isNotEmpty()) { + val clickIntent = Intent(Intent.ACTION_VIEW, Uri.parse(widgetItem.link)) + setOnClickFillInIntent(R.id.text_container, clickIntent) + } + } + } + + override fun getLoadingView(): RemoteViews? { + return null + } + + override fun getViewTypeCount(): Int { + return if (hasLoadMore) { + 2 + } else { + 1 + } + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun hasStableIds(): Boolean { + return true + } + + companion object { + const val LIMIT_SIZE = 14 + } +} diff --git a/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetUpdater.kt b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetUpdater.kt new file mode 100644 index 0000000000..d6db1eed18 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/DashboardWidgetUpdater.kt @@ -0,0 +1,166 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import android.annotation.SuppressLint +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.view.View +import android.widget.RemoteViews +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.model.StreamEncoder +import com.bumptech.glide.load.resource.file.FileToStreamDecoder +import com.bumptech.glide.request.animation.GlideAnimation +import com.bumptech.glide.request.target.AppWidgetTarget +import com.nextcloud.android.lib.resources.dashboard.DashboardButton +import com.nextcloud.client.account.CurrentAccountProvider +import com.nextcloud.client.network.ClientFactory +import com.owncloud.android.R +import com.owncloud.android.utils.BitmapUtils +import com.owncloud.android.utils.DisplayUtils.SVG_SIZE +import com.owncloud.android.utils.glide.CustomGlideUriLoader +import com.owncloud.android.utils.svg.SVGorImage +import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder +import com.owncloud.android.utils.svg.SvgOrImageDecoder +import java.io.InputStream +import javax.inject.Inject + +class DashboardWidgetUpdater @Inject constructor( + private val context: Context, + private val clientFactory: ClientFactory, + private val accountProvider: CurrentAccountProvider +) { + + fun updateAppWidget( + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + title: String, + iconUrl: String, + addButton: DashboardButton? + ) { + val intent = Intent(context, DashboardWidgetService::class.java).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME)) + } + + val views = RemoteViews(context.packageName, R.layout.dashboard_widget).apply { + setRemoteAdapter(R.id.list, intent) + setEmptyView(R.id.list, R.id.empty_view) + setTextViewText(R.id.title, title) + + setAddButton(addButton, appWidgetId, this) + setPendingReload(this, appWidgetId) + setPendingClick(this) + loadIcon(appWidgetId, iconUrl, this) + } + + appWidgetManager.updateAppWidget(appWidgetId, views) + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list) + } + + private fun setPendingReload(remoteViews: RemoteViews, appWidgetId: Int) { + val intentUpdate = Intent(context, DashboardWidgetProvider::class.java) + intentUpdate.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE + + val idArray = intArrayOf(appWidgetId) + intentUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, idArray) + + remoteViews.setOnClickPendingIntent( + R.id.reload, + PendingIntent.getBroadcast( + context, + appWidgetId, + intentUpdate, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + } + + // clickPI needs to me mutable, as it is re-used. PendingIntent.FLAG_IMMUTABLE requires S (API 31) + @SuppressLint("UnspecifiedImmutableFlag") + private fun setPendingClick(remoteViews: RemoteViews) { + val clickPI = PendingIntent.getActivity( + context, + 0, + Intent(), + PendingIntent.FLAG_UPDATE_CURRENT + ) + + remoteViews.setPendingIntentTemplate(R.id.list, clickPI) + } + + private fun setAddButton(addButton: DashboardButton?, appWidgetId: Int, remoteViews: RemoteViews) { + // create add button + if (addButton == null) { + remoteViews.setViewVisibility(R.id.create, View.GONE) + } else { + remoteViews.setViewVisibility(R.id.create, View.VISIBLE) + remoteViews.setContentDescription(R.id.create, addButton.text) + + val clickIntent = Intent(context, DashboardWidgetProvider::class.java) + clickIntent.action = DashboardWidgetProvider.OPEN_INTENT + clickIntent.data = Uri.parse(addButton.link) + + remoteViews.setOnClickPendingIntent( + R.id.create, + PendingIntent.getBroadcast( + context, + appWidgetId, + clickIntent, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + ) + } + } + + private fun loadIcon(appWidgetId: Int, iconUrl: String, remoteViews: RemoteViews) { + val iconTarget = object : AppWidgetTarget(context, remoteViews, R.id.icon, appWidgetId) { + override fun onResourceReady(resource: Bitmap?, glideAnimation: GlideAnimation?) { + if (resource != null) { + val tintedBitmap = BitmapUtils.tintImage(resource, R.color.black) + super.onResourceReady(tintedBitmap, glideAnimation) + } + } + } + + Glide.with(context) + .using( + CustomGlideUriLoader(accountProvider.user, clientFactory), + InputStream::class.java + ) + .from(Uri::class.java) + .`as`(SVGorImage::class.java) + .transcode(SvgOrImageBitmapTranscoder(SVG_SIZE, SVG_SIZE), Bitmap::class.java) + .sourceEncoder(StreamEncoder()) + .cacheDecoder(FileToStreamDecoder(SvgOrImageDecoder())) + .decoder(SvgOrImageDecoder()) + .diskCacheStrategy(DiskCacheStrategy.SOURCE) + .load(Uri.parse(iconUrl)) + .into(iconTarget) + } +} diff --git a/app/src/main/java/com/nextcloud/client/widget/WidgetConfiguration.kt b/app/src/main/java/com/nextcloud/client/widget/WidgetConfiguration.kt new file mode 100644 index 0000000000..01b5147c63 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/WidgetConfiguration.kt @@ -0,0 +1,37 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import com.nextcloud.android.lib.resources.dashboard.DashboardButton +import com.nextcloud.client.account.User +import com.nextcloud.java.util.Optional + +data class WidgetConfiguration( + val widgetId: String, + val title: String, + val iconUrl: String, + val roundIcon: Boolean, + val user: Optional, + val addButton: DashboardButton?, + val moreButton: DashboardButton? +) diff --git a/app/src/main/java/com/nextcloud/client/widget/WidgetRepository.kt b/app/src/main/java/com/nextcloud/client/widget/WidgetRepository.kt new file mode 100644 index 0000000000..2f52e158b8 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/widget/WidgetRepository.kt @@ -0,0 +1,150 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.widget + +import android.content.SharedPreferences +import com.nextcloud.android.lib.resources.dashboard.DashBoardButtonType +import com.nextcloud.android.lib.resources.dashboard.DashboardButton +import com.nextcloud.android.lib.resources.dashboard.DashboardWidget +import com.nextcloud.client.account.User +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.java.util.Optional +import javax.inject.Inject + +class WidgetRepository @Inject constructor( + private val userAccountManager: UserAccountManager, + val preferences: SharedPreferences +) { + fun saveWidget(widgetId: Int, widget: DashboardWidget, user: User) { + val editor: SharedPreferences.Editor = preferences + .edit() + .putString(PREF__WIDGET_ID + widgetId, widget.id) + .putString(PREF__WIDGET_TITLE + widgetId, widget.title) + .putString(PREF__WIDGET_ICON + widgetId, widget.iconUrl) + .putBoolean(PREF__WIDGET_ROUND_ICON + widgetId, widget.roundIcons) + .putString(PREF__WIDGET_USER + widgetId, user.accountName) + val buttonList = widget.buttons + if (buttonList != null && buttonList.isNotEmpty()) { + for (button in buttonList) { + if (button.type == DashBoardButtonType.NEW) { + editor + .putString(PREF__WIDGET_ADD_BUTTON_TYPE + widgetId, button.type.toString()) + .putString(PREF__WIDGET_ADD_BUTTON_URL + widgetId, button.link) + .putString(PREF__WIDGET_ADD_BUTTON_TEXT + widgetId, button.text) + } + if (button.type == DashBoardButtonType.MORE) { + editor + .putString(PREF__WIDGET_MORE_BUTTON_TYPE + widgetId, button.type.toString()) + .putString(PREF__WIDGET_MORE_BUTTON_URL + widgetId, button.link) + .putString(PREF__WIDGET_MORE_BUTTON_TEXT + widgetId, button.text) + } + } + } + editor.apply() + } + + fun deleteWidget(widgetId: Int) { + preferences + .edit() + .remove(PREF__WIDGET_ID + widgetId) + .remove(PREF__WIDGET_TITLE + widgetId) + .remove(PREF__WIDGET_ICON + widgetId) + .remove(PREF__WIDGET_ROUND_ICON + widgetId) + .remove(PREF__WIDGET_USER + widgetId) + .remove(PREF__WIDGET_ADD_BUTTON_TEXT + widgetId) + .remove(PREF__WIDGET_ADD_BUTTON_URL + widgetId) + .remove(PREF__WIDGET_ADD_BUTTON_TYPE + widgetId) + .remove(PREF__WIDGET_MORE_BUTTON_TEXT + widgetId) + .remove(PREF__WIDGET_MORE_BUTTON_URL + widgetId) + .remove(PREF__WIDGET_MORE_BUTTON_TYPE + widgetId) + .apply() + } + + fun getWidget(widgetId: Int): WidgetConfiguration { + val userOptional: Optional = + userAccountManager.getUser(preferences.getString(PREF__WIDGET_USER + widgetId, "")) + + val addButton = createAddButton(widgetId) + val moreButton = createMoreButton(widgetId) + + return WidgetConfiguration( + preferences.getString(PREF__WIDGET_ID + widgetId, "") ?: "", + preferences.getString(PREF__WIDGET_TITLE + widgetId, "") ?: "", + preferences.getString(PREF__WIDGET_ICON + widgetId, "") ?: "", + preferences.getBoolean(PREF__WIDGET_ROUND_ICON + widgetId, false), + userOptional, + addButton, + moreButton + ) + } + + private fun createAddButton(widgetId: Int): DashboardButton? { + var addButton: DashboardButton? = null + if (preferences.contains(PREF__WIDGET_ADD_BUTTON_TYPE + widgetId)) { + addButton = DashboardButton( + DashBoardButtonType.valueOf( + preferences.getString( + PREF__WIDGET_ADD_BUTTON_TYPE + widgetId, + "" + ) ?: "" + ), + preferences.getString(PREF__WIDGET_ADD_BUTTON_TEXT + widgetId, "") ?: "", + preferences.getString(PREF__WIDGET_ADD_BUTTON_URL + widgetId, "") ?: "" + ) + } + + return addButton + } + + private fun createMoreButton(widgetId: Int): DashboardButton? { + var moreButton: DashboardButton? = null + if (preferences.contains(PREF__WIDGET_MORE_BUTTON_TYPE + widgetId)) { + moreButton = DashboardButton( + DashBoardButtonType.valueOf( + preferences.getString( + PREF__WIDGET_MORE_BUTTON_TYPE + widgetId, + "" + ) ?: "" + ), + preferences.getString(PREF__WIDGET_MORE_BUTTON_TEXT + widgetId, "") ?: "", + preferences.getString(PREF__WIDGET_MORE_BUTTON_URL + widgetId, "") ?: "" + ) + } + + return moreButton + } + + companion object { + const val PREF__WIDGET_TITLE = "widget_title_" + private const val PREF__WIDGET_ID = "widget_id_" + private const val PREF__WIDGET_ICON = "widget_icon_" + private const val PREF__WIDGET_ROUND_ICON = "widget_round_icon_" + private const val PREF__WIDGET_USER = "widget_user_" + private const val PREF__WIDGET_ADD_BUTTON_TEXT = "widget_add_button_text_" + private const val PREF__WIDGET_ADD_BUTTON_URL = "widget_add_button_url_" + private const val PREF__WIDGET_ADD_BUTTON_TYPE = "widget_add_button_type_" + private const val PREF__WIDGET_MORE_BUTTON_TEXT = "widget_more_button_text_" + private const val PREF__WIDGET_MORE_BUTTON_URL = "widget_more_button_url_" + private const val PREF__WIDGET_MORE_BUTTON_TYPE = "widget_more_button_type_" + } +} diff --git a/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt b/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt index 77f91dc9ea..9fb5183e36 100644 --- a/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt @@ -131,6 +131,7 @@ class ChooseAccountDialogFragment : this, false, false, + true, themeColorUtils, themeDrawableUtils ) diff --git a/app/src/main/java/com/owncloud/android/ui/EmptyRecyclerView.java b/app/src/main/java/com/owncloud/android/ui/EmptyRecyclerView.java index f77c9da404..4b90cae5aa 100644 --- a/app/src/main/java/com/owncloud/android/ui/EmptyRecyclerView.java +++ b/app/src/main/java/com/owncloud/android/ui/EmptyRecyclerView.java @@ -81,6 +81,24 @@ public class EmptyRecyclerView extends RecyclerView { initEmptyView(); } + @Override + public void onItemRangeChanged(int positionStart, int itemCount) { + super.onItemRangeChanged(positionStart, itemCount); + initEmptyView(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount, @Nullable Object payload) { + super.onItemRangeChanged(positionStart, itemCount, payload); + initEmptyView(); + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + super.onItemRangeMoved(fromPosition, toPosition, itemCount); + initEmptyView(); + } + @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 526ac55c05..313efc0911 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -769,9 +769,7 @@ public abstract class DrawerActivity extends ToolbarActivity this, firstQuota.getIconUrl(), target, - R.drawable.ic_link, - size, - size); + R.drawable.ic_link); } else { mQuotaTextLink.setVisibility(View.GONE); @@ -884,8 +882,6 @@ public abstract class DrawerActivity extends ToolbarActivity if (mNavigationView != null && getBaseContext().getResources().getBoolean(R.bool.show_external_links)) { mNavigationView.getMenu().removeGroup(R.id.drawer_menu_external_links); - float density = getResources().getDisplayMetrics().density; - final int size = Math.round(24 * density); int greyColor = ContextCompat.getColor(this, R.color.drawer_menu_icon); for (final ExternalLink link : externalLinksProvider.getExternalLink(ExternalLinkType.LINK)) { @@ -911,9 +907,7 @@ public abstract class DrawerActivity extends ToolbarActivity this, link.getIconUrl(), target, - R.drawable.ic_link, - size, - size); + R.drawable.ic_link); } setDrawerMenuItemChecked(mCheckedMenuItem); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java index 63b110baa5..59f6764d7a 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java @@ -155,6 +155,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap this, multipleAccountsSupported, true, + true, themeColorUtils, themeDrawableUtils); @@ -310,6 +311,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap this, multipleAccountsSupported, false, + true, themeColorUtils, themeDrawableUtils); recyclerView.setAdapter(userListAdapter); @@ -364,6 +366,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap this, multipleAccountsSupported, false, + true, themeColorUtils, themeDrawableUtils); recyclerView.setAdapter(userListAdapter); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index 7cf07a8137..be4246003c 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -62,6 +62,7 @@ import android.widget.Toast; import com.google.android.material.button.MaterialButton; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; +import com.nextcloud.client.account.User; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; import com.owncloud.android.MainApp; @@ -80,6 +81,7 @@ import com.owncloud.android.operations.UploadFileOperation; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.adapter.UploaderAdapter; import com.owncloud.android.ui.asynctasks.CopyAndUploadContentUrisTask; +import com.owncloud.android.ui.dialog.AccountChooserInterface; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.MultipleAccountsDialog; @@ -120,7 +122,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog.Builder; import androidx.appcompat.widget.SearchView; import androidx.core.view.MenuItemCompat; -import androidx.core.widget.NestedScrollView; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -131,8 +132,8 @@ import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFrag * This can be used to upload things to an ownCloud instance. */ public class ReceiveExternalFilesActivity extends FileActivity - implements OnItemClickListener, View.OnClickListener, CopyAndUploadContentUrisTask.OnCopyTmpFilesTaskListener, - SortingOrderDialogFragment.OnSortingOrderListener, Injectable { + implements OnItemClickListener, View.OnClickListener, CopyAndUploadContentUrisTask.OnCopyTmpFilesTaskListener, + SortingOrderDialogFragment.OnSortingOrderListener, Injectable, AccountChooserInterface { private static final String TAG = ReceiveExternalFilesActivity.class.getSimpleName(); @@ -237,8 +238,9 @@ public class ReceiveExternalFilesActivity extends FileActivity return this; } - public void changeAccount(Account account) { - setAccount(account, false); + @Override + public void onAccountChosen(@NonNull User user) { + setAccount(user.toPlatformAccount(), false); initTargetFolder(); populateDirectoryList(); } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/DashboardWidgetListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/DashboardWidgetListAdapter.kt new file mode 100644 index 0000000000..5e048d36ea --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/adapter/DashboardWidgetListAdapter.kt @@ -0,0 +1,72 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.adapter + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.android.lib.resources.dashboard.DashboardWidget +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.network.ClientFactory +import com.nextcloud.client.widget.DashboardWidgetConfigurationInterface +import com.owncloud.android.databinding.WidgetListItemBinding +import com.owncloud.android.utils.theme.ThemeDrawableUtils + +class DashboardWidgetListAdapter( + val themeDrawableUtils: ThemeDrawableUtils, + val accountManager: UserAccountManager, + val clientFactory: ClientFactory, + val context: Context, + private val dashboardWidgetConfigurationInterface: DashboardWidgetConfigurationInterface +) : + RecyclerView.Adapter() { + private var widgets = emptyList() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return WidgetListItemViewHolder( + WidgetListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false), + themeDrawableUtils, + accountManager, + clientFactory, + context + ) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val widgetListItemViewHolder = holder as WidgetListItemViewHolder + + widgetListItemViewHolder.bind(widgets[position], dashboardWidgetConfigurationInterface) + } + + override fun getItemCount(): Int { + return widgets.size + } + + @SuppressLint("NotifyDataSetChanged") + fun setWidgetList(list: Map?) { + widgets = list?.map { (_, value) -> value }?.sortedBy { it.order } ?: emptyList() + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java index a9abcd3b1b..21ca7d9655 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -19,13 +19,14 @@ package com.owncloud.android.ui.adapter; +import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Typeface; -import android.graphics.drawable.PictureDrawable; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.Spannable; import android.text.SpannableStringBuilder; @@ -147,7 +148,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter requestBuilder = Glide.with(notificationsActivity) + private void downloadIcon(String icon, ImageView itemViewType, Context context) { + GenericRequestBuilder requestBuilder = Glide.with(notificationsActivity) .using(Glide.buildStreamModelLoader(Uri.class, notificationsActivity), InputStream.class) .from(Uri.class) .as(SVG.class) - .transcode(new SvgDrawableTranscoder(), PictureDrawable.class) + .transcode(new SvgDrawableTranscoder(context), Drawable.class) .sourceEncoder(new StreamEncoder()) .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder())) .decoder(new SvgDecoder()) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java index 4c08d891d8..e484433af7 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java @@ -26,6 +26,7 @@ package com.owncloud.android.ui.adapter; +import android.content.Context; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; @@ -40,7 +41,6 @@ import com.owncloud.android.databinding.AccountActionBinding; import com.owncloud.android.databinding.AccountItemBinding; import com.owncloud.android.lib.common.OwnCloudAccount; import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.ui.activity.BaseActivity; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.theme.ThemeColorUtils; import com.owncloud.android.utils.theme.ThemeDrawableUtils; @@ -59,7 +59,7 @@ public class UserListAdapter extends RecyclerView.Adapter values; private Listener accountListAdapterListener; private final UserAccountManager accountManager; @@ -69,15 +69,17 @@ public class UserListAdapter extends RecyclerView.Adapter values, ClickListener clickListener, boolean showAddAccount, boolean showDotsMenu, + boolean highlightCurrentlyActiveAccount, ThemeColorUtils themeColorUtils, ThemeDrawableUtils themeDrawableUtils) { this.context = context; @@ -92,6 +94,7 @@ public class UserListAdapter extends RecyclerView.Adapter. + */ + +package com.owncloud.android.ui.adapter + +import android.content.Context +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.request.animation.GlideAnimation +import com.bumptech.glide.request.target.SimpleTarget +import com.nextcloud.android.lib.resources.dashboard.DashboardWidget +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.network.ClientFactory +import com.nextcloud.client.widget.DashboardWidgetConfigurationInterface +import com.owncloud.android.R +import com.owncloud.android.databinding.WidgetListItemBinding +import com.owncloud.android.utils.DisplayUtils +import com.owncloud.android.utils.theme.ThemeDrawableUtils + +class WidgetListItemViewHolder( + val binding: WidgetListItemBinding, + val themeDrawableUtils: ThemeDrawableUtils, + val accountManager: UserAccountManager, + val clientFactory: ClientFactory, + val context: Context +) : + RecyclerView.ViewHolder(binding.root) { + fun bind( + dashboardWidget: DashboardWidget, + dashboardWidgetConfigurationInterface: DashboardWidgetConfigurationInterface + ) { + binding.layout.setOnClickListener { dashboardWidgetConfigurationInterface.onItemClicked(dashboardWidget) } + + val target = object : SimpleTarget() { + override fun onResourceReady(resource: Drawable?, glideAnimation: GlideAnimation?) { + binding.icon.setImageDrawable(resource) + binding.icon.setColorFilter(context.getColor(R.color.dark), PorterDuff.Mode.SRC_ATOP) + } + + override fun onLoadFailed(e: java.lang.Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + binding.icon.setImageDrawable(errorDrawable) + binding.icon.setColorFilter(context.getColor(R.color.dark), PorterDuff.Mode.SRC_ATOP) + } + } + + DisplayUtils.downloadIcon( + accountManager, + clientFactory, + context, + dashboardWidget.iconUrl, + target, + R.drawable.ic_dashboard + ) + binding.name.text = dashboardWidget.title + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/AccountChooserInterface.kt b/app/src/main/java/com/owncloud/android/ui/dialog/AccountChooserInterface.kt new file mode 100644 index 0000000000..f38f37d7a6 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/dialog/AccountChooserInterface.kt @@ -0,0 +1,29 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2022 Tobias Kaminsky + * Copyright (C) 2022 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.owncloud.android.ui.dialog + +import com.nextcloud.client.account.User + +interface AccountChooserInterface { + fun onAccountChosen(user: User) +} diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java b/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java index 109b355198..063cdbfe99 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java @@ -28,6 +28,7 @@ package com.owncloud.android.ui.dialog; import android.app.Activity; import android.app.Dialog; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -39,7 +40,6 @@ import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.owncloud.android.R; import com.owncloud.android.databinding.MultipleAccountsBinding; -import com.owncloud.android.ui.activity.ReceiveExternalFilesActivity; import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.adapter.UserListItem; import com.owncloud.android.utils.theme.ThemeColorUtils; @@ -60,6 +60,7 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable @Inject UserAccountManager accountManager; @Inject ThemeColorUtils themeColorUtils; @Inject ThemeDrawableUtils themeDrawableUtils; + public boolean highlightCurrentlyActiveAccount = true; @NonNull @Override @@ -73,7 +74,7 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable LayoutInflater inflater = activity.getLayoutInflater(); MultipleAccountsBinding binding = MultipleAccountsBinding.inflate(inflater, null, false); - final ReceiveExternalFilesActivity parent = (ReceiveExternalFilesActivity) getActivity(); + final Context parent = getActivity(); AlertDialog.Builder builder = new AlertDialog.Builder(parent); UserListAdapter adapter = new UserListAdapter(parent, @@ -81,6 +82,7 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable getAccountListItems(), this, false, + highlightCurrentlyActiveAccount, false, themeColorUtils, themeDrawableUtils); @@ -125,9 +127,9 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable @Override public void onAccountClicked(User user) { - final ReceiveExternalFilesActivity parentActivity = (ReceiveExternalFilesActivity) getActivity(); + final AccountChooserInterface parentActivity = (AccountChooserInterface) getActivity(); if (parentActivity != null) { - parentActivity.changeAccount(user.toPlatformAccount()); + parentActivity.onAccountChosen(user); } dismiss(); } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt index 7c7de75c2e..d0cb7bb956 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListAdapter.kt @@ -282,9 +282,7 @@ class BackupListAdapter( context, url, target, - R.drawable.ic_user, - imageView.width, - imageView.height + R.drawable.ic_user ) } } diff --git a/app/src/main/java/com/owncloud/android/utils/BitmapUtils.java b/app/src/main/java/com/owncloud/android/utils/BitmapUtils.java index 231d4f5787..70c3debcde 100644 --- a/app/src/main/java/com/owncloud/android/utils/BitmapUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/BitmapUtils.java @@ -27,8 +27,10 @@ import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.widget.ImageView; @@ -47,6 +49,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Locale; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.graphics.drawable.RoundedBitmapDrawable; import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; @@ -429,7 +432,7 @@ public final class BitmapUtils { imageView); } - public static Bitmap createAvatarWithStatus(Bitmap avatar, StatusType statusType, String icon, Context context) { + public static Bitmap createAvatarWithStatus(Bitmap avatar, StatusType statusType, @NonNull String icon, Context context) { float avatarRadius = getResources().getDimension(R.dimen.list_item_avatar_icon_radius); int width = DisplayUtils.convertDpToPixel(2 * avatarRadius, context); @@ -453,6 +456,42 @@ public final class BitmapUtils { return output; } + /** + * Inspired from https://www.demo2s.com/android/android-bitmap-get-a-round-version-of-the-bitmap.html + */ + public static Bitmap roundBitmap(Bitmap bitmap) { + Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); + + final Canvas canvas = new Canvas(output); + + final int color = R.color.white; + final Paint paint = new Paint(); + final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + final RectF rectF = new RectF(rect); + + paint.setAntiAlias(true); + canvas.drawARGB(0, 0, 0, 0); + paint.setColor(getResources().getColor(color, null)); + canvas.drawOval(rectF, paint); + + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + canvas.drawBitmap(bitmap, rect, rect, paint); + + return output; + } + + /** + * from https://stackoverflow.com/a/38249623 + **/ + public static Bitmap tintImage(Bitmap bitmap, int color) { + Paint paint = new Paint(); + paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)); + Bitmap bitmapResult = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmapResult); + canvas.drawBitmap(bitmap, 0, 0, paint); + return bitmapResult; + } + /** * from https://stackoverflow.com/a/12089127 */ diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java index 6d4876e1ef..3b1187f6e2 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -36,7 +36,6 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.drawable.Drawable; -import android.graphics.drawable.PictureDrawable; import android.net.Uri; import android.os.AsyncTask; import android.text.Spannable; @@ -142,6 +141,7 @@ public final class DisplayUtils { public static final String MONTH_YEAR_PATTERN = "MMMM yyyy"; public static final String MONTH_PATTERN = "MMMM"; public static final String YEAR_PATTERN = "yyyy"; + public static final int SVG_SIZE = 512; private static Map mimeType2HumanReadable; @@ -552,13 +552,10 @@ public final class DisplayUtils { Context context, String iconUrl, SimpleTarget imageView, - int placeholder, - int width, - int height) { + int placeholder) { try { - if (iconUrl.endsWith(".svg")) { - downloadSVGIcon(currentAccountProvider, clientFactory, context, iconUrl, imageView, placeholder, width, - height); + if (Uri.parse(iconUrl).getEncodedPath().endsWith(".svg")) { + downloadSVGIcon(currentAccountProvider, clientFactory, context, iconUrl, imageView, placeholder); } else { downloadPNGIcon(context, iconUrl, imageView, placeholder); } @@ -583,17 +580,15 @@ public final class DisplayUtils { Context context, String iconUrl, SimpleTarget imageView, - int placeholder, - int width, - int height) { - GenericRequestBuilder requestBuilder = Glide.with(context) + int placeholder) { + GenericRequestBuilder requestBuilder = Glide.with(context) .using(new CustomGlideUriLoader(currentAccountProvider.getUser(), clientFactory), InputStream.class) .from(Uri.class) .as(SVG.class) - .transcode(new SvgDrawableTranscoder(), PictureDrawable.class) + .transcode(new SvgDrawableTranscoder(context), Drawable.class) .sourceEncoder(new StreamEncoder()) - .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder(height, width))) - .decoder(new SvgDecoder(height, width)) + .cacheDecoder(new FileToStreamDecoder<>(new SvgDecoder())) + .decoder(new SvgDecoder()) .placeholder(placeholder) .error(placeholder) .animate(android.R.anim.fade_in); diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java index 788d314565..e314786264 100644 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java +++ b/app/src/main/java/com/owncloud/android/utils/svg/SvgDecoder.java @@ -25,14 +25,6 @@ import java.io.InputStream; * Decodes an SVG internal representation from an {@link InputStream}. */ public class SvgDecoder implements ResourceDecoder { - private int height = -1; - private int width = -1; - - public SvgDecoder(int height, int width) { - this.height = height; - this.width = width; - } - public SvgDecoder() { // empty constructor } @@ -40,13 +32,9 @@ public class SvgDecoder implements ResourceDecoder { public Resource decode(InputStream source, int w, int h) throws IOException { try { SVG svg = SVG.getFromInputStream(source); - - if (width > 0) { - svg.setDocumentWidth(width); - } - if (height > 0) { - svg.setDocumentHeight(height); - } + svg.setDocumentViewBox(0, 0, svg.getDocumentWidth(), svg.getDocumentHeight()); + svg.setDocumentWidth("100%"); + svg.setDocumentHeight("100%"); svg.setDocumentPreserveAspectRatio(PreserveAspectRatio.LETTERBOX); return new SimpleResource<>(svg); diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java index 38cb2fb06d..77c97b4aac 100644 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java +++ b/app/src/main/java/com/owncloud/android/utils/svg/SvgDrawableTranscoder.java @@ -10,7 +10,12 @@ */ package com.owncloud.android.utils.svg; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Picture; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.graphics.drawable.PictureDrawable; import com.bumptech.glide.load.engine.Resource; @@ -21,13 +26,27 @@ import com.caverock.androidsvg.SVG; /** * Convert the {@link SVG}'s internal representation to an Android-compatible one ({@link Picture}). */ -public class SvgDrawableTranscoder implements ResourceTranscoder { +public class SvgDrawableTranscoder implements ResourceTranscoder { + private final Context context; + + public SvgDrawableTranscoder(Context context) { + this.context = context; + } + @Override - public Resource transcode(Resource toTranscode) { + public Resource transcode(Resource toTranscode) { SVG svg = toTranscode.get(); Picture picture = svg.renderToPicture(); PictureDrawable drawable = new PictureDrawable(picture); - return new SimpleResource(drawable); + + Bitmap returnedBitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), + Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(returnedBitmap); + canvas.drawPicture(drawable.getPicture()); + Drawable d = new BitmapDrawable(context.getResources(), returnedBitmap); + + return new SimpleResource<>(d); } @Override diff --git a/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java b/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java index 12bf2541a8..d7d56fdea5 100644 --- a/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java +++ b/app/src/main/java/com/owncloud/android/utils/svg/SvgSoftwareLayerSetter.java @@ -10,7 +10,7 @@ */ package com.owncloud.android.utils.svg; -import android.graphics.drawable.PictureDrawable; +import android.graphics.drawable.Drawable; import android.os.Build; import android.widget.ImageView; @@ -18,10 +18,10 @@ import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.ImageViewTarget; import com.bumptech.glide.request.target.Target; -public class SvgSoftwareLayerSetter implements RequestListener { +public class SvgSoftwareLayerSetter implements RequestListener { @Override - public boolean onException(Exception e, T model, Target target, boolean isFirstResource) { + public boolean onException(Exception e, T model, Target target, boolean isFirstResource) { ImageView view = ((ImageViewTarget) target).getView(); if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) { view.setLayerType(ImageView.LAYER_TYPE_NONE, null); @@ -30,7 +30,7 @@ public class SvgSoftwareLayerSetter implements RequestListener target, + public boolean onResourceReady(Drawable resource, T model, Target target, boolean isFromMemoryCache, boolean isFirstResource) { ImageView view = ((ImageViewTarget) target).getView(); if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) { diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml new file mode 100644 index 0000000000..834940ea35 --- /dev/null +++ b/app/src/main/res/drawable/ic_check.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_dashboard.xml b/app/src/main/res/drawable/ic_dashboard.xml new file mode 100644 index 0000000000..ddff828159 --- /dev/null +++ b/app/src/main/res/drawable/ic_dashboard.xml @@ -0,0 +1,35 @@ + + + + + diff --git a/app/src/main/res/layout/dashboard_widget.xml b/app/src/main/res/layout/dashboard_widget.xml new file mode 100644 index 0000000000..435a42e206 --- /dev/null +++ b/app/src/main/res/layout/dashboard_widget.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dashboard_widget_configuration_layout.xml b/app/src/main/res/layout/dashboard_widget_configuration_layout.xml new file mode 100644 index 0000000000..47ffc07000 --- /dev/null +++ b/app/src/main/res/layout/dashboard_widget_configuration_layout.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_item.xml b/app/src/main/res/layout/widget_item.xml new file mode 100644 index 0000000000..87c5fd3a4a --- /dev/null +++ b/app/src/main/res/layout/widget_item.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/widget_item_load_more.xml b/app/src/main/res/layout/widget_item_load_more.xml new file mode 100644 index 0000000000..93ed31ae2d --- /dev/null +++ b/app/src/main/res/layout/widget_item_load_more.xml @@ -0,0 +1,37 @@ + + + + + + + + diff --git a/app/src/main/res/layout/widget_list_item.xml b/app/src/main/res/layout/widget_list_item.xml new file mode 100644 index 0000000000..632bf43e10 --- /dev/null +++ b/app/src/main/res/layout/widget_list_item.xml @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 8378ef5bd5..f5d46ac6a7 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,16 +1,16 @@ - - @string/pref_behaviour_entries_keep_file - @string/pref_behaviour_entries_move - @string/pref_behaviour_entries_delete_file - + + @string/pref_behaviour_entries_keep_file + @string/pref_behaviour_entries_move + @string/pref_behaviour_entries_delete_file + - - LOCAL_BEHAVIOUR_FORGET - LOCAL_BEHAVIOUR_MOVE - LOCAL_BEHAVIOUR_DELETE - + + LOCAL_BEHAVIOUR_FORGET + LOCAL_BEHAVIOUR_MOVE + LOCAL_BEHAVIOUR_DELETE + @string/pref_instant_name_collision_policy_entries_always_ask @@ -29,4 +29,9 @@ @string/link_share_view_only @string/link_share_editing + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 20373da3ea..de115bc2ff 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,4 @@ - - + + + + + + + diff --git a/app/src/main/res/xml/dashboard_widget_info.xml b/app/src/main/res/xml/dashboard_widget_info.xml new file mode 100644 index 0000000000..9f74561b9f --- /dev/null +++ b/app/src/main/res/xml/dashboard_widget_info.xml @@ -0,0 +1,32 @@ + + + diff --git a/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java b/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java index 56f356861e..b13d3bf4dc 100644 --- a/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java +++ b/app/src/test/java/com/nextcloud/client/preferences/TestAppPreferences.java @@ -3,7 +3,7 @@ package com.nextcloud.client.preferences; import android.content.Context; import android.content.SharedPreferences; -import com.nextcloud.client.account.CurrentAccountProvider; +import com.nextcloud.client.account.UserAccountManager; import org.junit.Before; import org.junit.Test; @@ -128,7 +128,7 @@ public class TestAppPreferences { private SharedPreferences.Editor editor; @Mock - private CurrentAccountProvider accountProvider; + private UserAccountManager userAccountManager; private AppPreferencesImpl appPreferences; @@ -137,7 +137,7 @@ public class TestAppPreferences { MockitoAnnotations.initMocks(this); when(editor.remove(anyString())).thenReturn(editor); when(sharedPreferences.edit()).thenReturn(editor); - appPreferences = new AppPreferencesImpl(testContext, sharedPreferences, accountProvider); + appPreferences = new AppPreferencesImpl(testContext, sharedPreferences, userAccountManager); } @Test diff --git a/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java b/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java index 79546d1a2c..471b56167c 100644 --- a/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java +++ b/app/src/test/java/com/owncloud/android/ui/adapter/UserListAdapterTest.java @@ -73,6 +73,7 @@ public class UserListAdapterTest { null, true, true, + true, themeColorUtils, themeDrawableUtils); assertEquals(0, userListAdapter.getItemCount()); @@ -93,6 +94,7 @@ public class UserListAdapterTest { null, true, true, + true, themeColorUtils, themeDrawableUtils); @@ -115,6 +117,7 @@ public class UserListAdapterTest { null, true, true, + true, themeColorUtils, themeDrawableUtils); diff --git a/drawable_resources/dashboard.svg b/drawable_resources/dashboard.svg new file mode 100644 index 0000000000..655c57ba3d --- /dev/null +++ b/drawable_resources/dashboard.svg @@ -0,0 +1,15 @@ + + + + + +