diff --git a/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt b/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt index 1e547b01aa431972d5c25b2410e1fa3169d8a49f..5a5d4ce44d5d0d12e9f6e757e142471f3fa570ca 100644 --- a/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/circles/CirclesFragment.kt @@ -1,14 +1,27 @@ package org.futo.circles.feature.circles +import android.os.Bundle +import android.view.View import androidx.navigation.fragment.findNavController import org.futo.circles.core.rooms.HasInvites import org.futo.circles.core.rooms.RoomsFragment +import org.futo.circles.extensions.observeData +import org.futo.circles.feature.groups.GroupsFragmentDirections +import org.futo.circles.feature.home.HomeViewModel import org.futo.circles.model.RoomListItem +import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.androidx.viewmodel.ext.android.viewModel class CirclesFragment : RoomsFragment(), HasInvites { override val viewModel by viewModel<CirclesViewModel>() + private val homeViewModel by activityViewModel<HomeViewModel>() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + homeViewModel.notificationLiveData.observeData(this) { + findNavController().navigate(GroupsFragmentDirections.toTimeline(it)) + } + } override fun onRoomListItemClicked(room: RoomListItem) { findNavController().navigate(CirclesFragmentDirections.toTimeline(room.id)) diff --git a/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt b/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt index 9bf12dd18e73c387fce6b7aeba457422eee3346f..a75d85f6d0c5ed482791109e74448cd980ef803a 100644 --- a/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/groups/GroupsFragment.kt @@ -1,15 +1,27 @@ package org.futo.circles.feature.groups +import android.os.Bundle +import android.view.View import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import org.futo.circles.core.rooms.HasInvites import org.futo.circles.core.rooms.RoomsFragment +import org.futo.circles.extensions.observeData +import org.futo.circles.feature.home.HomeViewModel import org.futo.circles.model.RoomListItem +import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.androidx.viewmodel.ext.android.viewModel class GroupsFragment : RoomsFragment(), HasInvites { override val viewModel by viewModel<GroupsViewModel>() - + private val homeViewModel by activityViewModel<HomeViewModel>() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + homeViewModel.notificationLiveData.observeData(this){ + findNavController().navigate(GroupsFragmentDirections.toTimeline(it)) + } + } override fun onRoomListItemClicked(room: RoomListItem) { findNavController().navigate(GroupsFragmentDirections.toTimeline(room.id)) } diff --git a/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt b/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt index 3da8e61ce271a9f5c1d6b7f4b5be62073407429b..4273a1299121b7c19c847fa9aadb00dd5c2e8abe 100644 --- a/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/home/HomeFragment.kt @@ -9,6 +9,7 @@ import androidx.annotation.RequiresApi import androidx.fragment.app.Fragment import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.navArgs import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController import by.kirich1409.viewbindingdelegate.viewBinding @@ -17,18 +18,22 @@ import org.futo.circles.core.picker.RuntimePermissionHelper import org.futo.circles.databinding.FragmentBottomNavigationBinding import org.futo.circles.extensions.observeData import org.futo.circles.extensions.setSupportActionBar +import org.futo.circles.model.GROUP_TYPE +import org.futo.circles.provider.MatrixSessionProvider import org.koin.androidx.viewmodel.ext.android.activityViewModel -import org.koin.androidx.viewmodel.ext.android.viewModel +import org.matrix.android.sdk.api.session.getRoomSummary class HomeFragment : Fragment(R.layout.fragment_bottom_navigation) { private val binding by viewBinding(FragmentBottomNavigationBinding::bind) + private val args: HomeFragmentArgs by navArgs() + @RequiresApi(Build.VERSION_CODES.TIRAMISU) private val notificationPermissionHelper = RuntimePermissionHelper(this, Manifest.permission.POST_NOTIFICATIONS) - private val viewModel by viewModel<HomeViewModel>() + private val viewModel by activityViewModel<HomeViewModel>() private val systemNoticesCountViewModel by activityViewModel<SystemNoticesCountSharedViewModel>() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -39,6 +44,17 @@ class HomeFragment : Fragment(R.layout.fragment_bottom_navigation) { } setupObservers() registerPushNotifications() + handleOpenFromNotification() + } + + private fun handleOpenFromNotification() { + val roomId = args.roomId ?: return + val summary = MatrixSessionProvider.currentSession?.getRoomSummary(roomId) ?: return + binding.bottomNavigationView.selectedItemId = + if (summary.roomType == GROUP_TYPE) R.id.groups_nav_graph + else R.id.circles_nav_graph + viewModel.postNotificationData(summary) + arguments?.clear() } private fun setupObservers() { diff --git a/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt b/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt index b016a6c3ba0eb4d6de8d9c0de3ce7b65ad30c6e8..5cdd5867dca3161c401f215fbf83a1edf2fe9e8a 100644 --- a/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt +++ b/app/src/main/java/org/futo/circles/feature/home/HomeViewModel.kt @@ -2,14 +2,30 @@ package org.futo.circles.feature.home import android.content.Context import androidx.lifecycle.ViewModel -import org.futo.circles.feature.notifications.FcmHelper +import org.futo.circles.core.SingleEventLiveData import org.futo.circles.feature.notifications.PushersManager +import org.futo.circles.model.GROUP_TYPE +import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.api.session.room.model.RoomSummary class HomeViewModel( private val pushersManager: PushersManager ) : ViewModel() { + val notificationLiveData = SingleEventLiveData<String>() + fun registerPushNotifications(context: Context) { pushersManager.registerPushNotifications(context) } + + fun postNotificationData(summary: RoomSummary) { + if (summary.roomType == GROUP_TYPE) { + if (summary.membership == Membership.JOIN) notificationLiveData.postValue(summary.roomId) + } else { + if (summary.membership == Membership.JOIN) { + val circleId = summary.spaceParents?.firstOrNull()?.roomSummary?.roomId ?: return + notificationLiveData.postValue(circleId) + } + } + } } \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph_start_host.xml b/app/src/main/res/navigation/nav_graph_start_host.xml index f9176264377eeae6506d9395c95401a11f3c30d5..9d61ae83c0d07e20fd3886d8366f15370eadc938 100644 --- a/app/src/main/res/navigation/nav_graph_start_host.xml +++ b/app/src/main/res/navigation/nav_graph_start_host.xml @@ -56,8 +56,15 @@ <fragment android:id="@+id/bottomNavigationFragment" android:name="org.futo.circles.feature.home.HomeFragment" - android:label="Bottom Navigation" - tools:layout="@layout/fragment_bottom_navigation" /> + tools:layout="@layout/fragment_bottom_navigation"> + + <argument + android:name="roomId" + android:defaultValue="@null" + app:argType="string" + app:nullable="true" /> + + </fragment> <fragment android:id="@+id/setupProfileFragment" android:name="org.futo.circles.feature.sign_up.setup_profile.SetupProfileFragment" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5baeef1879b28721c6f80526f8c52e8206b1ceff..d1b26846af1d7b36b03ead1b30472010914084b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -353,10 +353,6 @@ <string name="encrypted_message">Encrypted message</string> <string name="notice_room_third_party_invite">%1$s sent an invitation to join the room</string> - <string name="notice_room_third_party_invite_by_you">You sent an invitation to %1$s to join the room</string> - <string name="notice_room_third_party_revoked_invite">%1$s revoked the invitation for %2$s to join the room</string> - <string name="notice_room_third_party_revoked_invite_by_you">You revoked the invitation for %1$s to join the room</string> - <string name="event_redacted_by_user_reason_with_reason">Event deleted by user, reason: %1$s</string> <string name="event_redacted_by_admin_reason_with_reason">Event moderated by room admin, reason: %1$s</string> <string name="event_redacted_by_user_reason">Event deleted by user</string> @@ -372,6 +368,7 @@ <item quantity="other">%1$s: %2$d messages</item> </plurals> <string name="notification_room_notifications">Room notifications</string> + <string name="notification_invitations">Invitations</string> <string name="notification_listening_for_events">Listening for events</string> <string name="notification_new_messages">New Messages</string> <string name="action_mark_room_read">Mark as read</string>