From ddcd5ed640fba5765353f1ee7ad3378a041a832e Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 28 Jan 2021 11:48:30 +0100 Subject: [PATCH] Code Cleanup --- Habitica/build.gradle | 2 +- Habitica/res/drawable-hdpi/task_icon_team.png | Bin 0 -> 450 bytes Habitica/res/drawable-hdpi/team_info_icon.png | Bin 0 -> 561 bytes Habitica/res/drawable-mdpi/task_icon_team.png | Bin 0 -> 342 bytes Habitica/res/drawable-mdpi/team_info_icon.png | Bin 0 -> 364 bytes .../res/drawable-xhdpi/task_icon_team.png | Bin 0 -> 543 bytes .../res/drawable-xhdpi/team_info_icon.png | Bin 0 -> 625 bytes .../res/drawable-xxhdpi/task_icon_team.png | Bin 0 -> 783 bytes .../res/drawable-xxhdpi/team_info_icon.png | Bin 0 -> 850 bytes .../res/drawable-xxxhdpi/task_icon_team.png | Bin 0 -> 919 bytes .../res/drawable-xxxhdpi/team_info_icon.png | Bin 0 -> 1222 bytes Habitica/res/layout/task_main_content.xml | 12 ++++ Habitica/res/menu/menu_team_board.xml | 19 +++++ Habitica/res/values/strings.xml | 1 + .../android/habitica/data/UserRepository.kt | 12 ++-- .../data/implementation/UserRepositoryImpl.kt | 65 ++++++++---------- .../android/habitica/models/tasks/Task.kt | 2 +- .../habitica/models/tasks/TaskGroupPlan.kt | 11 +++ .../activities/FixCharacterValuesActivity.kt | 2 +- .../habitica/ui/activities/MainActivity.kt | 9 +-- .../habitica/ui/activities/SetupActivity.kt | 4 +- .../ui/activities/VerifyUsernameActivity.kt | 2 +- .../ui/fragments/AchievementsFragment.kt | 1 - .../habitica/ui/fragments/NewsFragment.kt | 2 +- .../habitica/ui/fragments/StatsFragment.kt | 52 +++++++------- .../AvatarCustomizationFragment.kt | 12 +--- .../customization/AvatarEquipmentFragment.kt | 7 +- .../customization/AvatarOverviewFragment.kt | 4 +- .../equipment/EquipmentOverviewFragment.kt | 4 +- .../EmailNotificationsPreferencesFragment.kt | 2 +- .../preferences/PreferencesFragment.kt | 8 +-- .../preferences/ProfilePreferencesFragment.kt | 6 +- .../PushNotificationsPreferencesFragment.kt | 2 +- .../ui/fragments/setup/AvatarSetupFragment.kt | 4 +- .../fragments/social/InboxOverviewFragment.kt | 2 +- .../fragments/social/QuestDetailFragment.kt | 2 +- .../ui/fragments/social/TavernFragment.kt | 4 -- .../fragments/social/party/PartyFragment.kt | 3 - .../fragments/support/SupportMainFragment.kt | 2 +- .../tasks/TaskRecyclerViewFragment.kt | 18 +++++ .../ui/fragments/tasks/TasksFragment.kt | 13 ++-- .../ui/fragments/tasks/TeamBoardFragment.kt | 20 +++--- .../viewHolders/tasks/BaseTaskViewHolder.kt | 8 +++ .../habitica/ui/viewmodels/BaseViewModel.kt | 2 +- .../habitica/utils/TaskListDeserializer.kt | 14 ++-- 45 files changed, 186 insertions(+), 147 deletions(-) create mode 100644 Habitica/res/drawable-hdpi/task_icon_team.png create mode 100644 Habitica/res/drawable-hdpi/team_info_icon.png create mode 100644 Habitica/res/drawable-mdpi/task_icon_team.png create mode 100644 Habitica/res/drawable-mdpi/team_info_icon.png create mode 100644 Habitica/res/drawable-xhdpi/task_icon_team.png create mode 100644 Habitica/res/drawable-xhdpi/team_info_icon.png create mode 100644 Habitica/res/drawable-xxhdpi/task_icon_team.png create mode 100644 Habitica/res/drawable-xxhdpi/team_info_icon.png create mode 100644 Habitica/res/drawable-xxxhdpi/task_icon_team.png create mode 100644 Habitica/res/drawable-xxxhdpi/team_info_icon.png create mode 100644 Habitica/res/menu/menu_team_board.xml diff --git a/Habitica/build.gradle b/Habitica/build.gradle index aa27cd2c1..e4e3d461a 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -150,7 +150,7 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW" - versionCode 2693 + versionCode 2694 versionName "3.2" } diff --git a/Habitica/res/drawable-hdpi/task_icon_team.png b/Habitica/res/drawable-hdpi/task_icon_team.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8c03e38993c09b7ee00bb91aeb1d76b1f82334 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W?!3HGtkJx+wQjEnx?oJHr&dIz4a$Hg)JkxxA z8MJ_G4hF{dOa>N^5+IfWVg?501&j>LK$;OGwtxvPE3$wY&gKItoY7l<52#GX)5S5w zLU8Y-^IlAWBJIz+q8_-pG`-+;Dbd^_kRz>I+p<9Xg`!i;j$+9UX?cejj(5tg%~Qmj z0v%a&oy2FJ`Vl)<`*LB4*~7;CbMx=Nmvi4cZEOFA+}~X97II2{o_XbXKr6e(p@kQ> zrTIL6(5F9Zg`Gp*PS#h_J2e#8zoaLLE%q|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`*=$c2$B+ol zx6`ftjyUkNnRke?il#U8&C*uzb2!Mm;sKLGiv@$w_XQ7mJYpC$wk>j4)KoY7Lu6F? z-iwn8)%qPLOw_4P`}4!r&*o%`QQt?FTXP+*ovX==6*;Q6IXNSHXO#Bd&A%t4-gI9Z z_C~ECE#UIU&V!A;I}_D8pU5WNyR}2pyKF0i(ej+snbyoHo4=e0ioVJm(5YN{QY84~ ze=!BWzbsWvey2r(xfm*&OI|p?YFgrUD3(o5wdQW*@e|YKtS@dXi<`Yb&TsjJy`_CM zf+lacC$RLfrcU0#nRAQN%lEyqX}zmO%QkWD>p~O06)on9i!)O(JaC+6+jG;h7jKzg zrOutlaP6z2^kc6>TnqZvPvJSLyyB#K%ddG#a~z|LBF~@v6WQX(uD<`B?`da+B`H=; zyWZ8xxHV2>;Bwnxo!}uDfA!dm_MDRa`VQY-6*LP5)G~JMi>YV2@?+~2<^0pE6Mji- z;?MLk|6eMfarM}Xb4ylvuqM4fSa~&Ey_n(XpXnzTf5~86qIXj~;hgS*bN4oNO#1p; gJ9o3p)A~}T``^!;Smi0EAOMOkPgg&ebxsLQ0DdsojsO4v literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/task_icon_team.png b/Habitica/res/drawable-mdpi/task_icon_team.png new file mode 100644 index 0000000000000000000000000000000000000000..cea954d3d3b9c04a7db4ffd55e32d71185ecf0c5 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp@K+MU(1|(lrEz1H@jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(@!FRMqz-txIEF|_ z&b?sI$LJ_>{G;r~kIOH3n7AmrXjTcS+;Lc2-eB9zopD9!;z|>(@PM4dj4t|%4EF6m za>Fy{sp|YQv%f!kJD-zDf6Z3KT^hTLDuqqA|BuX+ThKA_Fps{CVF9z`^Z=fd?elAA zZ|yVWx$>KDqWZxHO#C?s7Y>VxZ<#c?KBcPkK=3J@;+}w`yzV*+?{OJkJ2qo4o7V;P zB}eBbF-NbLe5qu$LP3{Hzc3e@@@2hgMFWAU}D! L`njxgN@xNAk!Nhf literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/team_info_icon.png b/Habitica/res/drawable-mdpi/team_info_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e94b23f70d1b6a059dc08c6fed54e52093ab964 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfUUGsEt4DsN7 z8+?%WkO9w{8_kUsN*^7P8vGbbc)ukq+QcefywFm!uV=Q|!|NUsh3D5kSMj@^yZ9?_ z#|h!f(#i*zOUq+Swp16`N`1=IlIy)!Kd0eNe6&u(DZd%wQ|}frfBI07c*pjhrpu9T zLqiog!}}8-q_G{`8KoeQrWEe|WI02_&VOlnS?70hIR5IEpUF9M?b+)kEA(pH9T#8L zvu_kl{^fPTIjNW7c8P&@$2qCSMg7~N4y?91TGY5Lc7oQ?uStv{FaAwG@q5v=Bt|tW gvkBk%_BsAyvn#RIJELvTa}(rKPgg&ebxsLQ0EFdyVgLXD literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xhdpi/task_icon_team.png b/Habitica/res/drawable-xhdpi/task_icon_team.png new file mode 100644 index 0000000000000000000000000000000000000000..a32a12e9919f840195d5688c5ceafe6c8aa6cda1 GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)k!3HEN^5+DZYV_;xjz{tQ1q!~eC3z!hH3z*?-A&|nFoqtaQm34Z$IEGjV z?wztxpT$w+SiWWXRDp|@QrA5?oJ6*0eN>N84g4_wMCqcCm0P$L39NN$^;oBPF`&St zBgSlF-Tj%JCuiKmF_W|iWaUv_w>m+!I-G6kFD2a3q4kENVJG>VtY_`o0&!stM3BlI_BRAXPydO_lf)cs58FQvh`ZWWw$$PCvT5makKv9LGIJS z*EIL=ENeWrwD3-&bOFz~9W&%B=1x7A!~UYEyO_1_#{OgfO;`jYm~|(l=W@(W@R<5x z@&maY%dA#?|7*mOTENhCOSh@;a*nC%nq7bIh9_V2Q2eX5H(TnZ|HL%j-=;5p{$+*z zo)WkqPx`3jl0CYs|4RAKke%*Z$G^UQ#=k;WAKzJS3)a6gQK(Z}{%h|>e*-bb4P_5~ Q!$Fbb>FVdQ&MBb@0D6Mh=l}o! literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xhdpi/team_info_icon.png b/Habitica/res/drawable-xhdpi/team_info_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a28ae3e66c91596b6f0074400d6fa810cb617d11 GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?oyY1=X7?Q#I zHqzVghyl;r0#+7j3#LarIXgLo)(8qEHLSB_s(yEnamP^x?zZ!+Zd&>oZbiPc)Xp6j zRhe{k$Jx)Hi>=nK&YWeH#R`J|N?3QTvu@K(xb%_f0dtQ3(g1}%&v{*S+dFRr1*$6F zWqZ@-?9E}p_|jNi?3cTY`D68E&t_M5JTp1GpsrJPLCwkMp$?xWv9X=m#JnT7yodFf zQSVcaKO)&w3$#GHvxsL8dx8^^bGnFMXc0^Cn~0n6qCjBEB_fjIB|(R rPRdt&Q2IYfNPGQ(sK%(q|ACG9ocCYO>iEfT4T^40S3j3^P6Od^b!3HG%OHX?Yq!^2X+?^QKos)S9)~H z>M6+4BB1(&@2H!NV)zP<&IpYpz0T+9OuNm^e}8*^H!}4>@$a;IHP81}@BV$S>RzL0 zG^2h0nz;4x3jeiw4unTEKHvBL|I=3{Ce9@>?cN_`;||-*l3n-KkZmWw>4t4S52j>` zJSu;%UG%~9hjY9qTe~gHJkDVC<&@acVwrCxlQP#ol;5=Lj-9L4vJI!_UTO7=C{&$! z!*uP&w|deW?2h^gO@6L+)~%Vv=TAqo&?Qfi4z-!8Bc{29SGWTbZ8}p_fD2!#TKc^;H&%HlBn`^6P z5lfiw#{+*olP`&>U1Qa6Rw=%FZ2rbshwP5-ddRq^J@yBi{sW(wz+W{pSZ`iW>7R0S z66gH>%UfiY|9H5^wJYOOU*QD#H4e*~=SN>^Phe_G6sSs+He1N_I!FHf4lCZjBC_TS z*@}MDGu?FadXZ!=^`cyw)%}6up2j7{lit<-KJ;FA2b1kCt$llT_8+{Z)>yfN@%WZw zH`QJ$={RVAll&OV@t!Al<^!c8Gkw0uowz7&YL$0bK4bdH`8?q*+x~nsnfy28+~+ny ziRQT`sg3`Z_XgVV*J?WV{`EJg-F9zLN400^*FU+xZE8;hBz4&vEKr~RbhC!@U5~Ck zGRs3tythuCkSZM6c6PMrU zaz0%aebQM&z43zHWYN{Hf*TCa31#0}ayDW259ti6jR9#Z#O~BLDDC0g9Ow8Plo&l- L{an^LB{Ts5b^uMJ literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xxhdpi/team_info_icon.png b/Habitica/res/drawable-xxhdpi/team_info_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8145895e4a16110d1cff5b09dafd4c7b4bf6c0fc GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^v49!D1}U6i==Pq0foYGYi(^Oy z2!UIySklIC9I*;fKy7kJ8$* zIX~vin4`M-tL47mf4m==?JF~ysKnCJARxfxBR?pd|Z z*~*RvIn9kdWkLeUXUf(Ub{FbjTJ|;9ai#1XDHl%O)bJ9YeH+*$BY8fG8NYmgR;@wi z1?vQcB7uUE)1oR3GAuH8_r^K?I5KyU-SpB|7p&IhIm}%6>S^2TCb^d+pD&&*kKAR?Jv5XJSbC z(-W8WTv@wu&q1bJPohijwYI-kx~m#?VWZ&#jf0*{U99S!4u%g^*fq@NEMZ{myJb-P zmi1{?kRo@Il=le<#~R0_*{4nUg*=LrmM||ai}>%Gu_^b~^BAsRCYPnPHy&ub&}5u+ zWZ`SGgExETRejsr)MIa5?5p#%j`hTn_`0U_MVAhw-F}y0@aMn0QiII%2nJ3Cc1HK@ zF^(%44=p#yw(EPaQRR*B?Rh4qZMW;X8P*Cn>mIEQeB4&iy;8;T%_j#|86^cT?dh?9 z7wTy`7=A9~I>*y5dF(j1&UHLu@U#U?XdG@2#LrgcE9D>j Q?aTlKp00i_>zopr0P)3K-v9sr literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xxxhdpi/task_icon_team.png b/Habitica/res/drawable-xxxhdpi/task_icon_team.png new file mode 100644 index 0000000000000000000000000000000000000000..ef9b0acf5d93ef822b8edca9fdfd64f4b4aed140 GIT binary patch literal 919 zcmV;I18Dq-P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91G@t_j1ONa40RR91Bme*a06kxNfdBvl0ZBwbR9Fe^m_ct$Q545JRcR0* zl@g&FEh4^xu&@vzNLNbiNr-e)8#@*xcJ&QxG^9&GL{}sd3$?+tY&0U#Ry0vW8NdHa zCwV>d?!0qnrZr?v^2>Yo+;jiu+&lB;-ZyP+Eo-g7zq10RQmG#v!Zdt`3AhPcy|Ym4 z;+RRU(va2z==W;W9Y?ZFFajZ)p<^H~5izG=HY9@oHgx6b)YVUd0*ryj4u_I4_^3yK zm`6|u>D28<{DQL(g-yXmn-pIcd;qVVwHgg+lf4~2daGEB8??#s4@GKdVO*b5yG@qU z-cA3OoEY1^-#Ta?$naHjZKJcdT0prkc0!xW10$|kW3qgClHGX$>W`h!j7QYOWR1!4 znPC;p*$PjFBX&Zs(QpZ;ay?Dmmv5hxZ=Bap#7#J3K7!n)uU!G1mPI$EuJ{L;NJ@fiVc#JRKMFk`Xfq-$EkzAH()M zord(2NGFDKFb=;#HV1b=KkqJ6EZhZ+l}SsQ(su1Vu0%0GBwh_0V#Z{}N<&&%eJx*W z1)6jPYI^ASo_8`IJ@~tz2lV{NHwQWeOhU0xC`@t9HT3k(qZ9Rd_yJ$wJrv;$I`TEv zNZJeM;U4H`*<W2s{w t?c-@*mHQHXuizFs3svG;T}`n9e*hTmvID5koe2N{002ovPDHLkV1o0;h3xKK$j;w+<3{DQt@?AD8i&!oyEB>qZX=hLj3uKf@v{lkP7?@0_-e-)}JcWmI=8`C{ij#U z>#~~(OfCFa-JrIw#ZYR(O;sreW+UMfbLLeu@SgBdD6V?PXrf@;c;@Bz^mFoa+jcJ%*pbzFiUi!>>%nh1L!~ZUXvx;}S#ga)U+svLK#7%<=aW~P+h3$#2(iTFIpWOv?L2s{Fiz9^5d$QX`U6cl?@Mw!?|^ zL&Y0itzzm0Oy_7o;b&uadyW%tQC;qDy^Gd&T=GoCTGu~F@b`tOO z!ax77Cha-4(1$r-#q-ziXLIc5_dP#b=gF*CmJeJhmyDPEja6J!KQ-Jjs@v~@DT7OT zyMB(z52I&O<3nQO9)xE$sQ}7JnnN3CW+S)F73;(tZxtefbm8#I=$OqjIfgx|!6;|x@;DEr* zeA9<52YYTUdn918zT*s6{GOn!+Y+-b_|Lz*FeNKL(8yl+TN0;FLFMFmInSh&=llwj zT-_X%(DzqeAiLpbBah>9RR`uvpG+5DW)Kd%#c86T8*gmIYaqCEE{1T`g};nxQ_cu~ zNIUWRFL$=stVg^OhrU<+KjeP8A=84zw#lRazj@RR{YW;EdOeQn16(dudvaIJs*hhk zuXoF~11*ow7bu1NeaCRpmbZO@qf>{k^ZrAJw0*_JxBC6#Sp3<$rf8R$NuuLFxdr8S tuT9u+Z~ewonKs3f88|0kB8Nnle~htb8;V@|LsCIyh^MQc%Q~loCIAtE_oDy+ literal 0 HcmV?d00001 diff --git a/Habitica/res/layout/task_main_content.xml b/Habitica/res/layout/task_main_content.xml index 3b9393af1..95c8a1c53 100644 --- a/Habitica/res/layout/task_main_content.xml +++ b/Habitica/res/layout/task_main_content.xml @@ -57,6 +57,18 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> + + + + + + + diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 41d36443a..99a8add56 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -1137,4 +1137,5 @@ 6 month one-time subscription 12 month one-time subscription Teams + Team Information diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index b837bea32..2cd201072 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -22,15 +22,15 @@ interface UserRepository : BaseRepository { fun getUser(): Flowable fun getUser(userID: String): Flowable - fun updateUser(user: User?, updateData: Map): Flowable - fun updateUser(user: User?, key: String, value: Any): Flowable + fun updateUser(updateData: Map): Flowable + fun updateUser(key: String, value: Any): Flowable fun retrieveUser(withTasks: Boolean): Flowable fun retrieveUser(withTasks: Boolean = false, forced: Boolean = false, overrideExisting: Boolean = false): Flowable fun revive(user: User): Flowable - fun resetTutorial(user: User?) + fun resetTutorial() fun sleep(user: User): Flowable @@ -49,7 +49,7 @@ interface UserRepository : BaseRepository { fun changeClass(selectedClass: String): Flowable fun unlockPath(user: User?, customization: Customization): Flowable - fun unlockPath(user: User, set: CustomizationSet): Flowable + fun unlockPath(set: CustomizationSet): Flowable fun runCron(tasks: MutableList) fun runCron() @@ -60,7 +60,7 @@ interface UserRepository : BaseRepository { fun changeCustomDayStart(dayStartTime: Int): Flowable - fun updateLanguage(user: User?, languageCode: String): Flowable + fun updateLanguage(languageCode: String): Flowable fun resetAccount(): Flowable fun deleteAccount(password: String): Flowable @@ -72,7 +72,7 @@ interface UserRepository : BaseRepository { fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable fun verifyUsername(username: String): Flowable - fun allocatePoint(user: User?, stat: String): Flowable + fun allocatePoint(stat: String): Flowable fun bulkAllocatePoints(user: User?, strength: Int, intelligence: Int, constitution: Int, perception: Int): Flowable fun useCustomization(user: User?, type: String, category: String?, identifier: String): Flowable diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index af89017cf..bac6acff1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -35,14 +35,16 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun getUser(userID: String): Flowable = localRepository.getUser(userID) - override fun updateUser(user: User?, updateData: Map): Flowable { - return apiClient.updateUser(updateData).map { newUser -> mergeUser(user, newUser) } + override fun updateUser(updateData: Map): Flowable { + return Flowable.zip(apiClient.updateUser(updateData), + localRepository.getUser(userID).firstElement().toFlowable(), + { newUser, user -> mergeUser(user, newUser) }) } - override fun updateUser(user: User?, key: String, value: Any): Flowable { + override fun updateUser(key: String, value: Any): Flowable { val updateData = HashMap() updateData[key] = value - return updateUser(user, updateData) + return updateUser(updateData) } override fun retrieveUser(withTasks: Boolean): Flowable = @@ -70,7 +72,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli val timeZone = calendar.timeZone val offset = -TimeUnit.MINUTES.convert(timeZone.getOffset(calendar.timeInMillis).toLong(), TimeUnit.MILLISECONDS) if (offset.toInt() != user.preferences?.timezoneOffset ?: 0) { - return@flatMap updateUser(user, "preferences.timezoneOffset", offset.toString()) + return@flatMap updateUser("preferences.timezoneOffset", offset.toString()) } else { return@flatMap Flowable.just(user) } @@ -83,7 +85,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun revive(user: User): Flowable = apiClient.revive().map { newUser -> mergeUser(user, newUser) } - override fun resetTutorial(user: User?) { + override fun resetTutorial() { localRepository.getTutorialSteps() .firstElement() .map> { tutorialSteps -> @@ -93,7 +95,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli } updateData } - .flatMap { updateData -> updateUser(user, updateData).firstElement() } + .flatMap { updateData -> updateUser(updateData).firstElement() } .subscribe({ }, RxErrorHandler.handleEmptyError()) } @@ -142,19 +144,17 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli if (path.last() == '.' && customization.type == "background") { path += user?.preferences?.background } - return apiClient.unlockPath(path) - .doOnNext { unlockResponse -> - if (user == null) return@doOnNext - val copiedUser = localRepository.getUnmanagedCopy(user) + return Flowable.zip(apiClient.unlockPath(path), localRepository.getUser(userID).firstElement().toFlowable(), { unlockResponse, copiedUser -> copiedUser.preferences = unlockResponse.preferences copiedUser.purchased = unlockResponse.purchased copiedUser.items = unlockResponse.items copiedUser.balance = copiedUser.balance - (customization.price ?: 0) / 4.0 localRepository.saveUser(copiedUser, false) - } + unlockResponse + }) } - override fun unlockPath(user: User, set: CustomizationSet): Flowable { + override fun unlockPath(set: CustomizationSet): Flowable { var path = "" for (customization in set.customizations) { path = path + "," + customization.path @@ -163,15 +163,14 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli return Flowable.just(null) } path = path.substring(1) - return apiClient.unlockPath(path) - .doOnNext { unlockResponse -> - val copiedUser = localRepository.getUnmanagedCopy(user) + return Flowable.zip(apiClient.unlockPath(path), localRepository.getUser(userID).firstElement().toFlowable(), { unlockResponse, copiedUser -> copiedUser.preferences = unlockResponse.preferences copiedUser.purchased = unlockResponse.purchased copiedUser.items = unlockResponse.items copiedUser.balance = copiedUser.balance - set.price / 4.0 localRepository.saveUser(copiedUser, false) - } + unlockResponse + }) } override fun runCron() { @@ -200,8 +199,8 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli return apiClient.changeCustomDayStart(updateObject) } - override fun updateLanguage(user: User?, languageCode: String): Flowable { - return updateUser(user, "preferences.language", languageCode) + override fun updateLanguage(languageCode: String): Flowable { + return updateUser("preferences.language", languageCode) .doOnNext { apiClient.setLanguageCode(languageCode) } } @@ -238,30 +237,26 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli override fun updatePassword(oldPassword: String, newPassword: String, newPasswordConfirmation: String): Flowable = apiClient.updatePassword(oldPassword.trim(), newPassword.trim(), newPasswordConfirmation.trim()) - override fun allocatePoint(user: User?, stat: String): Flowable { - if (user != null && user.isManaged) { - localRepository.modify(user) { liveUser -> - when (stat) { - Stats.STRENGTH -> liveUser.stats?.strength = liveUser.stats?.strength?.inc() - Stats.INTELLIGENCE -> liveUser.stats?.intelligence = liveUser.stats?.intelligence?.inc() - Stats.CONSTITUTION -> liveUser.stats?.constitution= liveUser.stats?.constitution?.inc() - Stats.PERCEPTION -> liveUser.stats?.per = liveUser.stats?.per?.inc() - } - liveUser.stats?.points = liveUser.stats?.points?.dec() + override fun allocatePoint(stat: String): Flowable { + localRepository.getUser(userID).subscribe( { liveUser -> + when (stat) { + Stats.STRENGTH -> liveUser.stats?.strength = liveUser.stats?.strength?.inc() + Stats.INTELLIGENCE -> liveUser.stats?.intelligence = liveUser.stats?.intelligence?.inc() + Stats.CONSTITUTION -> liveUser.stats?.constitution= liveUser.stats?.constitution?.inc() + Stats.PERCEPTION -> liveUser.stats?.per = liveUser.stats?.per?.inc() } - } + liveUser.stats?.points = liveUser.stats?.points?.dec() + }, RxErrorHandler.handleEmptyError()) return apiClient.allocatePoint(stat) .doOnNext { stats -> - if (user != null && user.isManaged) { - localRepository.modify(user) { liveUser -> + /*localRepository.modify(user) { liveUser -> liveUser.stats?.strength = stats.strength liveUser.stats?.constitution = stats.constitution liveUser.stats?.per = stats.per liveUser.stats?.intelligence = stats.intelligence liveUser.stats?.points = stats.points liveUser.stats?.mp = stats.mp - } - } + }*/ } } @@ -325,7 +320,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli if (category != null) { updatePath = "$updatePath.$category" } - return updateUser(user, updatePath, identifier) + return updateUser(updatePath, identifier) } override fun retrieveAchievements(): Flowable> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt index f3bc85609..7cdfde211 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/Task.kt @@ -171,7 +171,7 @@ open class Task : RealmObject, BaseObject, Parcelable { get() = this.checklist?.size != this.completedChecklistCount val isGroupTask: Boolean - get() = group?.approvalApproved == true + get() = group?.groupID?.isNotBlank() == true val isPendingApproval: Boolean get() = (group?.approvalRequired == true && group?.approvalRequested == true && group?.approvalApproved == false) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt index cf4623a8d..db59ecaf2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/tasks/TaskGroupPlan.kt @@ -1,14 +1,25 @@ package com.habitrpg.android.habitica.models.tasks +import com.google.gson.annotations.SerializedName +import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import java.util.* open class TaskGroupPlan : RealmObject() { @PrimaryKey internal var taskID: String? = null + @SerializedName("id") + var groupID: String? = null + var managerNotes: String? = null + var sharedCompletion: String? = null + var assignedDate: Date? = null + var assigningUsername: String? = null + var assignedUsers: RealmList = RealmList() + var approvalRequested: Boolean = false var approvalApproved: Boolean = false var approvalRequired: Boolean = false diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt index d3ab6e73e..79f86bd6d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FixCharacterValuesActivity.kt @@ -82,7 +82,7 @@ class FixCharacterValuesActivity: BaseActivity() { userInfo["stats.mp"] = binding.manaEditText.getDoubleValue() userInfo["stats.lvl"] = binding.levelEditText.getDoubleValue().toInt() userInfo["achievements.streak"] = binding.streakEditText.getDoubleValue().toInt() - compositeSubscription.add(repository.updateUser(user, userInfo) + compositeSubscription.add(repository.updateUser(userInfo) .flatMap { repository.retrieveUser(false, true, true) } .subscribe({}, RxErrorHandler.handleEmptyError(), { progressDialog.dismiss() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt index 7e4830b73..b361a5754 100755 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt @@ -446,12 +446,12 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { compositeSubscription.add(inventoryRepository.getQuestContent(user?.party?.quest?.completed ?: "").firstElement().subscribe({ QuestCompletedDialog.showWithQuest(this, it) - userRepository.updateUser(user, "party.quest.completed", "").subscribe({}, RxErrorHandler.handleEmptyError()) + userRepository.updateUser("party.quest.completed", "").subscribe({}, RxErrorHandler.handleEmptyError()) }, RxErrorHandler.handleEmptyError())) } if (user?.flags?.welcomed == false) { - compositeSubscription.add(userRepository.updateUser(user, "flags.welcomed", true).subscribe({}, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("flags.welcomed", true).subscribe({}, RxErrorHandler.handleEmptyError())) } if (appConfigManager.enableAdventureGuide()) { @@ -666,10 +666,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { } override fun onTutorialCompleted(step: TutorialStep) { - val path = "flags.tutorial." + step.tutorialGroup + "." + step.identifier - val updateData = HashMap() - updateData[path] = true - compositeSubscription.add(userRepository.updateUser(user, updateData) + compositeSubscription.add(userRepository.updateUser("flags.tutorial." + step.tutorialGroup + "." + step.identifier, true) .subscribe({ }, RxErrorHandler.handleEmptyError())) binding.overlayFrameLayout.removeView(this.activeTutorialView) this.removeActiveTutorialView() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt index e410bbccb..a32b6df70 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SetupActivity.kt @@ -203,7 +203,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { additionalData["status"] = "completed" AmplitudeManager.sendEvent("setup", AmplitudeManager.EVENT_CATEGORY_BEHAVIOUR, AmplitudeManager.EVENT_HITTYPE_EVENT, additionalData) - compositeSubscription.add(userRepository.updateUser(user, "flags.welcomed", true).subscribe({ + compositeSubscription.add(userRepository.updateUser("flags.welcomed", true).subscribe({ if (!compositeSubscription.isDisposed) { compositeSubscription.dispose() } @@ -227,7 +227,7 @@ class SetupActivity : BaseActivity(), ViewPager.OnPageChangeListener { } private fun confirmNames(displayName: String, username: String) { - compositeSubscription.add(userRepository.updateUser(null, "profile.name", displayName) + compositeSubscription.add(userRepository.updateUser("profile.name", displayName) .flatMap { userRepository.updateLoginName(username).toFlowable() } .subscribe({ }, RxErrorHandler.handleEmptyError())) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt index d48da01e2..327bf8478 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/VerifyUsernameActivity.kt @@ -105,7 +105,7 @@ class VerifyUsernameActivity: BaseActivity() { private fun confirmNames() { binding.confirmUsernameButton.isClickable = false - compositeSubscription.add(userRepository.updateUser(null, "profile.name", binding.displayNameEditText.text.toString()) + compositeSubscription.add(userRepository.updateUser("profile.name", binding.displayNameEditText.text.toString()) .flatMap { userRepository.updateLoginName(binding.usernameEditText.text.toString()).toFlowable() } .doOnComplete { showConfirmationAndFinish() } .doOnEach { binding.confirmUsernameButton.isClickable = true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt index 701cb4fc5..41215ddbe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/AchievementsFragment.kt @@ -11,7 +11,6 @@ import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentRefreshRecyclerviewBinding -import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.ui.adapter.AchievementsAdapter import com.habitrpg.android.habitica.ui.helpers.ToolbarColorHelper diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt index 1f6f628f4..55e58fec6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NewsFragment.kt @@ -44,6 +44,6 @@ class NewsFragment : BaseMainFragment() { override fun onResume() { super.onResume() - compositeSubscription.add(userRepository.updateUser(user, "flags.newStuff", false).subscribeWithErrorHandler({})) + compositeSubscription.add(userRepository.updateUser("flags.newStuff", false).subscribeWithErrorHandler({})) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt index d021cef3f..b5e55a0fe 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt @@ -89,11 +89,11 @@ class StatsFragment: BaseMainFragment() { binding?.distributeTaskHelpButton?.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color)) } - compositeSubscription.add(userRepository.getUser(userId).subscribe({ + compositeSubscription.add(userRepository.getUser().subscribe({ user -> canAllocatePoints = user?.stats?.lvl ?: 0 >= 10 && user?.stats?.points ?: 0 > 0 - binding?.unlockAtLevel?.visibility = if (it?.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE - updateStats(it) - updateAttributePoints(it) + binding?.unlockAtLevel?.visibility = if (user.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE + updateStats(user) + updateAttributePoints(user) }, RxErrorHandler.handleEmptyError())) binding?.distributeEvenlyButton?.setOnCheckedChangeListener { _, isChecked -> @@ -113,7 +113,7 @@ class StatsFragment: BaseMainFragment() { } binding?.automaticAllocationSwitch?.setOnCheckedChangeListener{ _, isChecked -> - userRepository.updateUser(user, "preferences.automaticAllocation", isChecked).subscribe({}, RxErrorHandler.handleEmptyError()) + userRepository.updateUser("preferences.automaticAllocation", isChecked).subscribe({}, RxErrorHandler.handleEmptyError()) } binding?.strengthStatsView?.allocateAction = { allocatePoint(Stats.STRENGTH) } @@ -140,7 +140,7 @@ class StatsFragment: BaseMainFragment() { } private fun changeAutoAllocationMode(allocationMode: String) { - compositeSubscription.add(userRepository.updateUser(user, "preferences.allocationMode", allocationMode).subscribe({}, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("preferences.allocationMode", allocationMode).subscribe({}, RxErrorHandler.handleEmptyError())) binding?.distributeEvenlyButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT binding?.distributeClassButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED binding?.distributeTaskButton?.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED @@ -155,7 +155,7 @@ class StatsFragment: BaseMainFragment() { } private fun allocatePoint(stat: String) { - compositeSubscription.add(userRepository.allocatePoint(user, stat).subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.allocatePoint(stat).subscribe({ }, RxErrorHandler.handleEmptyError())) } private fun updateAttributePoints(user: User) { @@ -203,8 +203,8 @@ class StatsFragment: BaseMainFragment() { component.inject(this) } - private fun updateStats(currentUser: User) { - val levelStat = min((currentUser.stats?.lvl ?: 0) / 2.0f, 50f).toInt() + private fun updateStats(user: User) { + val levelStat = min((user.stats?.lvl ?: 0) / 2.0f, 50f).toInt() totalStrength = levelStat totalIntelligence = levelStat @@ -216,25 +216,25 @@ class StatsFragment: BaseMainFragment() { binding?.constitutionStatsView?.levelValue = levelStat binding?.perceptionStatsView?.levelValue = levelStat - totalStrength += currentUser.stats?.buffs?.str?.toInt() ?: 0 - totalIntelligence += currentUser.stats?.buffs?._int?.toInt() ?: 0 - totalConstitution += currentUser.stats?.buffs?.con?.toInt() ?: 0 - totalPerception += currentUser.stats?.buffs?.per?.toInt() ?: 0 - binding?.strengthStatsView?.buffValue = currentUser.stats?.buffs?.str?.toInt() ?: 0 - binding?.intelligenceStatsView?.buffValue = currentUser.stats?.buffs?._int?.toInt() ?: 0 - binding?.constitutionStatsView?.buffValue = currentUser.stats?.buffs?.con?.toInt() ?: 0 - binding?.perceptionStatsView?.buffValue = currentUser.stats?.buffs?.per?.toInt() ?: 0 + totalStrength += user.stats?.buffs?.str?.toInt() ?: 0 + totalIntelligence += user.stats?.buffs?._int?.toInt() ?: 0 + totalConstitution += user.stats?.buffs?.con?.toInt() ?: 0 + totalPerception += user.stats?.buffs?.per?.toInt() ?: 0 + binding?.strengthStatsView?.buffValue = user.stats?.buffs?.str?.toInt() ?: 0 + binding?.intelligenceStatsView?.buffValue = user.stats?.buffs?._int?.toInt() ?: 0 + binding?.constitutionStatsView?.buffValue = user.stats?.buffs?.con?.toInt() ?: 0 + binding?.perceptionStatsView?.buffValue = user.stats?.buffs?.per?.toInt() ?: 0 - totalStrength += currentUser.stats?.strength ?: 0 - totalIntelligence += currentUser.stats?.intelligence ?: 0 - totalConstitution += currentUser.stats?.constitution ?: 0 - totalPerception += currentUser.stats?.per ?: 0 - binding?.strengthStatsView?.allocatedValue = currentUser.stats?.strength ?: 0 - binding?.intelligenceStatsView?.allocatedValue = currentUser.stats?.intelligence ?: 0 - binding?.constitutionStatsView?.allocatedValue = currentUser.stats?.constitution ?: 0 - binding?.perceptionStatsView?.allocatedValue = currentUser.stats?.per ?: 0 + totalStrength += user.stats?.strength ?: 0 + totalIntelligence += user.stats?.intelligence ?: 0 + totalConstitution += user.stats?.constitution ?: 0 + totalPerception += user.stats?.per ?: 0 + binding?.strengthStatsView?.allocatedValue = user.stats?.strength ?: 0 + binding?.intelligenceStatsView?.allocatedValue = user.stats?.intelligence ?: 0 + binding?.constitutionStatsView?.allocatedValue = user.stats?.constitution ?: 0 + binding?.perceptionStatsView?.allocatedValue = user.stats?.per ?: 0 - val outfit = currentUser.items?.gear?.equipped + val outfit = user.items?.gear?.equipped val outfitList = ArrayList() outfit?.let { thisOutfit -> outfitList.add(thisOutfit.armor) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt index 41f3b9df6..68170e97c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarCustomizationFragment.kt @@ -55,24 +55,14 @@ class AvatarCustomizationFragment : BaseMainFragment - val user = this.user - if (user != null) { userRepository.unlockPath(user, customization) - } else { - Flowable.empty() - } } .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } .flatMap { inventoryRepository.retrieveInAppRewards() } .subscribe({ }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getUnlockSetEvents() .flatMap { set -> - val user = this.user - if (user != null) { - userRepository.unlockPath(user, set) - } else { - Flowable.empty() - } + userRepository.unlockPath(set) } .flatMap { userRepository.retrieveUser(withTasks = false, forced = true) } .flatMap { inventoryRepository.retrieveInAppRewards() } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt index 6b0544724..5d427ead7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarEquipmentFragment.kt @@ -54,12 +54,7 @@ class AvatarEquipmentFragment : BaseMainFragment() .subscribe({ }, RxErrorHandler.handleEmptyError())) compositeSubscription.add(adapter.getUnlockSetEvents() .flatMap { set -> - val user = this.user - if (user != null) { - userRepository.unlockPath(user, set) - } else { - Flowable.empty() - } + userRepository.unlockPath(set) } .subscribe({ }, RxErrorHandler.handleEmptyError())) return super.onCreateView(inflater, container, savedInstanceState) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt index e6ce750bc..dc100c63c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt @@ -94,10 +94,8 @@ class AvatarOverviewFragment : BaseMainFragment() override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { val newSize: String = if (position == 0) "slim" else "broad" - if (this.user?.isValid == true && this.user?.preferences?.size != newSize) { - compositeSubscription.add(userRepository.updateUser(user, "preferences.size", newSize) + compositeSubscription.add(userRepository.updateUser("preferences.size", newSize) .subscribe({ }, RxErrorHandler.handleEmptyError())) - } } override fun onNothingSelected(parent: AdapterView<*>) { /* no-on */ } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt index b069005e0..c9671b890 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/equipment/EquipmentOverviewFragment.kt @@ -49,8 +49,8 @@ class EquipmentOverviewFragment : BaseMainFragment userRepository.updateUser(user, "preferences.autoEquip", isChecked).subscribe({ }, RxErrorHandler.handleEmptyError()) } - binding?.costumeSwitch?.setOnCheckedChangeListener { _, isChecked -> userRepository.updateUser(user, "preferences.costume", isChecked).subscribe({ }, RxErrorHandler.handleEmptyError()) } + binding?.autoEquipSwitch?.setOnCheckedChangeListener { _, isChecked -> userRepository.updateUser("preferences.autoEquip", isChecked).subscribe({ }, RxErrorHandler.handleEmptyError()) } + binding?.costumeSwitch?.setOnCheckedChangeListener { _, isChecked -> userRepository.updateUser("preferences.costume", isChecked).subscribe({ }, RxErrorHandler.handleEmptyError()) } user?.items?.gear?.let { updateGearData(it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt index 68ca2ee22..51536a052 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/EmailNotificationsPreferencesFragment.kt @@ -73,7 +73,7 @@ class EmailNotificationsPreferencesFragment : BasePreferencesFragment(), SharedP else -> null } if (pathKey != null) { - compositeSubscription.add(userRepository.updateUser(user, "preferences.emailNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("preferences.emailNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) } } } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt index b6378437a..69585d9d8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PreferencesFragment.kt @@ -202,7 +202,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare return } - userRepository.updateLanguage(user, languageHelper.languageCode ?: "en") + userRepository.updateLanguage(languageHelper.languageCode ?: "en") .flatMap { contentRepository.retrieveContent(context,true) } .subscribe({ }, RxErrorHandler.handleEmptyError()) @@ -213,7 +213,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare "audioTheme" -> { val newAudioTheme = sharedPreferences.getString(key, "off") if (newAudioTheme != null) { - compositeSubscription.add(userRepository.updateUser(user, "preferences.sound", newAudioTheme) + compositeSubscription.add(userRepository.updateUser("preferences.sound", newAudioTheme) .subscribe({ }, RxErrorHandler.handleEmptyError())) soundManager.soundTheme = newAudioTheme soundManager.preloadAllFiles() @@ -227,7 +227,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare val activity = activity as? PrefsActivity ?: return activity.reload() } - "dailyDueDefaultView" -> userRepository.updateUser(user, "preferences.dailyDueDefaultView", sharedPreferences.getBoolean(key, false)) + "dailyDueDefaultView" -> userRepository.updateUser("preferences.dailyDueDefaultView", sharedPreferences.getBoolean(key, false)) .subscribe({ }, RxErrorHandler.handleEmptyError()) "server_url" -> { apiClient.updateServerUrl(sharedPreferences.getString(key, "")) @@ -244,7 +244,7 @@ class PreferencesFragment : BasePreferencesFragment(), SharedPreferences.OnShare "disablePMs" -> { val isDisabled = sharedPreferences.getBoolean("disablePMs", false) if (user?.inbox?.optOut != isDisabled) { - compositeSubscription.add(userRepository.updateUser(user, "inbox.optOut", isDisabled) + compositeSubscription.add(userRepository.updateUser("inbox.optOut", isDisabled) .subscribe({ }, RxErrorHandler.handleEmptyError())) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt index 25d2f0319..863de186c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/ProfilePreferencesFragment.kt @@ -58,21 +58,21 @@ class ProfilePreferencesFragment: BasePreferencesFragment(), SharedPreferences.O val observable: Flowable? = when (key) { "display_name" -> { if (newValue != user?.profile?.name) { - userRepository.updateUser(user, "profile.name", newValue) + userRepository.updateUser("profile.name", newValue) } else { null } } "photo_url" -> { if (newValue != user?.profile?.imageUrl) { - userRepository.updateUser(user, "profile.imageUrl", newValue) + userRepository.updateUser("profile.imageUrl", newValue) } else { null } } "about" -> { if (newValue != user?.profile?.blurb) { - userRepository.updateUser(user, "profile.blurb", newValue) + userRepository.updateUser("profile.blurb", newValue) } else { null } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt index 0b0c79db6..4413d02f5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/PushNotificationsPreferencesFragment.kt @@ -75,7 +75,7 @@ class PushNotificationsPreferencesFragment : BasePreferencesFragment(), SharedPr else -> null } if (pathKey != null) { - compositeSubscription.add(userRepository.updateUser(user, "preferences.pushNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) + compositeSubscription.add(userRepository.updateUser("preferences.pushNotifications.$pathKey", sharedPreferences.getBoolean(key, false)).subscribe({ }, RxErrorHandler.handleEmptyError())) } } } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt index abae64b64..c619c3d3a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.kt @@ -56,7 +56,7 @@ class AvatarSetupFragment : BaseFragment() { this.adapter = CustomizationSetupAdapter() this.adapter?.userSize = this.user?.preferences?.size ?: "slim" - adapter?.updateUserEvents?.flatMap { userRepository.updateUser(user, it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } + adapter?.updateUserEvents?.flatMap { userRepository.updateUser(it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } adapter?.equipGearEvents?.flatMap { inventoryRepository.equip(user, "equipped", it) }?.subscribeWithErrorHandler {}?.let { compositeSubscription.add(it) } this.adapter?.user = this.user @@ -185,7 +185,7 @@ class AvatarSetupFragment : BaseFragment() { updateData["preferences.hair.bangs"] = chooseRandomKey(customizationRepository.getCustomizations(SetupCustomizationRepository.CATEGORY_HAIR, SetupCustomizationRepository.SUBCATEGORY_BANGS, user), false) updateData["preferences.hair.flower"] = chooseRandomKey(customizationRepository.getCustomizations(SetupCustomizationRepository.CATEGORY_EXTRAS, SetupCustomizationRepository.SUBCATEGORY_FLOWER, user), true) updateData["preferences.chair"] = chooseRandomKey(customizationRepository.getCustomizations(SetupCustomizationRepository.CATEGORY_EXTRAS, SetupCustomizationRepository.SUBCATEGORY_WHEELCHAIR, user), true) - compositeSubscription.add(userRepository.updateUser(user, updateData).subscribeWithErrorHandler({})) + compositeSubscription.add(userRepository.updateUser(updateData).subscribeWithErrorHandler({})) } @Suppress("ReturnCount") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt index 46c6a7dd2..a562f342a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxOverviewFragment.kt @@ -51,7 +51,7 @@ class InboxOverviewFragment : BaseMainFragment(), androidx binding?.inboxRefreshLayout?.setOnRefreshListener(this) - compositeSubscription.add(userRepository.getUser().map { user?.inbox?.optOut ?: false }.distinctUntilChanged().subscribe { + compositeSubscription.add(userRepository.getUser().map { it.inbox?.optOut ?: false }.distinctUntilChanged().subscribe { binding?.optOutView?.visibility = if (it) View.VISIBLE else View.GONE }) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt index b7c5b9ce9..74cc5656a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt @@ -125,7 +125,7 @@ class QuestDetailFragment : BaseMainFragment() { } private fun showParticipatantButtons(): Boolean { - return if (user == null || user?.party == null || user?.party?.quest == null) { + return if (user?.party?.quest == null) { false } else !isQuestActive && user?.party?.quest?.RSVPNeeded == true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt index 559440aa6..256ad7314 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/TavernFragment.kt @@ -79,10 +79,6 @@ class TavernFragment : BaseMainFragment() { private fun setViewPagerAdapter() { val fragmentManager = childFragmentManager - if (this.user == null) { - return - } - binding?.viewPager?.adapter = object : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { override fun getItem(position: Int): Fragment { return when (position) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt index 4179f9bb0..1eccf3a5a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyFragment.kt @@ -185,9 +185,6 @@ class PartyFragment : BaseMainFragment() { private fun setViewPagerAdapter() { val fragmentManager = childFragmentManager - if (this.user == null) { - return - } viewPagerAdapter = object : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt index 9c4bfce81..6ee86ea7e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/SupportMainFragment.kt @@ -63,7 +63,7 @@ class SupportMainFragment : BaseMainFragment() { }.subscribe()) binding?.resetTutorialButton?.setOnClickListener { - userRepository.resetTutorial(user) + userRepository.resetTutorial() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt index 4048e0a84..85765badd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.kt @@ -1,6 +1,7 @@ package com.habitrpg.android.habitica.ui.fragments.tasks import android.content.Context +import android.content.Intent import android.graphics.drawable.BitmapDrawable import android.os.Bundle import android.util.TypedValue @@ -30,6 +31,7 @@ import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.activities.MainActivity +import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.adapter.tasks.* import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.helpers.SafeDefaultItemAnimator @@ -44,6 +46,7 @@ import javax.inject.Inject import javax.inject.Named open class TaskRecyclerViewFragment : BaseFragment(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { + internal var canEditTasks: Boolean = true override var binding: FragmentRefreshRecyclerviewBinding? = null override fun createBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRefreshRecyclerviewBinding { @@ -401,6 +404,21 @@ open class TaskRecyclerViewFragment : BaseFragment(), SearchView.O return FragmentViewpagerBinding.inflate(inflater, container, false) } + @field:[Inject Named(AppModule.NAMED_USER_ID)] + lateinit var userID: String @Inject lateinit var taskFilterHelper: TaskFilterHelper @Inject @@ -158,10 +162,7 @@ class TasksFragment : BaseMainFragment(), SearchView.O context?.let { var disposable: Disposable? = null val dialog = TaskFilterDialog(it, HabiticaBaseApplication.userComponent) - if (user != null) { - dialog.setTags(user?.tags?.createSnapshot() ?: emptyList()) - disposable = tagRepository.getTags(user?.id ?: "").subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) - } + disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { val taskType = activeFragment?.classType @@ -204,10 +205,10 @@ class TasksFragment : BaseMainFragment(), SearchView.O val fragment: TaskRecyclerViewFragment = when (position) { 0 -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_HABIT) 1 -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_DAILY) - 3 -> RewardsRecyclerviewFragment.newInstance(context, Task.TYPE_REWARD) + 3 -> RewardsRecyclerviewFragment.newInstance(context, Task.TYPE_REWARD, true) else -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_TODO) } - fragment.ownerID = user?.id ?: "" + fragment.ownerID = userID fragment.refreshAction = { compositeSubscription.add(userRepository.retrieveUser(true, true) .doOnTerminate { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt index a3d86c9fa..f27fe488c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/tasks/TeamBoardFragment.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.* import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf import androidx.fragment.app.FragmentPagerAdapter import com.habitrpg.android.habitica.HabiticaBaseApplication import com.habitrpg.android.habitica.R @@ -15,10 +16,7 @@ import com.habitrpg.android.habitica.data.TagRepository import com.habitrpg.android.habitica.databinding.FragmentViewpagerBinding import com.habitrpg.android.habitica.extensions.getThemeColor import com.habitrpg.android.habitica.extensions.setTintWith -import com.habitrpg.android.habitica.helpers.AmplitudeManager -import com.habitrpg.android.habitica.helpers.AppConfigManager -import com.habitrpg.android.habitica.helpers.RxErrorHandler -import com.habitrpg.android.habitica.helpers.TaskFilterHelper +import com.habitrpg.android.habitica.helpers.* import com.habitrpg.android.habitica.models.tasks.Task import com.habitrpg.android.habitica.ui.activities.TaskFormActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment @@ -120,7 +118,7 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.menu_main_activity, menu) + inflater.inflate(R.menu.menu_team_board, menu) filterMenuItem = menu.findItem(R.id.action_filter) updateFilterIcon() @@ -165,6 +163,10 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi refresh() true } + R.id.action_team_info -> { + MainNavigationController.navigate(R.id.guildFragment, bundleOf(Pair("groupID", teamID))) + true + } else -> super.onOptionsItemSelected(item) } } @@ -173,10 +175,7 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi context?.let { var disposable: Disposable? = null val dialog = TaskFilterDialog(it, HabiticaBaseApplication.userComponent) - if (user != null) { - dialog.setTags(user?.tags?.createSnapshot() ?: emptyList()) - disposable = tagRepository.getTags(user?.id ?: "").subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) - } + disposable = tagRepository.getTags().subscribe({ tagsList -> dialog.setTags(tagsList)}, RxErrorHandler.handleEmptyError()) dialog.setActiveTags(taskFilterHelper.tags) if (activeFragment != null) { val taskType = activeFragment?.classType @@ -219,10 +218,11 @@ class TeamBoardFragment : BaseMainFragment(), SearchVi val fragment: TaskRecyclerViewFragment = when (position) { 0 -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_HABIT) 1 -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_DAILY) - 3 -> RewardsRecyclerviewFragment.newInstance(context, Task.TYPE_REWARD) + 3 -> RewardsRecyclerviewFragment.newInstance(context, Task.TYPE_REWARD, false) else -> TaskRecyclerViewFragment.newInstance(context, Task.TYPE_TODO) } fragment.ownerID = teamID + fragment.canEditTasks = false fragment.refreshAction = { compositeSubscription.add(userRepository.retrieveTeamPlan(teamID) .doOnTerminate { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt index 51ae6eb1a..976408d0f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/tasks/BaseTaskViewHolder.kt @@ -1,12 +1,14 @@ package com.habitrpg.android.habitica.ui.viewHolders.tasks import android.content.Context +import android.text.TextUtils import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.* import androidx.appcompat.widget.AppCompatImageView import androidx.core.content.ContextCompat +import androidx.core.text.TextUtilsCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.getThemeColor @@ -34,6 +36,7 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: protected val titleTextView: EllipsisTextView = itemView.findViewById(R.id.checkedTextView) protected val notesTextView: EllipsisTextView? = itemView.findViewById(R.id.notesTextView) protected val calendarIconView: ImageView? = itemView.findViewById(R.id.iconViewCalendar) + protected val iconViewTeam: ImageView? = itemView.findViewById(R.id.iconViewTeamTask) protected val specialTaskTextView: TextView? = itemView.findViewById(R.id.specialTaskText) private val iconViewChallenge: AppCompatImageView? = itemView.findViewById(R.id.iconviewChallenge) private val iconViewReminder: ImageView? = itemView.findViewById(R.id.iconviewReminder) @@ -55,6 +58,9 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: get() { var isVisible = false + if (iconViewTeam?.visibility == View.VISIBLE) { + isVisible = true + } if (iconViewReminder?.visibility == View.VISIBLE) { isVisible = true } @@ -201,6 +207,8 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: } configureSpecialTaskTextView(data) + iconViewTeam?.visibility = if (data.isGroupTask) View.VISIBLE else View.GONE + taskIconWrapper?.visibility = if (taskIconWrapperIsVisible) View.VISIBLE else View.GONE } else { taskIconWrapper?.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt index daca49fc6..dcfbd4ec5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/BaseViewModel.kt @@ -43,6 +43,6 @@ abstract class BaseViewModel: ViewModel() { } fun updateUser(path: String, value: Any) { - disposable.add(userRepository.updateUser(getUserData().value, path, value).subscribe({ }, RxErrorHandler.handleEmptyError())) + disposable.add(userRepository.updateUser(path, value).subscribe({ }, RxErrorHandler.handleEmptyError())) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt index cd921776e..57584e183 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/TaskListDeserializer.kt @@ -120,13 +120,15 @@ class TaskListDeserializer : JsonDeserializer { } if (obj.has("group")) { - val group = TaskGroupPlan() val groupObject = obj.getAsJsonObject("group") - val approvalObject = groupObject.getAsJsonObject("approval") - if (approvalObject.has("requested")) group.approvalRequested = approvalObject.getAsJsonPrimitive("requested").asBoolean - if (approvalObject.has("approved")) group.approvalApproved = approvalObject.getAsJsonPrimitive("approved").asBoolean - if (approvalObject.has("required")) group.approvalRequired = approvalObject.getAsJsonPrimitive("required").asBoolean - task.group = group + val group: TaskGroupPlan = ctx.deserialize(groupObject, TaskGroupPlan::class.java) + if (group.groupID?.isNotBlank() == true) { + val approvalObject = groupObject.getAsJsonObject("approval") + if (approvalObject.has("requested")) group.approvalRequested = approvalObject.getAsJsonPrimitive("requested").asBoolean + if (approvalObject.has("approved")) group.approvalApproved = approvalObject.getAsJsonPrimitive("approved").asBoolean + if (approvalObject.has("required")) group.approvalRequired = approvalObject.getAsJsonPrimitive("required").asBoolean + task.group = group + } } // Work around since Realm does not support Arrays of ints getMonthlyDays(e, task)