From 48c5fc59e3bb4d469445329f09c85979cdd8135c Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Fri, 8 Mar 2019 20:51:20 +0200 Subject: [PATCH 01/27] Add notifications icon to navigation drawer + notifications activity --- Habitica/AndroidManifest.xml | 7 ++++ .../res/drawable-mdpi/menu_notifications.webp | Bin 0 -> 164 bytes .../drawable-xhdpi/menu_notifications.webp | Bin 0 -> 222 bytes .../drawable-xxhdpi/menu_notifications.webp | Bin 0 -> 292 bytes .../res/layout/activity_notifications.xml | 33 +++++++++++++++++ Habitica/res/layout/drawer_main.xml | 35 ++++++++++++++++-- Habitica/res/navigation/navigation.xml | 5 +++ Habitica/res/values/strings.xml | 1 + .../habitica/components/AppComponent.java | 3 ++ .../ui/activities/NotificationsActivity.kt | 29 +++++++++++++++ .../ui/fragments/NavigationDrawerFragment.kt | 2 + 11 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 Habitica/res/drawable-mdpi/menu_notifications.webp create mode 100644 Habitica/res/drawable-xhdpi/menu_notifications.webp create mode 100644 Habitica/res/drawable-xxhdpi/menu_notifications.webp create mode 100644 Habitica/res/layout/activity_notifications.xml create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index f6c45879c..926e9f9f5 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -64,6 +64,13 @@ android:pathPattern="/settings/.*"/> + + ;Na=(7MMAOZ_0KmydXSb!P{Ujl8KnV)|(0wVga zux%S;%<#tWr3#Ydq8g509}4z_LPJV1F9KsT{EPDq^e-<;TVSJf9KQ5$n-3)k(0sc6 Sa3FC#f4Mp$yC+oxsSSY>5kEBm literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xhdpi/menu_notifications.webp b/Habitica/res/drawable-xhdpi/menu_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..91a0ab36178dcea5ab2d498dabcaafa96a8273a5 GIT binary patch literal 222 zcmV<403rWUNk&H200012MM6+kP&iD<0000lC%_31uQ31fKmUpvNm7%`$6p2mC*T5b zL_q>Wa8bcP2m&TP7y=K*LjVE6wvi-7b4<_wn}4py;Jp>me+F*bHj1paxA#2)VBvmf zi02LrfH-LarvRH`3=1@gaL4s_i6P`3*Uk1eXiQx9NvmTRN-U_Yi@u^R=GKCVpJlUo z-|xKtLH+;oT2!$w)d=kDNS7yrXvCGeh5~5)PhZ!z{GT?j@O7ol+td*c_|mb^by4YP YCJ30PxM>EXsN*C04uuJDtvMC~0FT{f4gdfE literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xxhdpi/menu_notifications.webp b/Habitica/res/drawable-xxhdpi/menu_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..e87fc73726520c593d0f4b6de7707c8877776af8 GIT binary patch literal 292 zcmV+<0o(pkNk&E-0RRA3MM6+kP&iBw0RR9mJHQSQ?;wy(?l0Z4nE&}#7)g>DyL;Ql zHUOG|LcxGRVS#`FF@ZQh`~zIzpde7-p}`>_07;S@MN&31GwA;htp=4eynBe~KLfXo z6m6Pg#(4t_Ni%OG$Tl|#PJ|;VFop-Cl~h=|d2|+{w_) zWGEp_Nruz&)(3C=jATNq6z$*gHt9p(A literal 0 HcmV?d00001 diff --git a/Habitica/res/layout/activity_notifications.xml b/Habitica/res/layout/activity_notifications.xml new file mode 100644 index 000000000..0f608d4d1 --- /dev/null +++ b/Habitica/res/layout/activity_notifications.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/drawer_main.xml b/Habitica/res/layout/drawer_main.xml index 0dac86e80..2e1aad976 100644 --- a/Habitica/res/layout/drawer_main.xml +++ b/Habitica/res/layout/drawer_main.xml @@ -12,7 +12,7 @@ android:layout_width="match_parent" android:layout_height="64dp" android:paddingLeft="16dp" - android:paddingRight="16dp" + android:paddingRight="1dp" android:layout_marginTop="16dp" android:gravity="center_vertical" android:orientation="horizontal"> @@ -58,10 +58,39 @@ + + + + + + Open Settings It seems like you have the Developer option \“Don\'t keep Activities\” active. Currently this option causes issues with the habitica app, so we suggest disabling it. Messages + Notifications Frequently Asked Questions Special Because you subscribe to Habitica, you can purchase a number of Gems each month using Gold. diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java index 07de5c536..996add909 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/AppComponent.java @@ -27,6 +27,7 @@ import com.habitrpg.android.habitica.ui.activities.IntroActivity; import com.habitrpg.android.habitica.ui.activities.LoginActivity; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.habitrpg.android.habitica.ui.activities.MaintenanceActivity; +import com.habitrpg.android.habitica.ui.activities.NotificationsActivity; import com.habitrpg.android.habitica.ui.activities.GroupInviteActivity; import com.habitrpg.android.habitica.ui.activities.PrefsActivity; import com.habitrpg.android.habitica.ui.activities.ReportMessageActivity; @@ -133,6 +134,8 @@ public interface AppComponent { void inject(PrefsActivity prefsActivity); + void inject(NotificationsActivity notificationsActivity); + void inject(SetupActivity setupActivity); void inject(SkillTasksActivity skillTasksActivity); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt new file mode 100644 index 000000000..b1b4e8185 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -0,0 +1,29 @@ +package com.habitrpg.android.habitica.ui.activities + +import android.os.Bundle +import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.components.AppComponent +import kotlinx.android.synthetic.main.activity_notifications.* + +class NotificationsActivity : BaseActivity() { + + override fun getLayoutResId(): Int = R.layout.activity_notifications + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setupToolbar(toolbar) + } + + override fun injectActivity(component: AppComponent?) { + component?.inject(this) + } + + override fun onSupportNavigateUp(): Boolean { + if (supportFragmentManager.backStackEntryCount > 0) { + onBackPressed() + return true + } + return super.onSupportNavigateUp() + } +} 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 5ca92abc9..5c9531386 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 @@ -97,6 +97,7 @@ class NavigationDrawerFragment : DialogFragment() { messagesBadge.visibility = View.GONE settingsBadge.visibility = View.GONE + notificationsBadge.visibility = View.GONE /* Reenable this once the boss art can be displayed correctly. @@ -192,6 +193,7 @@ class NavigationDrawerFragment : DialogFragment() { messagesButtonWrapper.setOnClickListener { setSelection(R.id.inboxFragment) } settingsButtonWrapper.setOnClickListener { setSelection(R.id.prefsActivity) } + notificationsButtonWrapper.setOnClickListener { setSelection(R.id.notificationsActivity) } } override fun onDestroy() { From e232a9b016e4020f81da55953ba86edccd0a4bd0 Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Sun, 17 Mar 2019 21:45:04 +0200 Subject: [PATCH 02/27] Deserialize notifications from User model --- .../notifications/GlobalNotification.java | 21 +++++++++++++++++++ .../android/habitica/models/user/User.kt | 3 +++ .../habitica/utils/UserDeserializer.kt | 6 ++++++ 3 files changed, 30 insertions(+) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GlobalNotification.java diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GlobalNotification.java b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GlobalNotification.java new file mode 100644 index 000000000..0dd8067b1 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/notifications/GlobalNotification.java @@ -0,0 +1,21 @@ +package com.habitrpg.android.habitica.models.notifications; + +import io.realm.RealmObject; +import io.realm.annotations.PrimaryKey; + +/** + * Represents Habitica "Global notifications", i.e. the notifications about chat messages + * (in Guilds and Party), Party & Quest invitations, unallocated stat points etc. + * + * These are different from other kind of notifications, such as Push notifications and + * Popup notifications. + */ +public class GlobalNotification extends RealmObject { + + @PrimaryKey + public String id; + + public String type; + public boolean seen; + // TODO data +} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt index bf9ab3912..6707784c7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/user/User.kt @@ -5,6 +5,7 @@ import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.PushDevice import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.invitations.Invitations +import com.habitrpg.android.habitica.models.notifications.GlobalNotification import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.tasks.TaskList @@ -122,6 +123,8 @@ open class User : RealmObject(), Avatar { @Ignore var pushDevices: List? = null + var notifications = RealmList() + var purchased: Purchases? = null set(purchased) { field = purchased diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt index 689724bc6..052766700 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt @@ -11,6 +11,7 @@ import com.habitrpg.android.habitica.models.PushDevice import com.habitrpg.android.habitica.models.Tag import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.invitations.Invitations +import com.habitrpg.android.habitica.models.notifications.GlobalNotification import com.habitrpg.android.habitica.models.social.ChallengeMembership import com.habitrpg.android.habitica.models.social.UserParty import com.habitrpg.android.habitica.models.tasks.TasksOrder @@ -109,6 +110,11 @@ class UserDeserializer : JsonDeserializer { .forEach { (user.pushDevices as? ArrayList)?.add(it) } } + if (obj.has("notifications")) { + user.notifications = context.deserialize(obj.get("notifications"), object: TypeToken>() { + }.type) + } + if (obj.has("lastCron")) { user.lastCron = context.deserialize(obj.get("lastCron"), Date::class.java) } From 15a352982b80bbf485c6467c93b8b3180738744c Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Sun, 17 Mar 2019 21:47:24 +0200 Subject: [PATCH 03/27] Set notifications count to badge in drawer --- .../android/habitica/ui/activities/MainActivity.kt | 1 + .../habitica/ui/fragments/NavigationDrawerFragment.kt | 9 +++++++++ 2 files changed, 10 insertions(+) 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 f95e2e1cf..ce0386af1 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 @@ -374,6 +374,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction { displayDeathDialogIfNeeded() YesterdailyDialog.showDialogIfNeeded(this, user?.id, userRepository, taskRepository) + drawerFragment?.setNotificationsCount(this.user?.notifications?.count() ?: 0) drawerFragment?.setMessagesCount(this.user?.inbox?.newMessages ?: 0) drawerFragment?.setSettingsCount(if (this.user?.flags?.isVerifiedUsername != true) 1 else 0 ) 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 5c9531386..93c9cf919 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 @@ -306,6 +306,15 @@ class NavigationDrawerFragment : DialogFragment() { outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition) } + fun setNotificationsCount(unreadNotifications: Int) { + if (unreadNotifications == 0) { + notificationsBadge.visibility = View.GONE + } else { + notificationsBadge.visibility = View.VISIBLE + notificationsBadge.text = unreadNotifications.toString() + } + } + fun setMessagesCount(unreadMessages: Int) { if (unreadMessages == 0) { messagesBadge.visibility = View.GONE From 6c09f32e6303413ff66d7039c3a646e1a7a90d2a Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Sun, 17 Mar 2019 22:54:58 +0200 Subject: [PATCH 04/27] Load notifications on activity create + add swipe refresh --- .../res/layout/activity_notifications.xml | 21 ++++++++++++ .../ui/activities/NotificationsActivity.kt | 34 ++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/Habitica/res/layout/activity_notifications.xml b/Habitica/res/layout/activity_notifications.xml index 0f608d4d1..af76a967a 100644 --- a/Habitica/res/layout/activity_notifications.xml +++ b/Habitica/res/layout/activity_notifications.xml @@ -27,7 +27,28 @@ android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:layout_gravity="top|center" > + + + + + + \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index b1b4e8185..8e3c1a432 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -3,9 +3,18 @@ package com.habitrpg.android.habitica.ui.activities import android.os.Bundle import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent +import com.habitrpg.android.habitica.data.UserRepository +import com.habitrpg.android.habitica.helpers.RxErrorHandler +import com.habitrpg.android.habitica.models.notifications.GlobalNotification +import com.habitrpg.android.habitica.models.user.User +import io.reactivex.functions.Consumer +import io.realm.RealmList import kotlinx.android.synthetic.main.activity_notifications.* +import javax.inject.Inject -class NotificationsActivity : BaseActivity() { +class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener { + @Inject + lateinit var userRepository: UserRepository override fun getLayoutResId(): Int = R.layout.activity_notifications @@ -13,6 +22,17 @@ class NotificationsActivity : BaseActivity() { super.onCreate(savedInstanceState) setupToolbar(toolbar) + + compositeSubscription.add(userRepository.getUser().subscribe(Consumer { + this.setNotifications(it.notifications) + }, RxErrorHandler.handleEmptyError())) + + notifications_refresh_layout?.setOnRefreshListener(this) + } + + override fun onDestroy() { + userRepository.close() + super.onDestroy() } override fun injectActivity(component: AppComponent?) { @@ -26,4 +46,16 @@ class NotificationsActivity : BaseActivity() { } return super.onSupportNavigateUp() } + + override fun onRefresh() { + notifications_refresh_layout.isRefreshing = true + + compositeSubscription.add(userRepository.retrieveUser(false, true).subscribe(Consumer { + notifications_refresh_layout.isRefreshing = false + }, RxErrorHandler.handleEmptyError())) + } + + private fun setNotifications(notifications: RealmList) { + //TODO("not implemented") + } } From 4c2a48ae698f7cd026a25f48f2781cbbc124ca38 Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Tue, 19 Mar 2019 00:07:49 +0200 Subject: [PATCH 05/27] Implement "no notifications" view, display when notifications list empty --- .../res/drawable-hdpi/no_notifications.webp | Bin 0 -> 4104 bytes .../res/drawable-mdpi/no_notifications.webp | Bin 0 -> 2906 bytes .../res/drawable-xhdpi/no_notifications.webp | Bin 0 -> 5244 bytes .../res/drawable-xxhdpi/no_notifications.webp | Bin 0 -> 7830 bytes Habitica/res/layout/no_notifications.xml | 53 ++++++++++++++++++ Habitica/res/values/strings.xml | 2 + .../ui/activities/NotificationsActivity.kt | 15 +++++ 7 files changed, 70 insertions(+) create mode 100644 Habitica/res/drawable-hdpi/no_notifications.webp create mode 100644 Habitica/res/drawable-mdpi/no_notifications.webp create mode 100644 Habitica/res/drawable-xhdpi/no_notifications.webp create mode 100644 Habitica/res/drawable-xxhdpi/no_notifications.webp create mode 100644 Habitica/res/layout/no_notifications.xml diff --git a/Habitica/res/drawable-hdpi/no_notifications.webp b/Habitica/res/drawable-hdpi/no_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..1e802b41e8a46bc696242abd7cfda47d16710441 GIT binary patch literal 4104 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 G^b7#B2=fX6 literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-mdpi/no_notifications.webp b/Habitica/res/drawable-mdpi/no_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..4c3c2c79be521950927733fed4f3a9ac282c3500 GIT binary patch literal 2906 zcmV-g3#If@Nk&Fe3jhFDMM6+kP&iCQ3jhEwS-~L?D!TRmJFb)}H{UliPiyfe-VU%M zJmj7=bEUUN^YGrYM)wNup$HwM(d@lb*>wgd{G2t^zUAoY|$Lloc|cp<)u zceVfyEs&`MDsk12ZUbcKAidW1wrw`^_kL7M4?aLh??wN!fo4btK=W*#O zwr$(GuD$yOI@;d7*((W>Bu7%pv(Qk9hCTJiYX4hhiMCWYoxPM{c!-6H8iA+y2vMc6 zuhiMoX~f0`;%FOoF;G!m7$P+G3dg^;fC2*HsCHw3LTLqq~MW#jj=Y^oBeRSoJ$gT5MG=rlv9cWmkn*$7-V zRg7br@u5k87>33G6G6+SVmaPP5PIQf zqaFe<27I)RLStYq%+MO55VR6>f*tdeO-}~jDxG9>?1oN8$A&&52mz~^sxX1y+Iku~ z{62W@G<3q638gkJ1^yNJ5416mn=@gkHxzWa0|tR=8ajT{(*@vv?PvHOm>Ydyp#2#b zP)!X-;OhEY8Kv)>+9lc%t0R=VH{tpjla)%v#CF0n{ica<0g*>)J>yd+ zZ|2mx;9|;@-IWw6wX$x+%V|U~J_T(OD%iyKRI*H33Ghnann~2geN^L-&6x4vq%|XD zca3jPv#gN))*jKcH@&@Kz(=N~Lw|o)6ets60h4ySBjaGxJ^SUGbTTbJ^nm)Me8yZ}F#k*AavH`CIIme}^tiLe~xgK^n( zM!xyRWv!ys5U{K=iHfeKJo!VGI6aEn+PIQ`ALxD#?T<1$?)LC``H6I)ox3Znn+k|Ykd&tF}j zT*|4c=)jD3(=}rtL4x4#vI&9>vP{Y@-o*4}CyJ@r6+wgKGad=qaho2wvGJFqN){&m zHqAKXChHskx!3{jBgJrlc}%>xJ+HIk$+mdhSVvPzOplYBa8CG8+t z>SI|qveT3`nY-LVnz&H$=VC5qbU!7QL6A*_vvKtAJH8tZ0p*l7$@}NfNZ;?`XF`nXWLOK-30?y{$c$SLq{tgxN`~^Hq zjbAe*9#qh`+wv?Ge_<25K?UU;90+FgmrZ1a3aV{ioWnn-*c-Z;NF13EokWw*n1h=w^bzGN+(INQc|rXnIvgtHN&dvf_y-Y`ch^QD7XW4Xn05hDc(^?20E3 zA6Fx<&p?+?I;w`kV)$dg#(-L4#q3JRqN^Dv{~lMHefI_JGS%3&2}hxpUGe1Q<7zd> z7y5`~P1u{1VvQ9wkt9)FpA-NE8Z$a97A1u9AXBP=&yg%m)v6U*-t|S{ps-`kNxR7i z-$7=)2)`pq>Z{#jo!<1eA)?Te5pNFqfR&o+9z`N*DEx%u)j=O1Nu&q_qFK<{nd=}m zexpuL#}v!`O#G6kl2Se2m_YassucdznDH5|K70pto>C$_ltNi>CncWYYQuSOJ&ic5 zQF}mHaApu!7v6&rqN-fh7#K@X6`9DveXx-OmvXtR5!)JwRT_1XMxABQS3^li%9^S5 zjL%!TfkANDp@CTX57dN=2pnw70ZSwHIkth=G%_!UP!-}4I5;Y=0G&arV_zMHhjgfb z-sMulS4KSikE^v|7t@wOrSsDoh!s!)N5x8M+coZ50+I2! zT3Zf08`-xZ*jc$0-05^BcQ1it4vGum{06bA?ZC(R>*=gR?^nK6&UVfd|^hlP$O^Md8ZX+a>rOIA@Ope zy|Tt%j3>84k;IY|-D!o4#p{A1Ty3EF;ua_pQcfKtbY!Xz7qEnG1If)pph~P*Dtgsl zkd$&KQlnok%ft_Vg<@K8ngnf|v&{I)Ldq;Cr=jaIqZ`cV!$H*e2@{>9rewrw|63&r E0G!rowg3PC literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xhdpi/no_notifications.webp b/Habitica/res/drawable-xhdpi/no_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..7ff2e5ff58c23024fc2c2bdd54743539e1dd6245 GIT binary patch literal 5244 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 Cg!c>p literal 0 HcmV?d00001 diff --git a/Habitica/res/drawable-xxhdpi/no_notifications.webp b/Habitica/res/drawable-xxhdpi/no_notifications.webp new file mode 100644 index 0000000000000000000000000000000000000000..33e395308230cc3404ad00bc5ab15871085a3ef3 GIT binary patch literal 7830 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 literal 0 HcmV?d00001 diff --git a/Habitica/res/layout/no_notifications.xml b/Habitica/res/layout/no_notifications.xml new file mode 100644 index 000000000..55e30f61b --- /dev/null +++ b/Habitica/res/layout/no_notifications.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index 5fa9619bc..fe2ad50db 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -860,6 +860,8 @@ Discover Damage paused Important Announcements + You’re all caught up! + The notification fairies give you a raucous round of applause! Well done! Create Only leader can create Challenges Create Party diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt index 8e3c1a432..85b522978 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/NotificationsActivity.kt @@ -1,6 +1,8 @@ package com.habitrpg.android.habitica.ui.activities +import android.content.Context import android.os.Bundle +import android.view.LayoutInflater import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.components.AppComponent import com.habitrpg.android.habitica.data.UserRepository @@ -56,6 +58,19 @@ class NotificationsActivity : BaseActivity(), androidx.swiperefreshlayout.widget } private fun setNotifications(notifications: RealmList) { + if (notification_items == null) { + return + } + + notification_items.removeAllViewsInLayout() + + val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater + if (notifications.isEmpty()) { + val item = inflater?.inflate(R.layout.no_notifications, notification_items, false) + notification_items.addView(item) + return + } + //TODO("not implemented") } } From 60abfe12accc7b82afcb13eb67a3afd637464310 Mon Sep 17 00:00:00 2001 From: Carl Vuorinen Date: Mon, 1 Apr 2019 23:18:20 +0300 Subject: [PATCH 06/27] Notifications view header with title, badge with count + dismiss all button --- Habitica/res/drawable/badge_gray.xml | 13 +++++ .../res/layout/activity_notifications.xml | 51 ++++++++++--------- Habitica/res/layout/no_notifications.xml | 11 ++-- Habitica/res/layout/notifications_header.xml | 50 ++++++++++++++++++ Habitica/res/values/strings.xml | 1 + .../ui/activities/NotificationsActivity.kt | 10 +++- 6 files changed, 103 insertions(+), 33 deletions(-) create mode 100644 Habitica/res/drawable/badge_gray.xml create mode 100644 Habitica/res/layout/notifications_header.xml diff --git a/Habitica/res/drawable/badge_gray.xml b/Habitica/res/drawable/badge_gray.xml new file mode 100644 index 000000000..b350748be --- /dev/null +++ b/Habitica/res/drawable/badge_gray.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Habitica/res/layout/activity_notifications.xml b/Habitica/res/layout/activity_notifications.xml index af76a967a..7cca95d2b 100644 --- a/Habitica/res/layout/activity_notifications.xml +++ b/Habitica/res/layout/activity_notifications.xml @@ -1,34 +1,35 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context=".ui.activities.NotificationsActivity"> - + + + android:layout_height="wrap_content" + android:minHeight="?attr/actionBarSize" + android:theme="@style/Toolbar" + app:layout_scrollFlags="scroll|enterAlways" + app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" /> - + - - + + + - + android:orientation="vertical" + android:showDividers="middle"> - \ No newline at end of file + diff --git a/Habitica/res/layout/no_notifications.xml b/Habitica/res/layout/no_notifications.xml index 55e30f61b..9cc429f9c 100644 --- a/Habitica/res/layout/no_notifications.xml +++ b/Habitica/res/layout/no_notifications.xml @@ -1,9 +1,8 @@ + android:paddingLeft="40dp" + android:paddingTop="26dp" + android:paddingRight="40dp"> - \ No newline at end of file + diff --git a/Habitica/res/layout/notifications_header.xml b/Habitica/res/layout/notifications_header.xml new file mode 100644 index 000000000..8e96795c5 --- /dev/null +++ b/Habitica/res/layout/notifications_header.xml @@ -0,0 +1,50 @@ + + + + + + + + + + +