From efce4158b559e9f11f7f87382e082ba9890823c7 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 18 Jun 2020 12:28:14 +0200 Subject: [PATCH] Finish up AG --- Habitica/build.gradle | 2 +- .../drawable-hdpi/task_broken_megaphone.png | Bin 0 -> 648 bytes .../drawable-hdpi/task_icon_challenge.webp | Bin 364 -> 0 bytes Habitica/res/drawable-hdpi/task_megaphone.png | Bin 0 -> 575 bytes .../drawable-mdpi/task_broken_megaphone.png | Bin 0 -> 443 bytes .../drawable-mdpi/task_icon_challenge.webp | Bin 282 -> 0 bytes Habitica/res/drawable-mdpi/task_megaphone.png | Bin 0 -> 412 bytes .../drawable-xhdpi/task_broken_megaphone.png | Bin 0 -> 827 bytes .../drawable-xhdpi/task_icon_challenge.webp | Bin 442 -> 0 bytes .../res/drawable-xhdpi/task_megaphone.png | Bin 0 -> 737 bytes .../drawable-xxhdpi/task_broken_megaphone.png | Bin 0 -> 1208 bytes .../drawable-xxhdpi/task_icon_challenge.webp | Bin 578 -> 0 bytes .../res/drawable-xxhdpi/task_megaphone.png | Bin 0 -> 1012 bytes Habitica/res/layout/daily_item_card.xml | 5 +- Habitica/res/layout/habit_item_card.xml | 2 +- Habitica/res/layout/todo_item_card.xml | 5 +- Habitica/res/values/strings.xml | 1 + Habitica/res/xml/remote_config_defaults.xml | 8 +++ .../habitica/helpers/AppConfigManager.kt | 8 +++ .../android/habitica/models/tasks/Task.kt | 1 + .../habitica/ui/activities/MainActivity.kt | 19 +++++- .../ui/fragments/NavigationDrawerFragment.kt | 8 ++- .../fragments/support/SupportMainFragment.kt | 59 ++---------------- .../viewHolders/tasks/BaseTaskViewHolder.kt | 4 +- .../ui/views/dialogs/HabiticaAlertDialog.kt | 7 +++ .../habitica/ui/views/shops/PurchaseDialog.kt | 16 ++++- .../habitica/utils/TaskListDeserializer.kt | 4 ++ Habitica/staff/release/output.json | 20 ++++++ 28 files changed, 101 insertions(+), 68 deletions(-) create mode 100644 Habitica/res/drawable-hdpi/task_broken_megaphone.png delete mode 100644 Habitica/res/drawable-hdpi/task_icon_challenge.webp create mode 100644 Habitica/res/drawable-hdpi/task_megaphone.png create mode 100644 Habitica/res/drawable-mdpi/task_broken_megaphone.png delete mode 100644 Habitica/res/drawable-mdpi/task_icon_challenge.webp create mode 100644 Habitica/res/drawable-mdpi/task_megaphone.png create mode 100644 Habitica/res/drawable-xhdpi/task_broken_megaphone.png delete mode 100644 Habitica/res/drawable-xhdpi/task_icon_challenge.webp create mode 100644 Habitica/res/drawable-xhdpi/task_megaphone.png create mode 100644 Habitica/res/drawable-xxhdpi/task_broken_megaphone.png delete mode 100644 Habitica/res/drawable-xxhdpi/task_icon_challenge.webp create mode 100644 Habitica/res/drawable-xxhdpi/task_megaphone.png create mode 100644 Habitica/staff/release/output.json diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 468adc64f..ea8cbc658 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -162,7 +162,7 @@ android { multiDexEnabled true 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 2437 + versionCode 2441 versionName "2.7" } diff --git a/Habitica/res/drawable-hdpi/task_broken_megaphone.png b/Habitica/res/drawable-hdpi/task_broken_megaphone.png new file mode 100644 index 0000000000000000000000000000000000000000..fff1293684de6d921461c7c4833f5ca46e0ea09a GIT binary patch literal 648 zcmV;30(bq1P)R{X#(C@S$I&GoztY3A8X&4Zcu-nr+V`|iDO zhBi5w!rZ$HfE@+culWUl8i*xZ zg5U~P4IDzfz7h=#quCr$-G@~Q&0T_-trmVY>7*Tb;zAD7UyoUpKsM>9Vv=s8`*vX4hQ@1$`8OH*H2DxB1*cM5+Lx2aJZk^~j( zgD0xA+!a#ejW&8}$c~R62Ac;&e5I%E3n%OXlwA6b+}EOzvuet3eWKf>Jec5?0Q0T< zit5S5l)C*?0()CbvmMc#;OAiSv))xbd*s*7w8H5^#+ls+RI>>&{Z2cJb0#0ieqHkf z!Z3ps;YOAV>(#exOwe&F&ZRw4x<=1b%dKdHM^wLliM+%@y2^6?Q=7D8W@Deq)EQ=# z&IV|GruqrY3%nIKEW0*D<%&o@G1&Jc&TrQwj`gtSnne=%koo+t#l03uKa@CU>Dr)w iFt^L_O$ulKCHw^!f4=W;|4};t0000BwD?MedVp8;oraCi7P?+gy$QV3|RCER-f;@8LM}s{Trg$h&QUE{o1E4|y4*@O^WFSx=2q2Y!K|25f4+$WW;lWK|YW)bV9E@joPViddAM=NJ*ZLFT3RCMx0Jn`Vq*{pa?CuG0vfa*0 zdqJO*tJxU9Wxf9*Z-_Z~j=@SLsX*IEA%ESBU%gs%plmlC132F3rA*#TXX^rBzg3Eu zBqchhcyAW(Y|<0lAK=~SPFvpKB$w%Io#Qp=5mqE62FusB5uCls8!b0?4cdeyAD3me K-koWzKM(-kccO#< diff --git a/Habitica/res/drawable-hdpi/task_megaphone.png b/Habitica/res/drawable-hdpi/task_megaphone.png new file mode 100644 index 0000000000000000000000000000000000000000..aacc986d12178d4470e4242c6c2e1b3ee125f72c GIT binary patch literal 575 zcmV-F0>J%=P)XiYsiJvqO^u2JAN;^%Zp3WAoa1kGjD!;GjC@0iK^OY zy>%aon+nVbunUzA1RVg|Vvlu}moL2)5vr$K(rmOID)inV=08NRGi@+gZ?xV4diD^| zaq2XfKwlp>`RBoE@PVKk>9Ls24QBHVM#_j$f@oQl6goE!)t3uoFPGD6BcLnwC6+Y1 zqG)Sgdk19|ltdYDLNEfiY!)IbsZjF7x7#OzAlPSJB#K@wpx{j|X*s&)^MzKWr46vq#}GUonYi&1+tX zx@Q(nZTj~AI;STS5LcpNvG_CDJ32B_zG5Pu!y_5sB5$4cKJx>Br5S+aegBHX>2}VtxFe+h;F8z0G;V${0)&$LYo>JDpeT9tsGfbG^W(oFe^mPdHX$KjCBmE zh0RjK&U$5KpQ>OdC$1Dy1BaUU1frZ6qjnwkZ84G@A{h;k>qGrm-f){Hcq3nltc> lNaUUWe@*TN(~}pz<{KBXc8l}Tvxfix002ovPDHLkV1gK}y*mH^ literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/task_icon_challenge.webp b/Habitica/res/drawable-mdpi/task_icon_challenge.webp deleted file mode 100644 index c8b6cb4a27e7ab6ca23fa8ab3a5261e3969a9582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmV+#0pdl?(Xzo1Lg4R?(kj`vH^<1><*AhfCypl#QRSx4!`m$4#15P zCVZIipg=(hry@`hLxP4J1%yff0s&ySLBW3U{44yJu;IdlA0rwx002e+?y8=x0>_RE zfC(Hw9$Y{SaA4cEl3Z*NyW`rFP1`;HNm0fGBKki8_`^a)e?>`2Ynh}G;*^$Sj(95u zWw&~ty~8s{h%|6oc^q`lCV+PkJ03R(jC6@H?09V1(cFAOBbA2ah56Iv898ZIqX2jA g>r=9QjF6Q15X73s2-r~-0A#LKm^WWIi0j~s09e|3-T(jq diff --git a/Habitica/res/drawable-mdpi/task_megaphone.png b/Habitica/res/drawable-mdpi/task_megaphone.png new file mode 100644 index 0000000000000000000000000000000000000000..08582956faa91b7d06f3e21297c375950cd27230 GIT binary patch literal 412 zcmV;N0b~A&P)51by-EW?5T0)@QA`n2h!#P6FQ8Z`mmf{A5_|#Qz}CXY5Nv%C zOHGLRF*aJm)}S1uzN>?UQIJ zSojGFqSJBVcC9G>Z)vse7PXFjO6bx>0mLciOw;A^`cPs+>1>?B%o#QI{%K6TvE9DS z^XN_9NutEfl}%)B?S%Xc~{o4O<;$O zXP7ZCLI&3abXEMDO0~FU@=_Vh9K?7(l3TJY9{@}d(sSV#DHiLh(HU4cM%^CBHgN71Q{00004XF*Lt006O% z3;baP0008=NklQ5`uKoE*CBAwTNn&P_1+rvqY#x zv}qyYx+rPXOx@HngbG`PxZLyp&VSB- z?tcYb8tSNp#=D`?M7D&_90XB_L`hFWO%yfdpQNiRO@3QTw5_cINu7eC+&_{mQU89s ziHNp_9}w(6&)Hxe%R=tH3`SZ}XeJO(H_*PGeQcn-o;2SZOhj=S^Ra9Bc4+4# z@(h83D>8U@))w-Fx3}*`lHh43VR4F|-+$7`ISd&?Aw^FI#L= zzAX|-8{2e+GJ!_oO}gY6fmPz`SWe7nsO|hZHtUO3jSEnQ`rlx9;1CQ#1peyjt*B(_ z9%^gbD-B;h=xMW#&;@AOiHOS3;4liXA27EmNP7CK9!4_pmb;B;=xV8_jYH__p^OZ= z`lsQJ1|;Km=zG-RpTo)zCUygw?#mInNY5QQt#~q{Oyn5HqnZ1kcj_~|?#c(ogcdgh zm<6b=d<0`o`5daOsW+j|T_t6(M$}eLA{N_=l+<&uGsCW&G2j3vZ-;lVd{S9Jps0~w z8u`f}J8g4)jk$$o^2LILXLxAt+o4Gryja7N3ChsGOKrJ$j`U6L zwmNID8W`5CuhXl6rN7_vW58K#a&csAY&k)1j1>@31kY9G?65@_L^jP!nU8vF6? zdzEM7tg0^iWPsg9*;rLqCkt8d5g1d%6k$*ybxx)#kux;BW>7Kj;Dy=sRU9k>Bt2m}P`Iv4<{0E8cet%?FmSTj9bcnG2QS{eo%a1-BPaPzs^1a)p8))~XZCJir?h<3_#~gEVBWkeQ&h9<-VQikXZfi9NwNR1 z^`T+jd@fTikS1W?kZtdFKrz`qSagywwDey8q?o_jS^!|cw0i8oJmuQinhBzTJb5N0 z+nz8cG{7iA&{)RY}j=~led+in7Y}CY5}lr-)AWfn}=Uo z0OF6rXr-fuSdL^RLHTYcs)9F?J&W%;H$o1JDzh1qZXmvXQKhVa6Ou(UMnm3KLMb{R k=@I}~eb+e+oRTcr#{h^&H0IJI{gWu4vm3zFZ9)9$0OeBCBme*a diff --git a/Habitica/res/drawable-xhdpi/task_megaphone.png b/Habitica/res/drawable-xhdpi/task_megaphone.png new file mode 100644 index 0000000000000000000000000000000000000000..60df85d01c5f0c3757c5b9d4ccf45247d0c855ce GIT binary patch literal 737 zcmV<70v`Q|P)71Q{00004XF*Lt006O% z3;baP0007*Nklj1@WKo zQ1I%1;LWohT09Bnqp_Q|C?XpxIj9wt2qJoDTFvhGd!d_dH)(2O^x%VK-kUcwzxjA? z-ZEhni_gZT{$q|vG9-LZSl+R4nV4J=<*ETyPA1R2VP;>;|H>o3Q#*qd-&Ula`Xm!1zD2}w60)FtWJju}*}~ZP@hdHWsae}-R};r^ zM(djtC&d=|pezOd;E0faE7*%t zIC#A!!kNqz(%$=smMCmV2cyD_zdaY+rGE;j1N#2~TTW>&bwq7=Ilp|$Q)GEwhjz>S zsVl&+Veu%ACU2oB#Ebb-9D5_=?c=V{#jrtigs#DGsW+n0 zgZBun@^aX=saW0d#Jd2d5#HEqj`V)P!(2uW#k;7=sG&PB%;l|`e+fGGcIh!^cdfB7 zlj-xhLbh}j2JVKRsdk2qL2P~R)yBtiGnq`RwFCSGX`vDA T`LN-{00000NkvXXu0mjfdJZ6O3jK8j?a&9c+D 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 + app:srcCompat="@drawable/task_megaphone" /> + android:orientation="vertical"> + app:srcCompat="@drawable/task_megaphone" /> + app:srcCompat="@drawable/task_megaphone" /> + android:orientation="vertical"> You only need %d %s to hatch all possible pets. Are you sure you want to purchase %d? Purchase %d You\'ve already hatched all possible %s pets. Are you sure you want to purchase %d %s? + Equip diff --git a/Habitica/res/xml/remote_config_defaults.xml b/Habitica/res/xml/remote_config_defaults.xml index 8944e9c24..47ecea4e3 100644 --- a/Habitica/res/xml/remote_config_defaults.xml +++ b/Habitica/res/xml/remote_config_defaults.xml @@ -84,5 +84,13 @@ reorderMenu false + + feedbackURL + + + + enableAdventureGuide + false + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt index 84d4fe20f..6a18d7bb3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt @@ -85,6 +85,10 @@ class AppConfigManager { return remoteConfig.getBoolean("enableTaskDisplayMode") } + fun feedbackURL(): String { + return remoteConfig.getString("feedbackURL") + } + fun taskDisplayMode(context: Context): String { return if (remoteConfig.getBoolean("enableTaskDisplayMode")) { val preferences = PreferenceManager.getDefaultSharedPreferences(context) @@ -97,4 +101,8 @@ class AppConfigManager { fun reorderMenu(): Boolean { return remoteConfig.getBoolean("reorderMenu") } + + fun enableAdventureGuide(): Boolean { + return remoteConfig.getBoolean("enableAdventureGuide") + } } 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 166ba9578..60af9bf85 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 @@ -33,6 +33,7 @@ open class Task : RealmObject, Parcelable { @TaskTypes var type: String = "" var challengeID: String? = null + var challengeBroken: String? = null var attribute: String? = Stats.STRENGTH var value: Double = 0.0 var tags: RealmList? = RealmList() 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 be6cc0e4c..05dccbb33 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 @@ -42,6 +42,7 @@ import com.habitrpg.android.habitica.helpers.notifications.PushNotificationManag import com.habitrpg.android.habitica.interactors.CheckClassSelectionUseCase import com.habitrpg.android.habitica.interactors.DisplayItemDropUseCase import com.habitrpg.android.habitica.interactors.NotifyUserUseCase +import com.habitrpg.android.habitica.models.Notification import com.habitrpg.android.habitica.models.TutorialStep import com.habitrpg.android.habitica.models.inventory.Egg import com.habitrpg.android.habitica.models.inventory.HatchingPotion @@ -690,6 +691,13 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { @Subscribe fun showAchievementDialog(event: ShowAchievementDialog) { + if (User.ONBOARDING_ACHIEVEMENT_KEYS.contains(event.type) || event.type == Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type) { + if (!appConfigManager.enableAdventureGuide()) { + apiClient.readNotification(event.id) + .subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) + return + } + } compositeSubscription.add(Completable.complete() .observeOn(AndroidSchedulers.mainThread()) .subscribe(Action { @@ -704,6 +712,11 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { @Subscribe fun showFirstDropDialog(event: ShowFirstDropDialog) { + if (!appConfigManager.enableAdventureGuide()) { + apiClient.readNotification(event.id) + .subscribe(Consumer { }, RxErrorHandler.handleEmptyError()) + return + } compositeSubscription.add(Completable.complete() .observeOn(AndroidSchedulers.mainThread()) .subscribe(Action { @@ -741,7 +754,10 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { val dialog = HabiticaAlertDialog(this) dialog.setTitle(getString(R.string.hatched_pet_title, potionName, eggName)) dialog.setAdditionalContentView(petWrapper) - dialog.addButton(R.string.onwards, true) { hatchingDialog, _ -> hatchingDialog.dismiss() } + dialog.addButton(R.string.equip, true) { _, _ -> + inventoryRepository.equip(user, "pet", "Pet-" + egg.key + "-" + potion.key) + .subscribe(Consumer {}, RxErrorHandler.handleEmptyError()) + } dialog.addButton(R.string.share, false) { hatchingDialog, _ -> val event1 = ShareEvent() event1.sharedMessage = getString(R.string.share_hatched, potionName, eggName) @@ -754,6 +770,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { EventBus.getDefault().post(event1) hatchingDialog.dismiss() } + dialog.setExtraCloseButtonVisibility(View.VISIBLE) dialog.enqueue() }.subscribe(Consumer { }, RxErrorHandler.handleEmptyError())) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt index 7c26029c3..50c0cabe0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt @@ -284,8 +284,12 @@ class NavigationDrawerFragment : DialogFragment() { } val adventureGuideItem = getItemWithIdentifier(SIDEBAR_ADVENTURE_GUIDE) - adventureGuideItem?.isVisible = !user.hasCompletedOnboarding - adventureGuideItem?.user = user + if (configManager.enableAdventureGuide()) { + adventureGuideItem?.isVisible = !user.hasCompletedOnboarding + adventureGuideItem?.user = user + } else { + adventureGuideItem?.isVisible = false + } } override fun onDestroy() { 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 5605177de..871286c21 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 @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.net.toUri import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.UserComponent import com.habitrpg.android.habitica.data.FAQRepository @@ -51,7 +52,9 @@ class SupportMainFragment : BaseMainFragment() { MainNavigationController.navigate(R.id.bugFixFragment) } binding.suggestionsFeedbackWrapper.setOnClickListener { - sendEmail("[Android] Feedback") + val uriUrl = appConfigManager.feedbackURL().toUri() + val launchBrowser = Intent(Intent.ACTION_VIEW, uriUrl) + startActivity(launchBrowser) } compositeSubscription.add(Completable.fromAction { @@ -71,58 +74,4 @@ class SupportMainFragment : BaseMainFragment() { override fun injectFragment(component: UserComponent) { component.inject(this) } - - private val versionName: String by lazy { - try { - @Suppress("DEPRECATION") - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionName ?: "" - } catch (e: PackageManager.NameNotFoundException) { - "" - } - } - - private val versionCode: Int by lazy { - try { - @Suppress("DEPRECATION") - activity?.packageManager?.getPackageInfo(activity?.packageName ?: "", 0)?.versionCode ?: 0 - } catch (e: PackageManager.NameNotFoundException) { - 0 - } - } - - private fun sendEmail(subject: String) { - val version = Build.VERSION.SDK_INT - val deviceName = deviceInfo?.name ?: DeviceName.getDeviceName() - val manufacturer = deviceInfo?.manufacturer ?: Build.MANUFACTURER - var bodyOfEmail = "Device: $manufacturer $deviceName" + - " \nAndroid Version: $version"+ - " \nAppVersion: " + getString(R.string.version_info, versionName, versionCode) - - if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) { - bodyOfEmail += " ${appConfigManager.testingLevel().name}" - } - bodyOfEmail += " \nUser ID: $userId" - - val user = this.user - if (user != null) { - bodyOfEmail += " \nLevel: " + (user.stats?.lvl ?: 0) + - " \nClass: " + (if (user.preferences?.disableClasses == true) "Disabled" else (user.stats?.habitClass ?: "None")) + - " \nIs in Inn: " + (user.preferences?.sleep ?: false) + - " \nUses Costume: " + (user.preferences?.costume ?: false) + - " \nCustom Day Start: " + (user.preferences?.dayStart ?: 0) + - " \nTimezone Offset: " + (user.preferences?.timezoneOffset ?: 0) - } - - bodyOfEmail += " \nDetails:\n" - - activity?.let { - val emailIntent = Intent(Intent.ACTION_SENDTO) - val mailto = "mailto:" + appConfigManager.supportEmail() + - "?subject=" + Uri.encode(subject) + - "&body=" + Uri.encode(bodyOfEmail) - emailIntent.data = Uri.parse(mailto); - - startActivity(Intent.createChooser(emailIntent, "Choose an Email client :")) - } - } } \ No newline at end of file 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 3bfc591af..e1d560367 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 @@ -173,7 +173,9 @@ abstract class BaseTaskViewHolder constructor(itemView: View, var scoreTaskFunc: iconViewTag?.visibility = if (data.tags?.size ?: 0 > 0) View.VISIBLE else View.GONE iconViewChallenge?.visibility = if (task?.challengeID != null) View.VISIBLE else View.GONE - + if (task?.challengeID != null) { + iconViewChallenge?.setImageResource(if (task?.challengeBroken?.isNotBlank() == true) R.drawable.task_broken_megaphone else R.drawable.task_megaphone) + } configureSpecialTaskTextView(data) taskIconWrapper?.visibility = if (taskIconWrapperIsVisible) View.VISIBLE else View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt index 9a626c6d7..17ffb9a41 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/HabiticaAlertDialog.kt @@ -31,6 +31,7 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. private var scrollingSeparator: View private var buttonsWrapper: LinearLayout private var noticeTextView: TextView + private var closeButton: Button internal var additionalContentView: View? = null @@ -58,6 +59,8 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. scrollingSeparator = view.findViewById(R.id.scrolling_separator) buttonsWrapper = view.findViewById(R.id.buttons_wrapper) noticeTextView = view.findViewById(R.id.notice_text_view) + closeButton = view.findViewById(R.id.close_button) + closeButton.setOnClickListener { dismiss() } dialogContainer.clipChildren = true dialogContainer.clipToOutline = true } @@ -128,6 +131,10 @@ open class HabiticaAlertDialog(context: Context) : AlertDialog(context, R.style. messageTextView.setPadding(padding, messageTextView.paddingTop, padding, messageTextView.paddingBottom) } + fun setExtraCloseButtonVisibility(visibility: Int) { + closeButton.visibility = visibility + } + private fun updateButtonLayout() { if (isScrollingLayout) { scrollingSeparator.visibility = View.VISIBLE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt index b0e438c68..d087d95c5 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialog.kt @@ -365,6 +365,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop alert.addButton(context.getString(R.string.purchaseX, quantity), false, false) { _, _ -> buyItem(quantity) } + alert.setExtraCloseButtonVisibility(View.VISIBLE) alert.show() } @@ -396,6 +397,12 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop ownedCount += if (mount.owned) 1 else 0 } } + }.flatMap { inventoryRepository.getOwnedItems("eggs") }.doOnNext { + for (egg in it) { + if (egg.key == item.key) { + ownedCount += egg.numberOwned + } + } }.firstElement().subscribe { val remaining = 20 - ownedCount onResult(remaining) @@ -415,12 +422,19 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop ownedCount += if (mount.owned) 1 else 0 } } + }.flatMap { inventoryRepository.getOwnedItems("hatchingPotions") }.doOnNext { + for (potion in it) { + if (potion.key == item.key) { + ownedCount += potion.numberOwned + } + } }.firstElement().subscribe { val remaining = 18 - ownedCount onResult(remaining) } + } else { + onResult(-1) } - onResult(-1) } } 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 08276f405..7a89a3d58 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 @@ -73,6 +73,10 @@ class TaskListDeserializer : JsonDeserializer { task.streak = obj.get("streak")?.asInt if (obj.getAsJsonObject("challenge").has("id")) { task.challengeID = obj.getAsJsonObject("challenge").get("id").asString + + if (obj.getAsJsonObject("challenge").has("broken")) { + task.challengeBroken = obj.getAsJsonObject("challenge").get("broken").asString + } } try { task.counterUp = obj.get("counterUp")?.asInt diff --git a/Habitica/staff/release/output.json b/Habitica/staff/release/output.json new file mode 100644 index 000000000..047acfe0b --- /dev/null +++ b/Habitica/staff/release/output.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.habitrpg.android.habitica", + "variantName": "staffRelease", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "properties": [], + "versionCode": 2439, + "versionName": "2439", + "enabled": true, + "outputFile": "Habitica-staff-release.apk" + } + ] +} \ No newline at end of file