From 79151cad6f4093b29283739cc7a51f674bfddeac Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Tue, 16 Jun 2020 12:46:04 +0200 Subject: [PATCH] Screenshot tests without server ActivityIT first one separate annotations to keep track and easier create screenshots Signed-off-by: tobiasKaminsky --- build.gradle | 2 + ...cloud.client.ActivitiesActivityIT_open.png | Bin 0 -> 25025 bytes ...client.ActivitiesActivityIT_openDrawer.png | Bin 22555 -> 24179 bytes scripts/updateScreenshots.sh | 4 +- scripts/updateScreenshotsWithoutServer.sh | 57 ++++++++ src/androidTest/AndroidManifest.xml | 2 + .../client/ActivitiesActivityIT.java | 24 ++-- .../client/FileDisplayActivityIT.java | 4 + .../nextcloud/client/FirstRunActivityIT.java | 2 + .../client/NotificationsActivityIT.java | 2 + .../client/ScreenshotTestRunner.java | 11 ++ .../nextcloud/client/SettingsActivityIT.java | 2 + .../client/SyncedFoldersActivityIT.java | 3 +- .../client/UploadListActivityActivityIT.java | 2 + .../nextcloud/client/etm/EtmActivityTest.kt | 4 + .../android/ActivitiesModuleMock.java | 37 +++++ .../android/LocalActivitiesRepository.java | 133 ++++++++++++++++++ .../java/com/owncloud/android/TestApp.kt | 33 +++++ .../owncloud/android/TestAppComponent.java | 67 +++++++++ .../ui/activity/ManageAccountsActivityIT.java | 3 + .../ui/fragment/OCFileListFragmentIT.kt | 5 + .../preview/PreviewTextFileFragmentTest.java | 3 + .../nextcloud/client/di/ActivitiesModule.java | 38 +++++ .../com/nextcloud/client/di/AppComponent.java | 3 +- .../com/nextcloud/client/di/AppModule.java | 8 +- .../java/com/owncloud/android/MainApp.java | 14 +- .../ui/activities/ActivitiesActivity.java | 6 +- .../ui/activities/ActivitiesContract.java | 3 +- .../ui/activities/ActivitiesPresenter.java | 5 +- .../data/activities/ActivitiesRepository.java | 4 +- .../data/activities/ActivitiesServiceApi.java | 4 +- .../activities/ActivitiesServiceApiImpl.java | 5 +- .../RemoteActivitiesRepository.java | 6 +- .../ui/adapter/ActivityListAdapter.java | 8 +- .../ui/adapter/NotificationListAdapter.java | 1 - .../utils/ScreenshotWithServerTest.java | 37 +++++ .../utils/ScreenshotWithoutServerTest.java | 37 +++++ 37 files changed, 529 insertions(+), 50 deletions(-) create mode 100644 screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_open.png create mode 100755 scripts/updateScreenshotsWithoutServer.sh create mode 100644 src/androidTest/java/com/owncloud/android/ActivitiesModuleMock.java create mode 100644 src/androidTest/java/com/owncloud/android/LocalActivitiesRepository.java create mode 100644 src/androidTest/java/com/owncloud/android/TestApp.kt create mode 100644 src/androidTest/java/com/owncloud/android/TestAppComponent.java create mode 100644 src/main/java/com/nextcloud/client/di/ActivitiesModule.java create mode 100644 src/main/java/com/owncloud/android/utils/ScreenshotWithServerTest.java create mode 100644 src/main/java/com/owncloud/android/utils/ScreenshotWithoutServerTest.java diff --git a/build.gradle b/build.gradle index 708fc12de4a6..c919269c046e 100644 --- a/build.gradle +++ b/build.gradle @@ -368,6 +368,8 @@ dependencies { testImplementation 'org.json:json:20200518' testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" testImplementation "androidx.arch.core:core-testing:2.1.0" + kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion" + kaptTest "com.google.dagger:dagger-compiler:$daggerVersion" // dependencies for instrumented tests // JUnit4 Rules diff --git a/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_open.png b/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_open.png new file mode 100644 index 0000000000000000000000000000000000000000..41fde67158f2df862edce3aa2ec4625722ec8f03 GIT binary patch literal 25025 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≀M;KsLC8iYs8-_2kCE$rw@Ck z;$)HG{HnHHd+54PJr9KKOCjdF?#?!w9)X?#xR zS%%`y`1xA!QcBUqV8dJSIhMrCI@4Lno<<0pc{;`IoO)A+?fmuVXSh!B?E2Al7$d=+ z0U)~{@0dr0g(yMXX*TUb4RLS?oi;h_y6b(MFb;{0G( zde6owRLF04)YjTBej`&wW123LjJG^{MN|6MM*E~RBR zYrAN->AR zLsDI3@rFApm8Vw9S`257KCmBN?n+fqU~y?YQCw|9jBZ^ou4(r=-pR99+%x@_F1mX)8s z*4m}*ben5CD>~8mRfySZ7hU1zSG1Q-f3m{La2lOma5DE>{X8->|DIpxY1hQ5kuEin zpj&>4Ri=6m=pJ@eXr{Ab7iJ|0kK{1p zbjLl}MqM^^2Ns)5+apP9yP%)SQlDaC>0>i5cQAa~e!i9L@-DvzHL0<{*%rl*OksT6 z2Ra9Qv%DYA;oijX$R<}`YYz>f*hcZyqrNi*yX0_Ykx;YC*Di_?!wb^q1RuaLyMn&@ zp0r!OVcGcgXG|yc-L>r)svjDquhLEamaBXPPRchYUqSqWU3JPYpm z9eQ2zj?0^f{VGO%EKIijv&+&gquim*?<;4-8y}to;1v4wS9LX_QhcxnKI>MRrmx|; z`$^w-1w6ke{;NmyHx>FP-uNGmzx-RO_Mcb(o5TDkH1j8b``?J{{C{8h???39S4;(h zwuq`IEPMocN3lNrd?Wg|g63xPG<{%|HzOfD&Ip#0K}W=uZ-xLS3*ssFWvVkzsS_c% z!Lln}cm@<4UJtDb-``6Bejb z=kFlv_V@CzK9-<0Z4RIiHCP+>7bj}Go}$)(n{2EH9m~iGsGTTVEM=GvF=9US|v6FYJN7ef`nz> z0{HDM?(iohTPYOwnrN&((bGjEDHbGeux8txC_w|7q933kV<(P>fam`aY-Cs3VrY?Tg6NAkR07m~&CnhNk@dBN&E9Wv8Or^$yACKGQ? zvXEcSD{Th&cm@gFLRqZdfE`gT&$LF|ALdYu<%J?2}GM@6B5NuVL>`dD($QfRAgJwWhaUNDFZoT_|8eFrZRLM3#^ zdDJ0hfTB0@odbCFczP9%{T)JQ5qqD#xt+!B)>=J#z|L)dCrX3+b!?E3xoA}6-=`hE z#rdvCeeAtmO?cl}RzOE8RDXTRt*__ZLZ1MQ34_o|yGApTi0y&U@yOZC=js_>>Rpns ztT`19^fxm)*H?kTxtcSJJH(@Ue-IzR`r4`AdrtwiTM*#33X) zHP^eBV%_CPXwPthF#2lw62M!h%K5j(R$Lji7Uw>ax%7!GLiA)2f?%@L6byW%&b6D@ z{8_#8eHKajMPiYJ4F-CxL);t1Ap`wJX|wh}1<7Gx3Z z!E`gu8l65>1CfGZnpfJ)GL3;(MsQoJ_58cDhJ&w24LgR_(R0AkT)* z8qJKO&|~)?AHmJDB9b|If6SYGu2lb1km66k`5`gb}%xT9*@%2 z|H@3X`mIipg8mH2JeL+Ki7;TZ!o+6#(}ka=4i+SeeXRu&ilzyUA5jQAL49*rkl6)4o#VWs$% zYN?}fxkWKFp!#5|(@lZ>%H11zYiIa`Bh+8?Pu^>6vA;%=7LRifB#xzQmb{jIzOfz% zd0DIdks-T;>Y!*JR`K3Zv9t_;bL)#=Sni6a4aim8y3?$LXmVeUO(fCM5n?okCQr`luV>MWo!6d=zF|&AF)9~ z4eA!IJZI9sy8mUD^?1IsJgzj$KVyA6i-yTXSaEiftXp(Abyq|N)3y9%dwQw~RJGY+ z9;B$vHHk8YbaB7E#heUDV^{MteSfNTD1P$5kFCx0Sfl8S^hnJtk$_231*3c{?ln)` zfr=5gd$|X-RQPFh6C$j zA$>B;w_L6}a!cp1#Mv%Q(PFEfOE#)XlQYlWqNp7woZow+y`j(V`DYfp+a~oL(jZ^o z0D)ORMn8^fXG`e1@t`o{x5m(@zK=8p8(tsreiBFqUFA4oU^K0rygAeJK4ZnxP*#N^ ziHDcn^n}vWXj0z3(i1Ht5>2Ae53_eQxjBhu`=IHDN=0X?tb*C{53(B-&b&jMq9BB& zs0w+mjO>XF3DcHf(Q0ngk`=;*8jRs>CfWSGD$gR@gwd5BDe8svdtq!#gXxbg-p#zT zFL+A8s)6ljnB^?wT{k7x;*-9+6!Jh)x7OV)vWmt#UusQfJxrcJcun(jwW*3N z;&ep`QaouFu@o~r??Df|sDaDL+0(kfk$|}{PA00Cb-ZG$K!K3$KS9(($>&j6)gDLN z49VPzY}tWFh5kB$Nc3aQGy9Vvwu>BxILfX94YXtEuDOQ-Vl%DT9$|#(Egf!p>DuAN zMKJ>tr0PA_FO`)nGn3wNX*$KDsZ^G?dWEW~zU1-?tr@RR@5!F7Ix?e4eC-S>zgmQ! zpuPHSSZXLM#dH9QyBDoq{B3ene`@L9>6|qzpuQ}O7bfNz| z?`9WivPVs}E}rf-U$YH`7(T=C_WFE6h8h6{;Rvj)v1BBo^ck>YafDf6GJvztfR*vI|* zL{fV?HcJ9ybT@ROO}L*;*`%}KydeMbh34LZFA)2((O$&$-}EEq9Bn#HK%-|=Iz`FR zF(xo_{ZWJqiRIUDeFLq}a-RaT-;rq%pUOxtxqF+95zp%7Y?%s%< zEN*6MIp#gv==e<*DUIxh>g#r9bOr8lZFW%{J9c&=pDcqK&nYm7Wrl~hjYpg~rLCR) z@Lo~tuSm+2`wgLv8)kES;gQHzV8=zh(2W5u8`k!c({5lrPAhT+chnd$VZNoRag~+Z=z8lmk~}=( z*2QiezmBomuryl<`tfptu{oQTXLTiVrGHI(@ket>dDMa8zAWvHj5_MFay5#bm25+Q z^GSO{N~PjjZPCtZnnGo}!hq^)jkbutIjz`xL}Qe}?JjM+-^>4zmD9As1VlsDC!LQo zRqler^p4PXH`2E3VS)_w4G!}4l`@{Q)b;bIuCIX>LSHt9`yOI?Ny^9J)j;h2<>vld zM2{xqf4K=$475Gqg_&b(HNcvOv;L&eJeGbGK~Uwv=P88AK;95T^af}xf@Kf>hr30~ z&O44*3M0|PA33`AH5CXVt4tpIY>&83x^KaYd@SX*5C(;r)5Nun{-TpH=pcwn7>{&& zOrIbi4*R#BgN$aB5u`2087k-&18}=k%8x0@fPP4T12M*iG;u(ti4y7TgB;~#4o?tB z&C16|hb@qEVMKzMY@p5xL8Ap|;f>^u6i6q+OaO4N2oR#fz|@nx1#%HJEi&KAm1EfC znvsSQf<0*e6m&(w4I@m~3Y3${Pq#nx)%jtBASh{))&M9d9jFkJ=CpC5H~{m?GTmvS zdNbE+ebN%-lXO9r8%5Jxz6|Z&9DQI+s$@n%YnT=hBko5NOlfJqn)}D z(t&p1{p=W~$xVWXfdt7m0L8ZP0Qbj4SLoi&kY4pcjLM#L&4eo#`3y@gxG()c%vihY z_Fyg|Y-SDjl#c81$@ABA?lbGmL25pdKHx!V#r^N+j#hGV3&z$4W{`2ZSq$EX5UjjY zxqW0afJt?|jR~c5e?lkWTbv(8ptZ5mC+sUR($`tqC+d$&BmG6=j*Fgt28BDpWUlkXg z+m-CrBjsw0wA_SD0_Ajp-Ab>c9vVPjs$7gDUdh ztFRlm$&x)(K6i)X0$de9J_ zpjJTac&fJ!9GliG;P>F3+yGv9o=Me}TF3&rqF~RV1feEK;I7?yXDEX1$b1hP>qJC? z@d^k1_b(uT-R{@`4*CovNcmiuacy%S(FQB>u^zH}GBGN-3WsJ#itqD=&rMw=VLeSu z!^Q$p&A5$|l?X8h|HFEL+KpyOo5o;^oyG4nFx8@B zPT+3?r=%G+aZ|7AO%}T70McK*ZrZkp(|L>14pdfuG|AMqzf=LD-5@avZzN`|!f1LL z+ONzj_DiGi=Ud<{1Z*RZb}3QZk(|-o-}Ru6>mx{HJqEFH4CgZJ zAWcyD^Of4e^j#!}TV-3XXfX+*WAX0>cxMqvA%kY9aLDJ&=*6#)5a2O*UM#DHr0Z9g z)|1y;8|aE|acU)Ko8C#-_B%*^Afr13#a-aRbG$)0OEtXGcp=>uO7TyPnlh_p2%9<8 zpgk!c>nVFJn&k{8&hbt_=@g8Sc~TZab~EZ3$OytA4A6R2)sqU3fGhJf?7CA=Y0I)7 zeUQ$4|1rblc3Dg*XGe!?&Mm$1(#tVg)kr(6bszbqPXd+GkC+xXyvHh>&Cm7qf`qll zwHgo@@!|uI25$JH>g&qmvKTV=HRV{pBP^QnbFUpwaKJH$pNSND4D@$G2E@_wh(DMP zbQKSEVS3;VK`#c*8h8@xXVbtyhO%mG3J%XnI=n0Ws7KMxZ4K(z`UTQg2ec>#zRCP%me{^R-g^gLfNukCO4w#Ulcwdy#9}^<^85APS{ommBdShLJM?p5ipo zVZUfI<=`z8UL_4a!0IU#=DEe&370NLxm+BvizsbAysof+8;PQTOip0s(Mi7HP$U$Q zRFoDKnW#I?ElD4VnYle*HFCZ=xF&x~$c<<)u_6+BH!R(Z%BY zP8H)%rxI!|7A3^pJBr^GcdNS*!vcPFiz^N4Hofb#N!ppW$e>MSDu=3P zeB0D(f_}YS)_)6P3176!ys78YJ$j{3(0V08KACk6r!%XL`!yXL?w%ykvz^h5CU?(U zvCXl#Zv8IU?nLte(m`NKw`&fi@N8IAKc88xB$CP(ev(~H)==W2pjTL`lqBU|#1S>* zY~jY`d54q#+%Vm)}Ud5e9CuwO5_D8 z6@aCE$C=l?+kL^P^nO(glkmBM#ms&__xUm<6lWtyBIA;p8fx#B#QkocDQ}y!cE7~NDTB1ac}ED05GJ0=TS})gWUEO zc6+idrTP+F_qWuCRnwLC690bs%KsXO_^+UuKfcy~m5==mPyQ=c{u?K)?u5t#LF7j>F^31Emm8IURBf^@-#NZfHSH zK>@c?Zz;_Q4iy3TOT9_aE01$P0w)JY&^%;yA2x)iQ-&2zrhiV4X($9NgkXlJs5nS! zRs3m{hVG>Z*nJ}eOsjS7Hw;)KE1(SE?aum?f+zsm)&RXcgOlqmb4VY0x@M~UAE=Ik z7M>O`^H(0BZ2hPJvMJL|)(fEf;xrNlw$^C3<3StjP!cJgQW`z;+)Op&}^INzK(tq(7@Ebn{_suRVnIUi^ zl)Y7p_Yw=>f(|5aFy8x4!kNtpswtqMigCrCfal5K;1$<3`LLgYftyhXKib0}z2yFw znkoK0Cgi9ZB~-a%6m*&~8EhTA6SX^)61e{>KiZn1cOKGxg2J>p|JG;*;D8-UWHOS$ z;|U5zn(z%a$32EkXW)GXtc9*32`S7}P!J$8nerSCueXr3K88v?njT`7f>>|HMA8bp zKeMw^$l+jy!dZ-MlIyj+ct*(LtO2Bxz1cnDF$oSryRnhn*4_hZNmXRUU>#I z3OSf!26jY02f5~l4foPejr>2hpH?=8d zh1Wxv(%a#V0o~q;HfP(ot>5O@Ryfcvt|ZtLW{?zE?^BGG4GZ)|2=$S%Dy2(vc9FV| zwE!-5ad<5cV{iHM>&wj+S)x(oBpk`>-)aS~s^flZ2JLGXsN-OSuRLQCe*ah6wxw!f zX_;awQ2ztkd(1jFY2^1TR)C!K21RpXAhadUxZmZI0@y?N4bpC3DH!&hfJT-U6FQZ? zWIa`Rh@c(I9$5@K940d2YO(f)#;=*8t26WFOIktu8Uz|Mi8~l1dC4uNg*IyjZoRG) z)X7CzZA>>6ugco>e;na%{Q2#53s4-lii=^3#?E#04ZVenQkQBUQ}%SU$Uc1Mr9q%U zOvA!e-Yaau$yKP39JRBbH6+8DB-&`1S`sRi8Snj^^mrvO&MWoiA<6Ntqb;*pv3o8$ zf0`>Oc95ejx{{L(I-0Gx&h9DPlat z-JZiB3~tTCpzQwbgV#I~QB__>*tW^6E5aPV%F>qRjC`A2NXa6||(&K)}+hYpm#`}Kvv zgouF^bs|SbU3YNA@H1*fr1g-J=S-OEvpd&=1Avg!|nD)00v$1ZIH9NZn=}hgjvG!xleD;2+=OuO%TQRcI)-u*gm!hOl+LhxuW#)*OPt?s?In^L0e7i z%_+1dyU?^%aO)i1JG%mfRa?)sgyHAtriM^Z)mp7}k)qZfYA1l7pv{*cE)9n$%++5> z%l%WWiKMf#=jW7pKeMPQ)2C|K?$@3SEHm21aOnzQqss0qIxMq1BU+pmfYxd#V2SmHx3FAYZ=#f!V~fK!AC1-ZHv8$6DZ32nl1l zDtpoN`i&D`NnDN|DdHEEHD*cAwIr*kjjon>M>0t2>d9B*hn-?Qsh4I;@R-KwksTaf zvl%KKF2%lp4SgBu6sO=5SUZ$W_rhsPFHiYC2w}3XEmlT~H*NE*Iqq)v#x1b8I9Zz| z3y?=apM6Rc6Md9*kE<%9zhyxRjP1P>yhlx<$dMy-B+^M+u|aLhX8MyglxYU;Uw;q` zy5xBOS~%^-zG37xo;^txKx{Rh`XJGcZBpS^o!<8*=RZwl9DUo2&ANYq9(XfpS66p4 z{f6R|b=69``*|A2qrHI)2-*G z66kjkM|sX9kh82ep?%)uLGx4XWl}Pwh*)%yU~`)zy?I^h|8#cc@ldXNd@SeEBE&>tY?V;rSQ<-1A|=MYG`52)Tat{B zZHQ~1aVnBS<`6R0Q95>6r*I;&hmKv@iR}0HcFz5L&L8LA&*$7fz20}`oq3<%^E|)r zHrhOg2M3kja;|n3-}^52~MjvwvI;)5gk6|$fr`a9C9)ueDuQNFt$a*x0T^(349VF`d zon5?J!s*IYd?u&ncLfY{8fSz@xtO5+B|}rb)1*wdf0|*@XyKB!bKXt#aL(%$hgo?& z?&8#1-F-|Vo}b5+ZBU(YX^CS_JD9wWxq{`!{I#u`=hqfM{}M0U*7n8N#@O|FI>P#o ztsm4ZxhMG#O#X}OwMR7`mf93kSUG;&V7Ozf$U{ANT=$~Wn+!D>RHIlE z66}*M?>EYO+Lq#wt&W|nN;0iYoobgGQ@)*QJdrZoRdv#OMkcoF$c5>y&g+H^yCm)4 z({6eP4#bvovK-IOHlAqvA-W5FRP9|b+u+CQ=4<=WX0Q}=;svK?2vdV$%2hN!g4NHZ zsN53qMRxgtQq!`H-q!3vjT1Uft=`g;DnkcveC^0lIjLs(`e8xRejD*Lk&m}aPmhk# zlh=R69kJKXA+4#dtOn8-HYlz2%GtV|RbKvs6Utsb$~1lEvuRC+16leP62@C?TNLM7 zLCSk|JI-Xoa_I@hq^OJ_aF0w(?Qfrz6PG<;a~LN3R~fQ}e6N0paBN&~<{OfWFrKEb z$hnN|ywZrATU0CYUThkUEM!kBoTXp47qDwvkuUf$+n_~->?An}=KH!(JSx$*RCfM> z`XjuHM=NcSM&cabHlZy~>`4eWeQc=e+j}Nnc{bcc)O4U9-Jdm-(~%niCb*5zRezBL z-2fpMk4IpZGI{>BrmDAuKit7T$0f-}*fz4$c8eHKY9IafCQo*RU+9`l6JM^TTU}Pw zthiYYprI<)BM$x8*9gP3Z*>;k?lSScFDUnD*Qm~Cwd!eWpNK)ez$UG#o$eS7;dub` zlx#;=mYof|1YA+nQC^X9;J4#fXw9K-HL-c#aG^idTP~h^Xq6)yM(_lP3mQ2Hy-uPHWD<7yN8qK-lH<{q`T4ak2!! zyqv&^(2WuERJTx~$~QX|Vzv5{18XNF!1suNQ+G4dcJW2-Q?blamyI--xVaqbzDp!k zy2Np7Ul4P%_N@c zgv^EhH5Y7jY=QaUsU9B#{evl$MdPBRwDeVgZ45v;c?EG%WNm?+D;ZHR!B}|A;`ep& zHw3}V1)Amyt_Kk975eBd`zkacS#plePhm9dBciZe0LAG7v4uy-A24kU=13utrN*wV zt|_wingeu4ofH6531zqJkI6Y`Rg=+RXGv?=0&Ul2(AnuC3QOqwY@dk0lfj}Ob5jp2 zzHgbTfWXmR_ZX=;|7C9QoJFTm8Xp>+1+3dsXqpq*HUZ6l2yo^@1Q!2H*ZiOqy#4h( z*kHC5VRHlxbH+dXg_wm%4TSb5=iRH2K#Cb~BG8BkVP*n^Sxap?c$|+x^ujUdzzZ1r zLA7ZB*!gR8VARKjfzmt;Hd06fVECQj0P6(Zs4+BV(h=LxCfZK@>H*lIKJ?F5phdw$ z&{>-h31~L>KE9sQ3aEls%@ty@W+0EP-Rusmn#)07`g1XJ8-~Wl_j^00+SAi}itN(w zuFs$8V4~7XJx6dH7`3wP1-MWjC}Uc$T*k3<@Us<8AMjWs3#m>HA}uBhP6!VVjssF$ zQ(E+m%b|VCdryX`Nv$M{G`ik;S3{{?Ul`dVHCV&zpBYss1#CJSY(3*cv)t1F zWc*q=a6oGQc9Fid6C(I*Wu(YE;}5Okf;OLm;4I@pvs4GuM^E~jxt}9315;~Q^qHRO zOeahtv0J*)?3dQ+Y)9<~9Arm)xJyZo7FyxZhPM#{0Y>(~;NF`reVK_P9Z;Hr%zvjo z|96%Bbv^v4i0-mL8dlIIJWjVDJpeR}Ve8*%VsJhYe1<8AO7ot>EFuXe0P71Mx$@Xf zIpiKZdI9_ku}zNgRGf^>7+`DzqvZ-@RW9(pxe%EXukwUt=k!a@ktfJQvNJFPKcLPg zoYa*bviq0}&^{5=u~{&&eq}JTuiop2&cOTB5roG<^YKj?N|iyL<87+&Td?lkm*7Gw z!LA!|cy&UD{RoT{RhKwdLmXgmZLI9T%+U!WemR`#M)m9~7Oe*RTP_StZlZ^%5tQ&0UD;9OY*rg&QnSw(jyC)tE!9JG}lm#gTH^@iL+5#@&N3a+r z3wsxTd(O*H@@7_#BSBcKDg+;B27s9sCX5gX@q;1N308@bvrHl#oF|N$f*`}DoI_x5 z32MlFBgigrN&6Gnvp&K6ktOpA3{i=~0-y?iqT)NB`ts&bN-#7f#LbzU93_u|@v&w{ z;9e6c{Xos=77WALiojl3Y%I_Z8m5($l&pdzcEZv3(|gG@pwcEp1w6)~Y;(XElBkXw zXa(R&A7j;2sO1Bi$OK9?Od&*|k}N9DHly23{NjCtOgt8J0)^Yr1-td_W@(q-uU#|s z0h%WpY>-*766PS5l=Q7k4&m-C5Qq|N;~7)@JS6^14K~(I(Q%;S+UBO7^#Kd?0I1&| z5sfzyWZF|(&M>FtRm6lMfW(LSGvPz6F#$Slvam(>S8CaZV5&8A&j+#!@+frZaV?iYY33B$luL2Amm zELe1UW}ZKjI!P$)hgoy?`Qk7yV&`*R8f^;RUTrHdq>`9G@$^`!rta*ZbIB#1&ETkSy(^krn$0%i)2SUd`49R=l>qT+47d$){( zh}bUB5pWoNBmiX z!(A`T_K{n5K`o&VNbg14JQ+#JTyJWm<&mhKAk!i44x!;`q6I5@D{EUS zMRBpP0;vN;edav4WHz=eeJL_mPFui!XH6Ra;Fx-F;Gs1reYu5Z^4c;O3(RXm^IsOn zkm8hlQr&!j)EJM}IK^sGw@)H9A#dBoU*{(^<~+kM3kIU$nJMJOxG(GMi++XJn^B~q zg=Cu4jle-bDQkC?8(AfAkx(pZ6m=B|y5Qkf42pS2_Ary7Pqm_E(M#{-%qGE~YQ(I? z`!a{7wdq{rU7~;G4V<14$0zRlI2C2C=MGVFNVy#=B-O*<{V8f?u?Dzcb$+K z4w&S#b@#Y^mtJINeoyH&ClCm8PpO5DG%2Z-J}+VSestcl<(;Uc05v;D=^ItCZ_G{` zS^NDK5nK*q92=b%qiuPKUFVb*T3|#cs^@smO@!$F&=Vi~QY(?){TJ>&x{T0g#=Bv1 z=}=#;kSO2hIS`CUdtTM~p?UL;>DrP!ck0Siy8)2C134TR_jUy254O&4;Hz3{7TDk| z@Z;FxDcHg~t6Ib4)s4%>Inq|IZmo}tD0MdZk1gHJtfxqKG`-!mlybR2*W+qs=AK-r z-3y*iY5dB>x@mu0M)x`BbXGz5FeO5!sn!=MEtU0EV^kX*InFo!E8k`3$Q>(2lc(4s ztSKAYL8&yfdq4NKs1l_~ zW7+#HrzkP%N=s%raBoty#rjdDe#K4I}qH2&d;p=Cv&!QPyBH0y2UGq+iG>Z-QS zQ4^m99lhIPuf`N=_}#09V-|F5aIpjL--6{j!x?`W1TA=yr zYhLbGkXnuT+(pL=nt7!bc6WUGK09PH7zX9zv_HVSSm`(ry literal 0 HcmV?d00001 diff --git a/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png b/screenshots/gplay/debug/com.nextcloud.client.ActivitiesActivityIT_openDrawer.png index 908f1e3aa15e43aae6649bb43acd486400370a5f..18e6f14bfaffce92ea902fa32f7392d1afa1988c 100644 GIT binary patch literal 24179 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 literal 22555 zcmc$`XIxX;x;Gj?L_tJFETF*#Co**Cv52gFpSgJ`_KGXpA*s-__%BTb^8H8^(F= z5BGEPl_o{WN6K?r+`L>uU_?BBpN;JbSdw3uId7|;L)^Lzg}P%cMS3FH?*%8|vSDjwUH@xN~1Ul;!m_xiuS_siY?CWK)X>$mZS*4au>+S0!Vm^JBD2QQmnV%#W5cZs0X65Zed%y#V? zAk3wN+`&Zea;dRhIg6(`*C^u#mx+d#>;~R(SEF?~-|C05pF01lbXJy7xbI5*c9dUq zbjb~Zt>JeS%Kg}VE8}{p8*kKYei)U88;6V2d@3q`u#DI^-Vk6GABIvW`Swhw|Q~sjZ9aeh61ocs^)`Ar_(e{wvo<4kg7H&OCJuuXBa|GAryH23D zQ&a{e`ejCnCY{!51lI#u4mCLD+~%w(Im)82Npv3P4W#BX@}!jqV@9NOS(mx6TafkD)4ls?_rOz@bRFeO zUKP;=1uZVYYxB+W)sH>$v?+F(>RE=*=2mE+6zESfBRp@O8Yn zDO3T4GC0$KVRd~mwERvtV+x&;^5AG?VYZq?=TSZ;UU5y^m=vR8v#}%k#|H?w5nl0$ z=0nTNvX8Ce3=?cyeL5>zHs)#XA6@>om99Utsp(9`0R{S@mr}IFS+`g@_a{YgJw8?}=TRL@cz5`bRlN%N`OCdy-Y#lV(QjlQE9i!D z48H74Z_bI}*m+(kifG~nFSTP+%yEqC@5Nl-3;1cPpo_75X>r)_PoXbk$7Y`^oJSo! zq12*ICM_O%q%f?1RNG9YYtH`0k=meV#jwh5^=C6Td=qR^3VK?P#zY6v5^u}Dnms=& zYki*@^Js8aF~9nk=4Dw$T(sMomsV$q|7E?rv!NRuV`%hHZ`jt6?5#PrAv?xp^{
#`L1pDER)%!BGfyfekzq)aBRkLc7k#~<@WG^*cabkIoqBeeou5&1c98~ zpv#=*d<|Z$zw=;;3%f9m0N#}j}Qjfh=+h?_7E6hSe?f2Nj#1g`e$>yqr{CH6wePuHww* z%Gym7UN+t~?RbGqUMyM3hW9xP=0vHVA$eKDmmi*yf8;io*q@Q56Pkirnb?kbQ)sN# zn{ZRZ##_efz$P>L>lNz!g;uXLqFfz|lxR@w&&TJaosy%N^<&pdEXFi*{61ZNTBpmP zTP3kMNnRGXXC15T+afM9rO1c!^OexE))(F#a{MIhlruMVB>IeRg&LbjcAEGnC`+FC zLQ*e&mQTto)b7-0`t(dPnY8d-u~47)$W`lbB_8+R;dv=0E~klJrhRP(o84==eg@N0 z<-DDwpKLYBeap)lacA%OFh0)NpKIz4Ww$JfdO1;d-YZe<1{65WcCAgfE{<+Q6iLjg z>bF{CJ(DmLc-JHDrF{^H58uk{vwte%QD=3ZT&4@+Rd4HEBe zpKvgB8}e>hnPPJeelXedG^R9Wkl$Xgg!h&7a-a`D5Er@01wW@u#eTmQ;Bji4cunJV z*Cw;E69E)ozbgeQQDsMyrXQ*n>8LP14X(A%MILNndE*ssG;`~%l~}VYgFD9R>o((m2(i`1!o<+3TX}Ni%{3$QWv&Wad`Xq9}IMUwqwDu(~)TU+ip%s-w zHaYinBr1=R3);j7Vi@Pnw6tP~wa(gmIhXC# ztWDWFVs>rkGRE1G%{ECe%E`9$Iklr)m?DkknRx0;(=y9?Hb2tBHNRvZo@dqj4bcaT z4v$hF;@!r?`&iw$TF#{L?eDa?%Sx>e#P%7Qb`5)6u2bCd`1Gu-6}~jcJc}QvNuHaN z06sN*^A{I&D_hAAp6^uuBMQ~FpLss9Kd2JBLEwqfx?p2O^EvsdoBx3J!^3CJ@7_a6 z71_cewZ++*=BC&kJ9gRf3eg7Bx=*jH(TdJK-lomVjgF%{mW}mqQ@``$djRjg*V3Ae zG9ov5Y#J$5tyiZ9c^b!3zZAK?XlhG#-5HrbN2p)ufyGJSK2NpHPUYLXsG>ly)Gf@a$m{R z<8H@^eAkl`-|61JI>+$3r%&&K!7bS&zL;ekmtZ)*j+z!GtD(hlb+GPFEQ#2S0q~ zJz%}`@T{yNKG^b-qgtoux)VY>h%vXD)0FWpETQjGWY?QIYO6=XN|;cYN-=@h_bC;v zQ4uZSZs%MWHXouQpCP!fRw0C0>(2`IxU$lm8j<%=^^*?86bS7mPr)58Jm^(XeSagj zf6>r?Fu?yN4@Ma4e_*Zu?QcG@X}J{}IW3H;+Of8*{__$l=`Rxhf6mPR=j8Z*!ug|Z zjB*{apK=RzPW4sBEA$k4I5C>q(M`J zr1k9pcAo34IUrG%l{D)g`=zYyJbF2yOF`Pc^Nv~N%Q=UQO0?I>tn&&AJr=bQ{WUyg zuNAK>j~7gg)=JZ}KFBzEmYcPvVDvv;=i!=to5PCwDa13BoHpNlduh6V4<8?cX_aBR z(RqKc&PQcMd!j5<1Z&rxeoH^@;#RJE$bK>Uxw1E z)1mU^L6a!QuAJKP)#?749JdJ*+m@u){Z+4zj<~MOk9~G5UaH_Ho0b%Zis58u!+F^l zRC2CL;C2H)X4ceueHHJd9ZeL{Kw8MZsVI;tre)h=CtR`FzDNB?BkS!MX6WC~_lRb) z@q0IH=T{h|jgGjA8)jLxJo9ZzxTc?X_ZHn@d3Jbyb*A1Zh*xTKq?I@izq|9DsL`sW z)HaJB;kV#gbK~B~uXv&*YLt@-Kdx@Pc*P-7!t$ltaH5pt%EE-BS;dPflzv#jk0?3m z>bd%8d0X92Y8j6?`Id8R^sG!CD6f3mYdV|a-B%IRmhWU~OD`@uc;3B1P%Zpsq_kts z9#O-|r>rp0m;w?6GhIens`14PQo;EK#f?=ba=Jtl30E-s>)Uhv^qUvRui9F;QH-KZWr!Ef(zxXNGqG35{B;1>v`~BC+kIDzqENomex#{k3Cp_n_+SN_1)7_w)zShT?xyQbY+op<7{5_rdz~ z>C^fNS9dCYvM69w$RuhKa^T%C>dLWCQ;$6BI@}~c*Pu-zN?K7Xmm=INH&H0jc)#{C zww+|~xq^JH{y6(M6U*lIm5GuG>F+yf1|+wMp4cxFJw*kYZ;T4vGsK%mS0-)Hs0Re^ z7+VVuoy}b61IxbMdG}%`FxLV%4qWT&>P34F9o~4BBYpyt@^)dfRYk#Ll;jDGpcfCy z3NS={lQdhkwabp~EHH+egP4cQ0yu^<$^2a|?MpL*n$xFQ&xibk7g(@?;JZA$d*hd( zO}Vkz4;1R>*-eynSwqkD3p^;)UB15yd}KcSOOpQ?Bmb4DGrRlSw{He^cB$VgE4x~W zSdZ2Rge1F;Oapj0Cj|v7?hhoOQJH!%B0uV*_W!b;1bCJUIVe)-jf%bRrESRs3LI+T_6wQS7|kaHfOdJR9nZ{npvf zVWjr%gO>JduWj**AN6{=nn{aYJu_`ib-pW9O2BBXzJP8KExI{u%vf0^K_g?|h5?=G zg%6b1PmBq2Fp}-Ck5BWGSYbi^%-OUYO0*zy;nI_hG`jjls1&kb}@mj&>mV+l8`0Qzs9sDR% zu0TV5B`#w@`onCBWcqm3w_^qGvhxgkyY&U4R5tWRc_NGYUSub~qAI8+wG57)v&Gr+ zsAbhXTN|`DS8mwzBZ}s0AW(ui8D67s-RjAxB41d;zSAoNM@@s3?@MV_2RpcVSvr(M zRutC8QzsPL341iJSxM?0f7KijS{q_TYZ(=vtZjUrW3}K>^L{cei~OP9W>4)wPc`B? zJ<8Iav5=vE#8HExRrG-8Wp$m<0hnzsrmAx!w#GV(HD*5D%0&M1{F9P$xJF)y9feSt zm6j-fYGYDdAdT9+hW^y+x9&*b*IbkxI7~Y1PkqP#dH7&WAn(z=+`NK#6Sp$nw@)$( z^Y3?kxfGacNmF*!RKAJ#os275`*zP(M>ZIvVfDn@W71!~Xfmd#H6=kxBZ*Q@Rj*yY zIJmGOa8e{vF%0*tD={_}i?;(XM?=5p#4v#|w{mz{5}h%7C! zz@0n02p--?zu|H6aN#a&^cC^1k+>)8xuI<9g-=?KzmcQWUt%)Iz44+|1Z_sM*_$cN zU1n68g6fW(Bs1qQ#uA6MT zdva{=sI2W8FHc6mR?dB`-%}!vezd?>a+^ekg&oXhBM#)2oY$*kSt~x_H5!DewDT>S z@6!0{d2~4Foxte(ic9vY%AxC#tZeoM%3p}u2svsFqCCP(p%wOqjo4rBudx=V;kui= zcC8NdW#kM@Uh+y?$}VVjNqJ4Lw;vg3o-c{qGjrNEXhLL&Jh$t2da&%<+~%-fy4iTC zU6Q5tJzRdIj@6AfTGzrf+!bEmisH51ZaQfe_9L=+z5bJKaq8m14*S;9=j)Vr*V-K$ zU*WmZr*X>-K^Nc?0hd5 zZNSQQ-aNWXcqpjy_E_X2 zvYW&0oaJ68s!3S={D+x}%ZoBm>RXnTPs`Zd%6&GUC`IoI&!%_T)&zS}*8{o2W-jjp zO{FP)daHTPIMr9+X=GWNf_v%u;l;kJOxlYDu9c)d`pmtzZ*5m@%c4uI|NKg5rCn9#QH9=#*T-pN$(WCm z*%gl-^ZPcZU$x3NQB~*dzBm2G{v59@-pZhC{cXeDaKc>@ZE!UA9z(M|eW3d&KeEvh zUa2{JTJBFzz&0qDl%)69zF%+6uZRf#5S%MLAv!?oWeSRv4$o^Q&c0pUzTptSt%!W0R#1zY#3A*7+cqVm&ICzkl$=*u?l5H}}28 z!t1N~pN;aF^GC^injR{>^<&pp)UB55VUk>3OZ} zRgqMg0xbP7u1s-5GBSK=iB zs9_1CW-ASSO-5esE=XiTDG6?O#(B^gAqww$5!mADzd7~UV*SQgl$q5v7%>nf)fLZ>^%L9A%?gi-m zNuhJ1GPPnVzkUTvK5qRV|Jkzc!#i086*6QGW?hI&@3Oqw>NT?1K10X{()#y;7A)?xsIkiJK-1Jjv*-Gd-O@h z!*n-BTkZ5fZA}5P2pqF9vRuXZ->Q z4FjmlkW0gKrg_cuR#w!VIwk6hd5*ne#@MJp?C`hedlx2VepiPamY|E96j}jg&1_3E z5;8RTr1suuee>6^Ul+UmgfS_P-l<2Q?{FP$zZHKu=odFTs_K9r>DdZU(CKQ&4AHVoYQlhK?>mX)?`^C$H;!H%6-)$^kreSTf(w^T%Q5}t_D({DYLz8Z1X zengSjWSVUg$|Iux!=^Q*zs7ZdFYkBAVB^D_^E4kMWq*#z-P z=XB>gb-{o2iGm;31&Z$^C@s^19ZpOyIzX}WhGZpP4r;ym22G;+R;Z0Z=e z{owRmwyEGgW(Xx5c7I`yo2+(}R>n2$r}6NIpStDmGxcq+ewv|_-2LBAfFIWao3(>m zoBi$qV$wuA?6`Ir5OwnqLG?@!ct2QtfRmp!|Grz~MtTg}{OoXZkw}qw%{v8sk_!iq z@SQ}BsOfa<-ja92`53YZ?VT9T2GrTi1Jf+4*ZjInX?LlfAQa})slEjKx(87^{xSa` z&5fQ7s%Wu(g!TPtv&WnVWn1`o5jBQOQZ>M&Fb`jb%LviRjd`X6`F-~-8{j5E0uZ7U zd^+nuCCPivrb8}A)rdYnY}Q>9CcbdjzA51;8%5Y9jf}@UB_3&`u;T+}A26|;x4IIH zw%1M6$i5uJD==d3KHp&(|2U0z`$XZ)OX&k3ItFT-6>N?rCC1=4*5O67JbL-XWP>lP zQIRk`?_Rvicy~uubY4&+C$pNs+aW z0&jUXCP=s>v+e#K_kH=jWpsvP$y(bUG2d3=0)$Tw-A^sHX2*U3$6b17$>*NHPhMFrNW(^g779R8hvbG+D+W<)jd z=;u+OfiG>jjdg}Yyzr;lZ*UUJj2RX!V>esP*SnqSak;BaA63uZ|9w@?dodl`2co0I zA*x`axC@lKIY`k3@=aHY@Nf(>*QPGEVA_+I)3NtFq_#2hs$d@~ky};8i|%mjIXQXx z38ha2lX8cJZTsxw%?Rqcu@6N^*?I;<9!PVN8y_R3U}KlQa%(;kEUqOeDmKcx(OklO zrmKZ|%*k7AMjZCKbUmlc5cShW=pvIJ?^M5$_SWDfBEnE0;yu~MxQLB+kecTaCWcG3 ztdCaMcFN+%KK}ZNmSk?iePA0Bj|HngR?6M{k&Zdg@HMrGDx%fj43&8U13R$E)7aA2#4Y z!kvZnm5G%Dk79mJ&Y+ouZ>#*F_{i|M1G#uP#WYT^ROlyo(Itub0O91+Ml4%b2OD zn_e!1C9Bgl3VX;s%<9iL9FH9@lw#6sr3kOaAZQh1xrKI4Fy`KUT+^Nxp$tPO+%KL~ zrveJ?lApUo>^}7GVUJa-kXdGScfnF70A^LI>370cSv~H|rQM|daHU-oINy$d9=kJb z9YeKKT%9bh?s=zofvnm+@Z)`7*If=>6zYt2j7T`WP_{-4OE zA+8~(8Rd3!uAw!42Opm;jLUxA&Bz8W11w6@OV(+lxY%wi4K>E+I1lS|75fyd zjk}eohMB4T4S)Xe7uOr(E+Ia~)0A23=1(2S1iJWiS8P8pg$!JQs|QPrcKl^`Wb;`9fEj~dzK5URQA9sA{h!$JhIYBdHr;p46L!`sGE6zMnn-DJ z0#qXWq74zS#JAGWnJh#S;5!lkenvo?Y)nXY_y(%?2?Q~9%UbOJEhgAvw7 z#ERQ?WPWsX8*M*b;JuV7YM50ete-l>6xDrpc?qWd+~!A=jfHWVt%Svo^jMX^WpgiN zTWEj%_N`;MIdRPk(>ya+zmSp-_=qOykc?%#mWLCI?xPjF^L&>2!_Y%Qn$fd1#TOoK zK6~>E$`n64)OglqM34Ln=CU0!%iZ$1_|E=V2yHrRbIPte4<^sJ-B?#{?n5@N&PQ9h z3oB!gxvj&5G7xG2Dqu#VxXipNxZA7z7_BN@pgsAR->CKeaMMS5wM*Q;^r9H5H5mEl z{)U|XFq@am;wE^C!5W=yc=@*JY|8hU{u)by&;0v9ANZQFP^?KW!WFvxNDjZNY-@Pn z8A&fp2&qTBjjbeW#rnI9wl@-|!OZl!3FIxo#>k~cb#XCge&_lP!(8o$zdnYUWU_MX zX$M!RNUm7txivp+LmMAr4`OF#Wa+f?Z05wskqWn z?_g!5{wf4UvishmQF;k|L)0MiH>bVR@2Z{r(i2S|pU;hUG@rF=zlqq5_uOy_Z1BD8 zvpCeuJJ@8tO0bkg|&CPA-I`CsZjGFhb4{B1dWZy0mj=8JIHXAS5@U3}$lnuONr2(#4 zn6b;}^4Duagfy*~KU6f%4Ae4itydilPUxD__;9Y5GjNVUH8M8-z;j&d3qq*II$(lxvmpM z3!Od-w80ukJ#H4bj%9+K3_#`Bk@+nwOc?W>SIXuNjCv0F9P4JmuFsaiZd7Tz_J(J> zPyDJugoCNiTquTQ+_C+@xu3LU^$5wS%6VY&bnlrUY`3fij1QHSX3v!GT>J`lm=wL< zkgcdHZ$I?d8Ak6dCL#E6s$^?Tgj^#Te$_>_nLa&LSDt|rmbu6;WY5ni^mhLg`{f5D!Y!foFHP! z(QFjY!&!xQd&`h<-<+tKJ4nFy*t8_|t^h)Ft%Y|w0KxY)25iQ}Tq)S54tTe7#H7Sr z^PHuI7jU$(wFP>vbdP(vh_%%5@%+K)iy?jALq#kB1+sAY_rE>n;va7!;B}8>mpTChUWV--$a(y*H%{YilSFu?3WmY93w0KO7QZ< z!ipfiE?rG|^DuGK98fRKdfV%HH3Pg#xuk#fz9#0yGOtoUW_0^?n2VID| zHn3sevK?r$+I`AA`IP=km0W^fhk=&BGkPveuNuLYDge$+%=?1y^f_5zOC{|$Ot#6P zRFD+c7tP2oc|O5SPwpR19zLPvmY0-5&51aWc>12Yv+6U-M9te1W{{!G-t(+|LJcpl zC|DTlqB`D=N3*E!`4J{gz|PvXrS>-eW0wZ`8~J@Ygbh#D!Saw}sN39Gi;i18Oj)UKs-DZRb2HNwkpIJRxelB=)mV?jMcWU`x|^drB4ftqs>UwimXT1X z-W@ANzILydnoR{w)Z@tz#Ty4fpEA=phD|S-sOk+5fx70m2g4ZV8Det52b!k5+mn*= zaC{-_s>7}*UYwVm9ih&IgQONTsJ(? z%?%8kP0OO}F3Jb~=B@l+iDVEY`Cp^Sm$7Zgxb1|TatugCvZ115Pa#5!hz6epCw9ZW z6lmC39aQWB-K|qp>~G5X0EXtY1{3O)0kgd5Ei`%ryku@xK%B*$tjmC*I@u;AzH9D* zC{&EHW(P1pQLvTPL!-eYu>^IP3&|M${_m=Lx+}8a)oAW0>{vshP5vk;+qQP({RScn z@7h@;sFhzHiq{7}!ntFkGuzf4hE^Mpi%9lg?d>=C&fIwdfARzP={KQ0s8=2=@MvM@vA?k*U@Oa|H>ZK|a#g*XSEG;6E0SM1Plb)KXJ>;R23Qie7SAA`eO_0G;PK zm*TTJRf!~=eCOTM`|F~*!bH019)ky0W}7wB;B8STFrf`V0+$T~v8ygh?hpA+(mqNa ziXX#bmU_zrL$=ZXvQl`w)|Tf~ikOgTB7*v3-I&7QBd)-W8O)8et{o6JE&gC-3en${CQqI%=u-nVFTn9Y&sfgJzWMA4_GIz;$<4 z@@ZGr6&9}ZHxJ6W7CMyh`!2?c;wUY|6_1$##0cP)FTVYaoo?D&79a|y&nHcSL%rfg zVQZ3hIha$uT}g*y`T##`s6L|^m8sy1t@{Ap%6FT?-=4LsJ0N11mE=~f3Fc0;*SHM+ zeEvUfkdrn05jKm7H9>gvu7K*hEI$^u<%RM)vF~=!_^Dc2Ia={%At;4+9y_Ad9Q!;UnKLh@l=#lzu5~)Y;nLei3uzS^MdX z#RnBRJng(}Sf%<1sTy&YW~`1xXX_gOCXYqm-~1bkSDsb=afq**mF?O;vVZ?T-1Qrw z6Je&l!??lx`~B1X5qCcQ3~H;5dK0r^(l=B3C~xw*Y2Po%-{ovUAjI|f-}I;9pqvHf z<=g4`E04l zRg={ezSI}2IKILwVex`T+@#x4FTUD7PN|jP=d-c4P;~fkgdG*c=Eappb6Z|E>aqM| z^z;uhKEI;or95Y?Oh2g(JL`UEL4(kUvAmJQR_ZGfoO}~2mFD1vDd^Q3zT7h;7(Rwp zN5oTFZqM}ou|@~A_^mF;99JY=v*)b|9^FiRbj~M0_v1kibjokKdmpEwThK?_sH_9X zmu@5-A9A>}%UDP6aH4ZqJ`BOcuBkV2`ksF-dF7j_HVf(jJCugH!3aKipN0|;jiWUJ z=yX>o;XzoA)#KNlQdDr9D6w2-)S(bo&)Nv7wN6LKp95I_n_Z*-J&FG}h5D)yKjdAn zc_$hPlktVyCe(w}eM9Us*FprB7O-TKY+&~@B)G9wW*_KI#7^YecU=aEcooWwh)+ZW z%lWRl$JzM6SHQfMh9b<)2>?E51CT{G{?twF9z<(VUx}AbsVOgqOz;(Ar zUiX@jf7&_l|-_jAT)sk?{zQ-{Nxqc2%(rS7#Gr3ydgGtSgPRwQ<}J^ z9W;yHLH&iU=}vz1vdFR?&BcIwFnoRFl8(>n+vswzRo4!Hg0Vp=DBwLBChL4$?am@4 zozDEH*|K0E>Ck=7xd*BwcViL-5+u$vz&$vCxskQ8MA*onnt0VdJkd0N?PQ{D;XPt){w(VzULP6=H{^V}ojb-wN z4SurvtUkxaw zZEcMi%yc|pMWl3nWg)CGLxrhiV{O77?8Ny<`fA1BP5=5UeSL`KKdDhWrR%w!Nxg;d z+}#+wqW9umqt6yWY?PE~2u}=QSEm82yH5VR;CRQbr?3P1TcsOl#DimV$%YPFi^AHh zF2Mt>abZ8W{%MBUnTYN><3m2BOU+WAwiw=*(lY^#t&OFZa^vY>_q0_mV6+uyen`xZ z<xOJ>XBMYC^2Z=`?W;~625;Wfg}?04xn2wz-sIAW+3+?j@t&KG_r>+s-INY~6V z@f*GySX|5S;VmtoydGP8vSp6&H)+jC84`+iFZ0@Y2PBAf=SHmpTTqv6ccE&SSQ`v~ zNUt7p9kw!7xc>w)yBNAFZ+Y9MoEV~kDVb+zJ}!f zu|K|1)5iwPrL`WfiKSW_f8lej;=Xks5YEzp6u3fKFNUq>pWW66+Xwp-VmDPI})Ro zWn^T$A@(75ppmo&+cd;$yZQIG*QUIAdLphS+Tem-ScNSxp?sD7e2*e*d_V4^kkFZ` z@)JLsj{bfVapzsrx~|vi?`Rbp&r{)>*q|WW@*R@ZJEcmR&nkRfXxUcNSeuPgaFng; zqTf0Y-7cUtYhE-_L{^n5kwFGvWFTRd|0`ie%CvtKYX4K-ISW9+e+>_R3hf-K4Cc>; z;v>?Fv;*uaPKC%AvE6OEa?&7ieBlPC+I}1uLY!%UJ6x_eJeKuru>QOtBp&Sz;ypih=HTE}ON?aBU=8Xi> zT+1U5B}NKIG1%n$?<)WTWM-IE8UkM)%cw-FHs|o3c>>`%aNnM3X@qSfW!AwcZNFk@ zo*F@Ho9#%Ch8`R98lg1xnfN}D;1&p+xyG$%lPN+xGNWo)bF9X4^rvug#r< zKoFCx6R@!#;Z@CDjwSYRgQ_m!L=G9lB%=0?AHLL*;oj%s#giFB5PEy&7NpD_YAD%Q z_fiZ5Jr&6824H0J+BWK=YFH<%>?lmW;zAHi=pog2Co>T3Q0mVre+V$qp~!PC6E=gO ztn2j^Y&zrKnC?m=6&7tYHV~Z&s{W#n!ij@kWskP5e`vjW?tkRdql03IMp7ih2I?sE zm^lf*Wpx5!_=eJ6hGpmTwYY>0eXQSn@L#h?&TL!EWu61b$^nPe-BHO#EKGL?0zBw1 zAYx|BktE@j9*;Z-X0F!8_$z^rw@rheI^dKF`8(%=|i?LNL@bz&Mws>(J0$8!cl;l|KuFg?Irz0TsNv_WXG(e%U71tW4%Dmrb7@t`7- z3SA8Fo1=jRRf*%9@A_GU*tQi~m34$@DhyY0B>vQ}-nihhR?5cjo||t$fN*Su;`3Cn zTENXto{T`3nkVjlV$JA3psRH0{Q6>F@mlz4v(?k`{8DgcS#e5srKl-zrrU%Hp(Rx&9xcDR)CmN;?myt(OJ~faF{D6 zfto#ZqWGMQlOW&s6uWpDPAuQPDHE?9kT$j6LU}#INuJ&61kaBge_aa`FFf~_q^kK; z*%E|Tb#?~>67e>2$vQ3CtlGv2?0&!2eYKdG+% z&klb4n{WOSEYg5Yy>Scicock=Ctrg0;$gwvQm}4HXsCY#rkTOXhNI=iirnC$0Rax) zHj}!0gdL_y2+fP|3>QO`HNlwhPWtoCNDdpKKy8 zVp{ASS2@=X9ekwl&3o3)>e92_Tjh}&8u_mz<7wv(gA(5&g67}PPn4n_81WB{#I<2# zV7O>g`J^4X?R~UC>-BMRu_pTKnpZl>B@!&B_O~Z=Q*V~~7q3HzkOuO$ z4P*`88z%ldLI z50bl&(F&;lJaLf?s55n9GwQC{``>yH(`?>;V2C#J?}s_Sv!@c#pa0a&2W*pIT-uMc zB)1`sAPG5v@mIHq$`4+psA+LG%Nl$};W0U7B{?xV6O>06aCmFL$eA_bpN3HI5_J0^ zlj%`vFZB4FZPn;64L$W3p+pFBdwik+$0rQJ&wFGBTHnDgzdR^+epaecEGc!ah}jL+ z2R&PVe&&S_xcfcFwZe+$y&%jnb%Q9ZXN#5;xgU1NyxAr{6DS$Lr6F_fuq=)i978mC z;RR5U4lyF9;$_PgyulR24$?g zzdEGS#B*4nL{Ed0*=3NJ5!=J!(#V3E4B?nPq{c()l_ZJsN(W!&?mOmv#3%;Z3b8IJ zNM(n?d;f$%W`aG`kVNJX6@fUUHGrM`oeKNduvE`ehsCUJZW{b_Zw4-X1D4Ys5ce$7 z;mQ5e;kk|aqAA`mk=M7KpV}5=B$<&4?gF|Pzp+C15iD@n;{^QyQ*2GkT-xco0hW-& zt*P?3om1Bn0bx`Nc_!aB_C8pV<(!C3iDDkwJ46blWHfNI6g>^+?KW4fyyi9~iTHw* z6T1dsTW3WuKVrpZ!-jhFl7E&LPEZ)Jthv@&Ou$Jfq?D9n)p&&bR%+Y_$&gqN^z@TP zkl1a~!O6uQ=CPbjSfOCGbw#mYO3*>MwlM3=E@XByVB6Bb+8(Sl0%8W?BOOLGdPJb% zAEsFsak|Y64&zL1eqgmSPAl+Yxij_aTd`WGFHqp6O)Mzi2p)=+njzCtyIHWu95F?< zlh&>$Qv$GTa+>JBy{*yZ_v@gYnDIX?pJ~C@xCNV&LvN%p1C15mr5X{#j9m(SQAT(H_JwtM;l%XDrF0GzkeZhv&#L!kcb)Nq|g=) z{h+5pd+SiB)jO~hbSANE#2mnXfg?A6pSAxVB^m$sdq9fsmFNX-(fX6cd z*vyg{7;{-Lvb|Wz4vSDDoN{17-7R48fw&Ld0ODm*iMr5ewFJ~T%IY9%39|xNY{Q-! zBRwU~!*9NQ{d%X$NdaOLf)kvnSxkTvlD;wUYRG9n5aJnlU5Y*jl19{|upRC3`?a$S z0sN@;EBrpcxu<{q`jx8W#|-g_7X%qmfDxjYK{z;v)QQyZzb{56)W6acPSmSx7Tkqg z=+qtK$M&a*Yhw$F;~Etrq#egYS85R__n^%EuTYB_UD4(Gl4aezdYaYix}avX9R!H! zAdUp`)iC&62U_a&P+{-yz%O31<8WP#R_En2NA#umWoG2_eG*zBO85CigU*I6(#RBt zDy|=rL=*!f(~7Y@xdFp*YJ3_g8o|{5Q$Q*z3l0um=w(4d^-qj<$wYa#@orb(ms;Wv zdAI+&XhuQ$&=609lODMgxN;h}e8_P?MRLJ7rDnkeI5>W_Ay%b_*Z`rGGymg19in7r z^y%A=f}e{VD;Jru!VMXI`pIFM3nuw|8Had+s(XJufljmx$bK2?BccW2!CZqZdq3z+ z19r$^4Prq9Qk1b|`Kg`9-5448%Sa}vTa^eET)$p=WW zCzyB(#VL9`)ukK!qb?{Oj#(@Xy}UCsp#FqQYzcJcvl< z0~J>fYlFFiv2~BJ?V3%w$djO{u#`}=vA!~2!RL4bzD3@7B7YFg<;gk((CKaAv$4MB z^8&}YD_{^LnH98~a@=}6DhsHA&}3bCk)vid)c6+8Zz9k~hZ;gRR66?n(A(6La&JN` zYmydxK&Aw;2;RVN=NA(m_&sn)||pUiReOOFieNWHyvS`BUa5zpiM%6nik}U8KW{aG^0!UT&X03;@{JdO_(LP$z?v+cWrmmjAlgB91?MI2a@D~fp%C>F-t?O^Tx ziRDkv9l7)jaSDqfjm?%WWT!eTAtkF#QtDaHjXzzpvyQdbvt~#&t~;0Wak6ca^mABU zoPr9N5me5D6r+vdkUpHiDVo;Xa;adqXi~AR(}wHVQF#j|5lN}12(6h%B6~h|-p~5s ziu3Je=29K0mu@3mTZAr0>AaopGSP2#)PKCBOGh%CMv6}^GO;+A`Q!r<%6c)lNLCf~_ zqzPy^2Q4__SB%IFE*ik{OXP_Zx~cDyIbn)aQwfiuu%HN3j_>~H9BR%rQQ(foR(t_Y zi}kyHxN_m^Hs&2S1}ZTzwgZJ?c-?Pe>=Q^7mQ6x4$wNa^lwbUb-L7uB zd}bV#Qp#_sy*Eotq-M*Aj^?<+_=Q)O<4*-`Yq6?nQf4B>w4LFaET;U)nRtGY#1qcY{24j4SdWBoLxl568#6+?0Xyd6D3Oy+6_r-{{iD z>$W{iJ1oGQm9kA;`ZF9WS7r6gD!ErjmuG{%fd0@jGYEup|9={9S9pe?SB01#k9^Uv ztSxgd`4t_I3Ov%$sz<=gfkuI2;@^oMj+_aO-HuYS z;BXFbh0+kWXyh65>v5;JOtHc8YqQP!JvHELMLM`iHPP}b!6QNPfNv#jGWUP~)ZGrn zh}vWblHv#$7ipW8A&U964%oAgqq-E=r??`al8uCj?*NG>1`r<>j+>vUDM^L^>Fk}V z9Z*Pl|0g?27P?pih*y({hSxZf!`bEImCc^_r;$?}gL9B9)4()gL9{J$@Ro&RZv^X?d?S&*D;8q>*2lfzwtsh_lA2q^i75b^uIgWIN4G);E^H5Mb#=945 zUI;F8QWwl%q&o$bnJnngb$zZ^;2U{U2fTZ25Wk)X-;G5kq-l=Vf!z>ZX8o=oM4|%(yZ#tVb5h+g6`Ej+fYEf{S1l@#(gLBSa*IiAa8$=Kol|B41$y~#7G;1??)QE#ophZ@#vTM`gB3NNs+Wx4Q|_L zjd)2G^a*Z&-?2zQe%@__?gF$0_@d=pQ#D;V&O;faXN)8)lPOCz8yO8SO3=L?eRgfCb~&I@(^ABU@jnA&rNL}r0R?uAVBI@CSGINl4NoN zbs2oB?X1gjm!5m$SSJybycaM5DCu3LRJ#6!h3f_^zNna39Y3(5e{(_vMfHV_u+^VF zmr>3SVK^;b4=-J9u{yA$t@zRI zdr5agVT2wtBsq)_pz^Z5hBW;kQ)r91z{2;Jz*}pgOde)&u_o?}iD_}t;*obA(&G97 zm+BBAc>k)$2Ki^DlAW$`vQEMJtgS#LqzihU=Npb9$yg6`NgQ`_XsUuQR@j(U%uWK!VDVgmzg)cK=fnViO^gHNfy$rhb44jP zTpYvTzf;$Bryc3B63N9KI8f>+i#TEBJ2EzSBqexq@@! zf-p8}L6r+nW3$60gP+c{GY6BueLt^Xd#}#Z?tSH1w{77?>H-1+OCIQRcMtKq1@GN+ zuTVZ`#1y-2e?^v$T}EYt(W>#(%vX*N?yKiq*JBAJwnIY`THoBBt%x5P&5-A3v1yeF zE)qWN!B3>`yZHReH(~jgCo1`Bz7E^=LMo*R+P$7QzoU`@=Cg5596s_$_mpuP2^YEN zrU)&x zH6jrq(m)1+0#ze}fkIHB1Y5gl6$7Z~#04*OfD*9n*T?2DN)WTFZ+b+M>a~;yT@`++L}7crXf~}bYsTz|%s0iVgFk7rg>6S^ zTsQ8NRNK%$rF8Z8x??kGA8Sx1^*D(HzfBW1>WoXXNT088l_i@^(AV5kR~iPtu#-HV zq)?5wTeuaYPVsssgJa=p5RPXPCY73%efM35K1&)jzvMm?$5Vkf;|`K1BOLvB z6zaqd_%@<&yhykkvPN3a@q|Ol4_jzzaer?JyfM$QJ`QJA%Y=8~N2x85Nuf#EsuZ{w z!E-ohr$pc53g4>NW7k*?#^p3w9CLyW5EA( zHe@OLw=zlqfaD{97pleu$Im&aF^OS8(_0U>-G!s@#v40kP-OyuLfyDLZebw1I0QPlXzYjF&ZaYra;ZU2ox{oT zyXJM$UO9)bV*Q*Xna)H1L7v?>kq{Sm4yNxakrGSIsKiqgN=;KK|S%v9L#lOlbM^q+D3jS?@C8AZSLZ zpABrwn5-IlSb4rN0B*8ih8$!?pu)cYDA_45O`jQUs~Lf~Qq|Q69;Yt?&s6HZZu5HO z?J!9lJ&TPbR5(aa_nB<;gY0#O-u>|_y{~3HGur@yJshn54kVQy#lK~Wx#*DC)DW4M z26=*#SE~vyw%hZ`LhC_+XyK+amK->n-?uMyr^02LYS`7wRE7ydqoWx471{YPJK!q%lem5!i@{QyZUcu^7D@%GEjM?kXZx#UFe@GVN#V7cC%y^Dnfs z-&Fdihe_wA09-#1k{Qv2)NK_ABn9Gk$v9uBUNT+65`$ka^ALmHnAlyP)) zUPZ7535aUk1%qibOY;kcV{JSGc?R8ZHn*b9l<@IaEJBQg9}sn|w)ROGDfDup-5bb* nvFwB^Z|;)+t;ihTFiP2wE9-4Zm%W65Mr_|28QQRU&xt<)&^R=c diff --git a/scripts/updateScreenshots.sh b/scripts/updateScreenshots.sh index cb261bc626bd..001a6f9396f7 100755 --- a/scripts/updateScreenshots.sh +++ b/scripts/updateScreenshots.sh @@ -74,7 +74,7 @@ sed -i s'#false#true#'g ## update/create all screenshots #./gradlew gplayDebugExecuteScreenshotTests -Precord \ -#-Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotTest +#-Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotOnServerTest ## update screenshots in a class #./gradlew gplayDebugExecuteScreenshotTests \ @@ -94,7 +94,7 @@ until [ $resultCode -eq 0 ] || [ $retryCount -gt 2 ] do # test all screenshots ./gradlew gplayDebugExecuteScreenshotTests \ - -Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotTest + -Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotOnServerTest resultCode=$? ((retryCount++)) diff --git a/scripts/updateScreenshotsWithoutServer.sh b/scripts/updateScreenshotsWithoutServer.sh new file mode 100755 index 000000000000..2eb539b9792e --- /dev/null +++ b/scripts/updateScreenshotsWithoutServer.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash + +## emulator +if [[ ! $(emulator -list-avds | grep uiComparison -c) -eq 0 ]]; then + avdmanager delete avd -n uiComparison + (sleep 5; echo "no") | avdmanager create avd -n uiComparison -c 100M -k "system-images;android-27;google_apis;x86" --abi "google_apis/x86" +fi + +if [ "$1" == "debug" ]; then + emulator -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 1>/dev/null & +else + emulator -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 1>/dev/null & +fi +PID=$! + +scripts/wait_for_emulator.sh + +sed -i s'#false#true#'g src/main/res/values/setup.xml + +## update/create all screenshots +#./gradlew gplayDebugExecuteScreenshotTests -Precord \ +#-Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotWithoutServerTest + +## update screenshots in a class +#./gradlew gplayDebugExecuteScreenshotTests \ +#-Precord \ +#-Pandroid.testInstrumentationRunnerArguments.class=\ +#com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest + +## update single screenshot within a class +#./gradlew gplayDebugExecuteScreenshotTests \ +#-Precord \ +#-Pandroid.testInstrumentationRunnerArguments.class=\ +#com.nextcloud.client.FileDisplayActivityIT#showShares + +resultCode=-1 +retryCount=0 +until [ $resultCode -eq 0 ] || [ $retryCount -gt 2 ] +do + # test all screenshots + ./gradlew gplayDebugRemoveScreenshots + ./gradlew gplayDebugExecuteScreenshotTests \ + -Precord \ + -Pandroid.testInstrumentationRunnerArguments.annotation=com.owncloud.android.utils.ScreenshotWithoutServerTest + +resultCode=$? +((retryCount++)) +done + +sed -i s'#true#false#'g src/main/res/values/setup.xml + +if [ "$1" == "debug" ]; then + exit +fi + +# tidy up +kill "$PID" diff --git a/src/androidTest/AndroidManifest.xml b/src/androidTest/AndroidManifest.xml index f22349d38f21..333f14844f4b 100644 --- a/src/androidTest/AndroidManifest.xml +++ b/src/androidTest/AndroidManifest.xml @@ -31,4 +31,6 @@ android:sharedUserId="${applicationId}.uid"> + + diff --git a/src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java b/src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java index ed2c4495e71a..d7c87058fa51 100644 --- a/src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/ActivitiesActivityIT.java @@ -23,13 +23,13 @@ package com.nextcloud.client; import android.Manifest; -import android.view.View; import com.facebook.testing.screenshot.Screenshot; import com.owncloud.android.AbstractIT; import com.owncloud.android.R; import com.owncloud.android.ui.activities.ActivitiesActivity; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithoutServerTest; import org.junit.Rule; import org.junit.Test; @@ -52,6 +52,18 @@ public class ActivitiesActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithoutServerTest + @ScreenshotTest + public void open() { + ActivitiesActivity sut = activityRule.launchActivity(null); + + shortSleep(); + + Screenshot.snapActivity(sut).record(); + } + + @Test + @ScreenshotWithoutServerTest @ScreenshotTest public void openDrawer() { ActivitiesActivity sut = activityRule.launchActivity(null); @@ -60,15 +72,7 @@ public void openDrawer() { onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); - sut.runOnUiThread(new Runnable() { - @Override - public void run() { - sut.emptyContentContainer.setVisibility(View.VISIBLE); - sut.recyclerView.setVisibility(View.INVISIBLE); - } - }); - - waitForIdleSync(); + shortSleep(); Screenshot.snapActivity(sut).record(); } diff --git a/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java b/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java index 77a73262cd21..d1371cc943d4 100644 --- a/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java @@ -39,6 +39,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.greenrobot.eventbus.EventBus; import org.junit.Assert; @@ -66,6 +67,7 @@ public class FileDisplayActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void open() { Activity sut = activityRule.launchActivity(null); @@ -76,6 +78,7 @@ public void open() { } @Test + @ScreenshotWithServerTest @ScreenshotTest public void drawer() { FileDisplayActivity sut = activityRule.launchActivity(null); @@ -90,6 +93,7 @@ public void drawer() { } @Test + @ScreenshotWithServerTest @ScreenshotTest public void showShares() { assertTrue(new ExistenceCheckRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess()); diff --git a/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java b/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java index c28cc56fa347..6c0821d33383 100644 --- a/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/FirstRunActivityIT.java @@ -29,6 +29,7 @@ import com.nextcloud.client.onboarding.FirstRunActivity; import com.owncloud.android.AbstractIT; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -47,6 +48,7 @@ public class FirstRunActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void open() { Activity sut = activityRule.launchActivity(null); diff --git a/src/androidTest/java/com/nextcloud/client/NotificationsActivityIT.java b/src/androidTest/java/com/nextcloud/client/NotificationsActivityIT.java index f4ba1bc39e8d..b98cae12c26e 100644 --- a/src/androidTest/java/com/nextcloud/client/NotificationsActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/NotificationsActivityIT.java @@ -27,6 +27,7 @@ import com.owncloud.android.AbstractIT; import com.owncloud.android.ui.activity.NotificationsActivity; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -45,6 +46,7 @@ public class NotificationsActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void openDrawer() { super.openDrawer(activityRule); diff --git a/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java b/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java index 1b88f899e1e4..80ea007ec655 100644 --- a/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java +++ b/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java @@ -22,14 +22,25 @@ package com.nextcloud.client; +import android.app.Application; +import android.content.Context; import android.os.Bundle; import com.facebook.testing.screenshot.ScreenshotRunner; +import com.owncloud.android.TestApp; import androidx.test.runner.AndroidJUnitRunner; public class ScreenshotTestRunner extends AndroidJUnitRunner { + @Override + public Application newApplication(ClassLoader cl, String className, Context context) + throws ClassNotFoundException, + IllegalAccessException, + InstantiationException { + return super.newApplication(cl, TestApp.class.getName(), context); + } + @Override public void onCreate(Bundle args) { super.onCreate(args); diff --git a/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.java b/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.java index b850f81339b1..c73ab5d24f7f 100644 --- a/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.java @@ -29,6 +29,7 @@ import com.owncloud.android.AbstractIT; import com.owncloud.android.ui.activity.SettingsActivity; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithoutServerTest; import org.junit.Rule; import org.junit.Test; @@ -47,6 +48,7 @@ public class SettingsActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithoutServerTest @ScreenshotTest public void open() { Activity test = activityRule.launchActivity(null); diff --git a/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java b/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java index 122ee1830a86..a44c074afaa3 100644 --- a/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/SyncedFoldersActivityIT.java @@ -26,7 +26,7 @@ import com.owncloud.android.AbstractIT; import com.owncloud.android.ui.activity.SyncedFoldersActivity; -import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -45,6 +45,7 @@ public class SyncedFoldersActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void openDrawer() { super.openDrawer(activityRule); diff --git a/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java b/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java index 7d210278f353..66975bee10e1 100644 --- a/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/UploadListActivityActivityIT.java @@ -27,6 +27,7 @@ import com.owncloud.android.AbstractIT; import com.owncloud.android.ui.activity.UploadListActivity; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -45,6 +46,7 @@ public class UploadListActivityActivityIT extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void openDrawer() { super.openDrawer(activityRule); diff --git a/src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt b/src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt index 1329768e0cd4..ee486ba532f3 100644 --- a/src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt +++ b/src/androidTest/java/com/nextcloud/client/etm/EtmActivityTest.kt @@ -29,6 +29,7 @@ import com.facebook.testing.screenshot.Screenshot import com.owncloud.android.AbstractIT import com.owncloud.android.lib.resources.status.OwnCloudVersion import com.owncloud.android.utils.ScreenshotTest +import com.owncloud.android.utils.ScreenshotWithServerTest import org.junit.Assume import org.junit.Before import org.junit.Rule @@ -47,6 +48,7 @@ class EtmActivityTest : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun overview() { val sut: Activity = activityRule.launchActivity(null) @@ -57,6 +59,7 @@ class EtmActivityTest : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun preferences() { val sut: EtmActivity = activityRule.launchActivity(null) @@ -67,6 +70,7 @@ class EtmActivityTest : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun accounts() { val sut: EtmActivity = activityRule.launchActivity(null) diff --git a/src/androidTest/java/com/owncloud/android/ActivitiesModuleMock.java b/src/androidTest/java/com/owncloud/android/ActivitiesModuleMock.java new file mode 100644 index 000000000000..97e0a1d61b6f --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ActivitiesModuleMock.java @@ -0,0 +1,37 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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; + +import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository; +import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApi; + +import dagger.Module; +import dagger.Provides; + +@Module +public class ActivitiesModuleMock { + @Provides + ActivitiesRepository activitiesRepository(ActivitiesServiceApi api) { + return new LocalActivitiesRepository(); + } +} diff --git a/src/androidTest/java/com/owncloud/android/LocalActivitiesRepository.java b/src/androidTest/java/com/owncloud/android/LocalActivitiesRepository.java new file mode 100644 index 000000000000..a0ee7be9f349 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/LocalActivitiesRepository.java @@ -0,0 +1,133 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.activities.model.Activity; +import com.owncloud.android.lib.resources.activities.model.RichElement; +import com.owncloud.android.lib.resources.activities.model.RichElementTypeAdapter; +import com.owncloud.android.lib.resources.activities.models.PreviewObject; +import com.owncloud.android.lib.resources.activities.models.PreviewObjectAdapter; +import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.NonNull; + +import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.TAG; + +public class LocalActivitiesRepository implements ActivitiesRepository { + String json = "{\n" + + " \"ocs\": {\n" + + " \"meta\": {\n" + + " \"status\": \"ok\",\n" + + " \"statuscode\": 200,\n" + + " \"message\": \"OK\"\n" + + " },\n" + + " \"data\": [\n" + + " {\n" + + " \"activity_id\": 1114442,\n" + + " \"app\": \"files\",\n" + + " \"type\": \"file_created\",\n" + + " \"user\": \"test\",\n" + + " \"subject\": \"You created IMG_0255.JPG\",\n" + + " \"subject_rich\": [\n" + + " \"You created {file}\",\n" + + " {\n" + + " \"file\": {\n" + + " \"type\": \"file\",\n" + + " \"id\": \"3523820\",\n" + + " \"name\": \"IMG_0255.JPG\",\n" + + " \"path\": \"IMG_0255.JPG\",\n" + + " \"link\": \"https:\\/\\/cloud.server.com\\/f\\/3523820\"\n" + + " }\n" + + " }\n" + + " ],\n" + + " \"message\": \"\",\n" + + " \"message_rich\": [\n" + + " \"\",\n" + + " []\n" + + " ],\n" + + " \"object_type\": \"files\",\n" + + " \"object_id\": 3523820,\n" + + " \"object_name\": \"\\/IMG_0255.JPG\",\n" + + " \"objects\": {\n" + + " \"3523820\": \"\\/IMG_0255.JPG\"\n" + + " },\n" + + " \"link\": \"https:\\/\\/cloud.server.com\\/apps\\/files\\/?dir=\\/\",\n" + + " \"icon\": \"https:\\/\\/cloud.server.com\\/apps\\/files\\/img\\/add-color.svg\",\n" + + " \"datetime\": \"2020-03-19T12:18:25+00:00\",\n" + + " \"previews\": [\n" + + " {\n" + + " \"link\": \"https:\\/\\/cloud.server.com\\/apps\\/files\\/?dir=\\/&scrollto=IMG_0255.JPG\",\n" + + " \"source\": \"https:\\/\\/cloud.server.com\\/core\\/preview.png?file=\\/IMG_0255.JPG&c=b68e0f2668cc89eec0d17e6125ff8ae7&x=150&y=150\",\n" + + " \"mimeType\": \"image\\/jpeg\",\n" + + " \"isMimeTypeIcon\": false,\n" + + " \"fileId\": 3523820,\n" + + " \"view\": \"files\"\n" + + " }\n" + + " ]\n" + + " }]}}"; + + @Override + public void getActivities(int lastGiven, @NonNull LoadActivitiesCallback callback) { + + ArrayList activities = parseResult(json); + + callback.onActivitiesLoaded(activities, 1); + } + + protected ArrayList parseResult(String response) { + if (response == null || response.isEmpty()) { + return new ArrayList<>(); + } + + try { + JsonParser jsonParser = new JsonParser(); + JsonObject jo = (JsonObject) jsonParser.parse(response); + JsonArray jsonDataArray = jo.getAsJsonObject("ocs").getAsJsonArray("data"); + + Gson gson = new GsonBuilder() + .registerTypeAdapter(RichElement.class, new RichElementTypeAdapter()) + .registerTypeAdapter(PreviewObject.class, new PreviewObjectAdapter()) + .create(); + Type listType = new TypeToken>() { + }.getType(); + + return gson.fromJson(jsonDataArray, listType); + + } catch (JsonSyntaxException e) { + Log_OC.e(TAG, "Not a valid json: " + response, e); + return new ArrayList<>(); + } + } +} diff --git a/src/androidTest/java/com/owncloud/android/TestApp.kt b/src/androidTest/java/com/owncloud/android/TestApp.kt new file mode 100644 index 000000000000..a71068ff0910 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/TestApp.kt @@ -0,0 +1,33 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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 + + +class TestApp : MainApp() { + override fun setupDagger() { + DaggerTestAppComponent.builder() + .application(this) + .build() + .inject(this); + } +} diff --git a/src/androidTest/java/com/owncloud/android/TestAppComponent.java b/src/androidTest/java/com/owncloud/android/TestAppComponent.java new file mode 100644 index 000000000000..5b8ef7430c40 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/TestAppComponent.java @@ -0,0 +1,67 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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; + +import android.app.Application; + +import com.nextcloud.client.appinfo.AppInfoModule; +import com.nextcloud.client.device.DeviceModule; +import com.nextcloud.client.di.AppModule; +import com.nextcloud.client.di.ViewModelModule; +import com.nextcloud.client.jobs.JobsModule; +import com.nextcloud.client.network.NetworkModule; +import com.nextcloud.client.onboarding.OnboardingModule; +import com.nextcloud.client.preferences.PreferencesModule; + +import javax.inject.Singleton; + +import dagger.BindsInstance; +import dagger.Component; +import dagger.android.support.AndroidSupportInjectionModule; + +@Singleton +@Component(modules = { + AndroidSupportInjectionModule.class, + AppModule.class, + PreferencesModule.class, + AppInfoModule.class, + NetworkModule.class, + DeviceModule.class, + OnboardingModule.class, + ViewModelModule.class, + JobsModule.class, + ActivitiesModuleMock.class +}) + +public interface TestAppComponent { + + void inject(TestApp app); + + @Component.Builder + interface Builder { + @BindsInstance + Builder application(Application application); + + TestAppComponent build(); + } +} diff --git a/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java b/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java index 0169fee46773..7567fd35474b 100644 --- a/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java +++ b/src/androidTest/java/com/owncloud/android/ui/activity/ManageAccountsActivityIT.java @@ -28,6 +28,7 @@ import com.nextcloud.client.account.User; import com.owncloud.android.AbstractIT; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -41,6 +42,7 @@ public class ManageAccountsActivityIT extends AbstractIT { false); @Test + @ScreenshotWithServerTest @ScreenshotTest public void open() { Activity sut = activityRule.launchActivity(null); @@ -51,6 +53,7 @@ public void open() { } @Test + @ScreenshotWithServerTest @ScreenshotTest public void userInfoDetail() { ManageAccountsActivity sut = activityRule.launchActivity(null); diff --git a/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt index f9d966e124df..4810c990853b 100644 --- a/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt +++ b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt @@ -50,6 +50,7 @@ import com.owncloud.android.operations.UploadFileOperation import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.utils.FileStorageUtils import com.owncloud.android.utils.ScreenshotTest +import com.owncloud.android.utils.ScreenshotWithServerTest import junit.framework.TestCase import org.junit.Assert.assertTrue import org.junit.Rule @@ -89,6 +90,7 @@ class OCFileListFragmentIT : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun showRichWorkspace() { assertTrue(CreateFolderOperation("/test/", account, targetContext).execute(client, storageManager).isSuccess) @@ -167,6 +169,7 @@ class OCFileListFragmentIT : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun createAndShowShareToUser() { val path = "/shareToAdmin/" @@ -192,6 +195,7 @@ class OCFileListFragmentIT : AbstractIT() { } @Test + @ScreenshotWithServerTest @ScreenshotTest fun createAndShowShareToGroup() { val path = "/shareToGroup/" @@ -249,6 +253,7 @@ class OCFileListFragmentIT : AbstractIT() { // } @Test + @ScreenshotWithServerTest @ScreenshotTest fun createAndShowShareViaLink() { val path = "/shareViaLink/" diff --git a/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java b/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java index 694ea3f53545..78430ad35224 100644 --- a/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java +++ b/src/androidTest/java/com/owncloud/android/ui/preview/PreviewTextFileFragmentTest.java @@ -31,6 +31,7 @@ import com.owncloud.android.utils.FileStorageUtils; import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.ScreenshotTest; +import com.owncloud.android.utils.ScreenshotWithServerTest; import org.junit.Rule; import org.junit.Test; @@ -51,6 +52,7 @@ public class PreviewTextFileFragmentTest extends AbstractIT { Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test + @ScreenshotWithServerTest @ScreenshotTest public void displaySimpleTextFile() { FileDisplayActivity sut = activityRule.launchActivity(null); @@ -69,6 +71,7 @@ public void displaySimpleTextFile() { } @Test + @ScreenshotWithServerTest @ScreenshotTest public void displayJavaSnippetFile() throws IOException { FileDisplayActivity sut = activityRule.launchActivity(null); diff --git a/src/main/java/com/nextcloud/client/di/ActivitiesModule.java b/src/main/java/com/nextcloud/client/di/ActivitiesModule.java new file mode 100644 index 000000000000..13b40797f199 --- /dev/null +++ b/src/main/java/com/nextcloud/client/di/ActivitiesModule.java @@ -0,0 +1,38 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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.di; + +import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository; +import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApi; +import com.owncloud.android.ui.activities.data.activities.RemoteActivitiesRepository; + +import dagger.Module; +import dagger.Provides; + +@Module +public class ActivitiesModule { + @Provides + ActivitiesRepository activitiesRepository(ActivitiesServiceApi api) { + return new RemoteActivitiesRepository(api); + } +} diff --git a/src/main/java/com/nextcloud/client/di/AppComponent.java b/src/main/java/com/nextcloud/client/di/AppComponent.java index 9ab3436b88e7..4f7cc047773e 100644 --- a/src/main/java/com/nextcloud/client/di/AppComponent.java +++ b/src/main/java/com/nextcloud/client/di/AppComponent.java @@ -45,7 +45,8 @@ DeviceModule.class, OnboardingModule.class, ViewModelModule.class, - JobsModule.class + JobsModule.class, + ActivitiesModule.class }) @Singleton public interface AppComponent { diff --git a/src/main/java/com/nextcloud/client/di/AppModule.java b/src/main/java/com/nextcloud/client/di/AppModule.java index 6d50d1bbe2c1..3f90a0158503 100644 --- a/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/src/main/java/com/nextcloud/client/di/AppModule.java @@ -50,10 +50,8 @@ import com.nextcloud.client.network.ClientFactory; import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.UploadsStorageManager; -import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository; import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApi; import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApiImpl; -import com.owncloud.android.ui.activities.data.activities.RemoteActivitiesRepository; import com.owncloud.android.ui.activities.data.files.FilesRepository; import com.owncloud.android.ui.activities.data.files.FilesServiceApiImpl; import com.owncloud.android.ui.activities.data.files.RemoteFilesRepository; @@ -68,7 +66,7 @@ import dagger.Provides; @Module(includes = {ComponentsModule.class, VariantComponentsModule.class}) -class AppModule { +public class AppModule { @Provides AccountManager accountManager(Application application) { @@ -109,10 +107,6 @@ ActivitiesServiceApi activitiesServiceApi(UserAccountManager accountManager) { return new ActivitiesServiceApiImpl(accountManager); } - @Provides - ActivitiesRepository activitiesRepository(ActivitiesServiceApi api) { - return new RemoteActivitiesRepository(api); - } @Provides FilesRepository filesRepository(UserAccountManager accountManager, ClientFactory clientFactory) { diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java index ca92e5980bad..8560e6a53bf1 100644 --- a/src/main/java/com/owncloud/android/MainApp.java +++ b/src/main/java/com/owncloud/android/MainApp.java @@ -98,6 +98,7 @@ import androidx.annotation.RequiresApi; import androidx.annotation.StringRes; +import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.util.Pair; @@ -222,10 +223,7 @@ protected void attachBaseContext(Context base) { super.attachBaseContext(base); initGlobalContext(this); - DaggerAppComponent.builder() - .application(this) - .build() - .inject(this); + setupDagger(); // we don't want to handle crashes occurring inside crash reporter activity/process; // let the platform deal with those @@ -240,6 +238,14 @@ protected void attachBaseContext(Context base) { } } + @VisibleForTesting + public void setupDagger() { + DaggerAppComponent.builder() + .application(this) + .build() + .inject(this); + } + @SuppressFBWarnings("ST") @Override public void onCreate() { diff --git a/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java b/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java index 0bce2c2b5d86..056e25fb725e 100644 --- a/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java +++ b/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java @@ -29,7 +29,6 @@ import android.widget.TextView; import com.nextcloud.client.network.ClientFactory; -import com.nextcloud.common.NextcloudClient; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -52,7 +51,6 @@ import javax.inject.Inject; import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; @@ -233,12 +231,12 @@ public void onActivityClicked(RichObject richObject) { } @Override - public void showActivities(List activities, NextcloudClient client, int lastGiven) { + public void showActivities(List activities, int lastGiven) { boolean clear = false; if (this.lastGiven == UNDEFINED) { clear = true; } - adapter.setActivityItems(activities, client, clear); + adapter.setActivityItems(activities, clear); this.lastGiven = lastGiven; // Hide the recyclerView if list is empty diff --git a/src/main/java/com/owncloud/android/ui/activities/ActivitiesContract.java b/src/main/java/com/owncloud/android/ui/activities/ActivitiesContract.java index 8ab3b55eda37..87c763b95bdd 100644 --- a/src/main/java/com/owncloud/android/ui/activities/ActivitiesContract.java +++ b/src/main/java/com/owncloud/android/ui/activities/ActivitiesContract.java @@ -18,7 +18,6 @@ */ package com.owncloud.android.ui.activities; -import com.nextcloud.common.NextcloudClient; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.activity.BaseActivity; @@ -27,7 +26,7 @@ public interface ActivitiesContract { interface View { - void showActivities(List activities, NextcloudClient client, int lastGiven); + void showActivities(List activities, int lastGiven); void showActivitiesLoadError(String error); void showActivityDetailUI(OCFile ocFile); void showActivityDetailUIIsNull(); diff --git a/src/main/java/com/owncloud/android/ui/activities/ActivitiesPresenter.java b/src/main/java/com/owncloud/android/ui/activities/ActivitiesPresenter.java index bab61e165f0e..89dcbf56c0d5 100644 --- a/src/main/java/com/owncloud/android/ui/activities/ActivitiesPresenter.java +++ b/src/main/java/com/owncloud/android/ui/activities/ActivitiesPresenter.java @@ -19,7 +19,6 @@ package com.owncloud.android.ui.activities; -import com.nextcloud.common.NextcloudClient; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository; import com.owncloud.android.ui.activities.data.files.FilesRepository; @@ -51,11 +50,11 @@ public void loadActivities(int lastGiven) { activitiesView.setProgressIndicatorState(true); activitiesRepository.getActivities(lastGiven, new ActivitiesRepository.LoadActivitiesCallback() { @Override - public void onActivitiesLoaded(List activities, NextcloudClient client, int lastGiven) { + public void onActivitiesLoaded(List activities, int lastGiven) { if (!activityStopped) { activitiesView.setProgressIndicatorState(false); - activitiesView.showActivities(activities, client, lastGiven); + activitiesView.showActivities(activities, lastGiven); } } diff --git a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesRepository.java b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesRepository.java index e8c54e9e74ab..22010888919d 100644 --- a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesRepository.java +++ b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesRepository.java @@ -18,8 +18,6 @@ */ package com.owncloud.android.ui.activities.data.activities; -import com.nextcloud.common.NextcloudClient; - import java.util.List; import androidx.annotation.NonNull; @@ -29,7 +27,7 @@ */ public interface ActivitiesRepository { interface LoadActivitiesCallback { - void onActivitiesLoaded(List activities, NextcloudClient client, int lastGiven); + void onActivitiesLoaded(List activities, int lastGiven); void onActivitiesLoadedError(String error); } diff --git a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApi.java b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApi.java index 419a5c0ba884..49b687b7c6d4 100644 --- a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApi.java +++ b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApi.java @@ -18,7 +18,6 @@ */ package com.owncloud.android.ui.activities.data.activities; -import com.nextcloud.common.NextcloudClient; import com.owncloud.android.lib.resources.activities.model.Activity; import java.util.List; @@ -31,10 +30,9 @@ public interface ActivitiesServiceApi { interface ActivitiesServiceCallback { - void onLoaded(T activities, NextcloudClient client, int lastGiven); + void onLoaded(T activities, int lastGiven); void onError (String error); } void getAllActivities(int lastGiven, ActivitiesServiceApi.ActivitiesServiceCallback> callback); - } diff --git a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java index 0f7e2963d3ec..6e84e37726ea 100644 --- a/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java +++ b/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java @@ -71,7 +71,6 @@ private static class GetActivityListTask extends AsyncTask private Account account; private int lastGiven; private String errorMessage; - private NextcloudClient client; private GetActivityListTask(Account account, int lastGiven, @@ -89,7 +88,7 @@ protected Boolean doInBackground(Void... voids) { OwnCloudAccount ocAccount; try { ocAccount = new OwnCloudAccount(account, context); - client = OwnCloudClientManagerFactory.getDefaultSingleton(). + NextcloudClient client = OwnCloudClientManagerFactory.getDefaultSingleton(). getNextcloudClientFor(ocAccount, MainApp.getAppContext()); GetActivitiesRemoteOperation getRemoteActivitiesOperation; @@ -138,7 +137,7 @@ protected Boolean doInBackground(Void... voids) { protected void onPostExecute(Boolean success) { super.onPostExecute(success); if (success) { - callback.onLoaded(activities, client, lastGiven); + callback.onLoaded(activities, lastGiven); } else { callback.onError(errorMessage); } diff --git a/src/main/java/com/owncloud/android/ui/activities/data/activities/RemoteActivitiesRepository.java b/src/main/java/com/owncloud/android/ui/activities/data/activities/RemoteActivitiesRepository.java index 524c8dbcf730..74488f987209 100644 --- a/src/main/java/com/owncloud/android/ui/activities/data/activities/RemoteActivitiesRepository.java +++ b/src/main/java/com/owncloud/android/ui/activities/data/activities/RemoteActivitiesRepository.java @@ -18,8 +18,6 @@ */ package com.owncloud.android.ui.activities.data.activities; -import com.nextcloud.common.NextcloudClient; - import java.util.List; import androidx.annotation.NonNull; @@ -38,8 +36,8 @@ public void getActivities(int lastGiven, @NonNull LoadActivitiesCallback callbac activitiesServiceApi.getAllActivities(lastGiven, new ActivitiesServiceApi.ActivitiesServiceCallback>() { @Override - public void onLoaded(List activities, NextcloudClient client, int lastGiven) { - callback.onActivitiesLoaded(activities, client, lastGiven); + public void onLoaded(List activities, int lastGiven) { + callback.onActivitiesLoaded(activities, lastGiven); } @Override diff --git a/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java index 67a49a836a0b..15fb25713d69 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java @@ -119,12 +119,16 @@ public ActivityListAdapter( this.storageManager = storageManager; this.capability = capability; this.clientFactory = clientFactory; + try { + this.client = clientFactory.createNextcloudClient(currentAccountProvider.getUser()); + } catch (ClientFactory.CreationException e) { + Log_OC.e(this, "Failed to create client", e); + } px = getThumbnailDimension(); this.isDetailView = isDetailView; } - public void setActivityItems(List activityItems, NextcloudClient client, boolean clear) { - this.client = client; + public void setActivityItems(List activityItems, boolean clear) { String sTime = ""; if (clear) { diff --git a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java index 500a9f775138..44b4457f78fd 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java @@ -20,7 +20,6 @@ package com.owncloud.android.ui.adapter; import android.content.Intent; -import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.PictureDrawable; diff --git a/src/main/java/com/owncloud/android/utils/ScreenshotWithServerTest.java b/src/main/java/com/owncloud/android/utils/ScreenshotWithServerTest.java new file mode 100644 index 000000000000..65636214bf3f --- /dev/null +++ b/src/main/java/com/owncloud/android/utils/ScreenshotWithServerTest.java @@ -0,0 +1,37 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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.utils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotate any screenshot test with this so it is run only when updating/testing screenshots + */ + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ScreenshotWithServerTest { +} diff --git a/src/main/java/com/owncloud/android/utils/ScreenshotWithoutServerTest.java b/src/main/java/com/owncloud/android/utils/ScreenshotWithoutServerTest.java new file mode 100644 index 000000000000..7638b5a73116 --- /dev/null +++ b/src/main/java/com/owncloud/android/utils/ScreenshotWithoutServerTest.java @@ -0,0 +1,37 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 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.utils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotate any screenshot test with this so it is run only when updating/testing screenshots + */ + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ScreenshotWithoutServerTest { +}