diff --git a/app/src/main/java/com/futo/circles/di/DataSourceModule.kt b/app/src/main/java/com/futo/circles/di/DataSourceModule.kt index 7c02aab1173deb07cca6112cd5cfd5e243ffabb1..4d058aa7dbb5ac391550603c7a4499a865f49f09 100644 --- a/app/src/main/java/com/futo/circles/di/DataSourceModule.kt +++ b/app/src/main/java/com/futo/circles/di/DataSourceModule.kt @@ -2,6 +2,7 @@ package com.futo.circles.di import com.futo.circles.ui.groups.timeline.data_source.GroupTimelineBuilder import com.futo.circles.ui.groups.timeline.data_source.GroupTimelineDatasource +import com.futo.circles.ui.groups.timeline.invite.data_source.InviteMembersDataSource import com.futo.circles.ui.log_in.data_source.LoginDataSource import org.koin.dsl.module @@ -11,4 +12,6 @@ val dataSourceModule = module { factory { (roomId: String) -> GroupTimelineDatasource(roomId, get()) } factory { GroupTimelineBuilder() } + + factory { (roomId: String) -> InviteMembersDataSource(roomId, get()) } } \ No newline at end of file diff --git a/app/src/main/java/com/futo/circles/di/UiModule.kt b/app/src/main/java/com/futo/circles/di/UiModule.kt index f866568372e9371adaf2dcb7c84b98c82de18411..ab3497df8a27fbf01a1ba3ea8567dfc09075c816 100644 --- a/app/src/main/java/com/futo/circles/di/UiModule.kt +++ b/app/src/main/java/com/futo/circles/di/UiModule.kt @@ -2,6 +2,7 @@ package com.futo.circles.di import com.futo.circles.ui.groups.GroupsViewModel import com.futo.circles.ui.groups.timeline.GroupTimelineViewModel +import com.futo.circles.ui.groups.timeline.invite.InviteMembersViewModel import com.futo.circles.ui.log_in.LogInViewModel import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.parameter.parametersOf @@ -11,4 +12,5 @@ val uiModule = module { viewModel { LogInViewModel(get()) } viewModel { GroupsViewModel() } viewModel { (roomId: String) -> GroupTimelineViewModel(get { parametersOf(roomId) }) } + viewModel { (roomId: String) -> InviteMembersViewModel(get { parametersOf(roomId) }) } } \ No newline at end of file diff --git a/app/src/main/java/com/futo/circles/ui/groups/timeline/GroupTimelineFragment.kt b/app/src/main/java/com/futo/circles/ui/groups/timeline/GroupTimelineFragment.kt index 8964599d8764a06c3cea9c9dadcdd23a927cd09a..b679d05c2ae118ce34804cff0a9922358fb4b7cf 100644 --- a/app/src/main/java/com/futo/circles/ui/groups/timeline/GroupTimelineFragment.kt +++ b/app/src/main/java/com/futo/circles/ui/groups/timeline/GroupTimelineFragment.kt @@ -1,8 +1,14 @@ package com.futo.circles.ui.groups.timeline +import android.annotation.SuppressLint import android.os.Bundle +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem import android.view.View +import androidx.appcompat.view.menu.MenuBuilder import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import by.kirich1409.viewbindingdelegate.viewBinding import com.futo.circles.R @@ -19,6 +25,7 @@ import com.futo.circles.ui.view.GroupPostListener import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf + class GroupTimelineFragment : Fragment(R.layout.group_timeline_fragment), GroupPostListener { private val args: GroupTimelineFragmentArgs by navArgs() @@ -31,6 +38,7 @@ class GroupTimelineFragment : Fragment(R.layout.group_timeline_fragment), GroupP override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setHasOptionsMenu(true) binding.tvGroupTimeline.apply { adapter = listAdapter @@ -44,6 +52,32 @@ class GroupTimelineFragment : Fragment(R.layout.group_timeline_fragment), GroupP setupObservers() } + @SuppressLint("RestrictedApi") + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + menu.clear() + (menu as? MenuBuilder)?.setOptionalIconsVisible(true) + inflater.inflate(R.menu.group_timeline_menu, menu) + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.inviteMembers -> { + navigateToInviteMembers() + return true + } + } + return super.onOptionsItemSelected(item) + } + + private fun navigateToInviteMembers() { + findNavController().navigate( + GroupTimelineFragmentDirections.actionGroupTimelineFragmentToInviteMembersDialogFragment( + args.roomId + ) + ) + } + private fun setupObservers() { with(viewModel) { titleLiveData.observeData(this@GroupTimelineFragment) { title -> setToolbarTitle(title) } diff --git a/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/InviteMembersViewModel.kt b/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/InviteMembersViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..60ceb2d1aca11cb8af8c8a75814005c903cb428e --- /dev/null +++ b/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/InviteMembersViewModel.kt @@ -0,0 +1,14 @@ +package com.futo.circles.ui.groups.timeline.invite + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.futo.circles.ui.groups.timeline.invite.data_source.InviteMembersDataSource + +class InviteMembersViewModel( + private val dataSource: InviteMembersDataSource +) : ViewModel() { + + val titleLiveData = MutableLiveData(dataSource.getInviteTitle()) + + +} \ No newline at end of file diff --git a/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/data_source/InviteMembersDataSource.kt b/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/data_source/InviteMembersDataSource.kt new file mode 100644 index 0000000000000000000000000000000000000000..4073535e8a9e7ee303a2020115bc2ea4bdd397e7 --- /dev/null +++ b/app/src/main/java/com/futo/circles/ui/groups/timeline/invite/data_source/InviteMembersDataSource.kt @@ -0,0 +1,21 @@ +package com.futo.circles.ui.groups.timeline.invite.data_source + +import android.content.Context +import com.futo.circles.R +import com.futo.circles.extensions.nameOrId +import com.futo.circles.provider.MatrixSessionProvider +import org.matrix.android.sdk.api.session.room.timeline.Timeline + +class InviteMembersDataSource( + private val roomId: String, + private val context: Context +) : Timeline.Listener { + + private val room = MatrixSessionProvider.currentSession?.getRoom(roomId) + + fun getInviteTitle() = context.getString( + R.string.invite_members_to_format, + room?.roomSummary()?.nameOrId() ?: roomId + ) + +} \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1c5fa8ee8a31bf1a0fe00d36e39464b1aedeaeb2..1aa6df8883c85bc348ecc6e8ac04e0f66284b8b0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -18,5 +18,6 @@ <color name="pink">#FF2D55</color> <color name="divider_color">#ddd</color> <color name="gray">#8E8E93</color> + <color name="inactive_menu_icon_color">#99000000</color> </resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e2137b5289527d5e89a7729edfba4c60d3f2a08..d7fa7a453a980c3889ba8a1d57b318fc9556c998 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,9 @@ <string name="share">Share</string> <string name="hide_replies">Hide replies</string> + <string name="invite_members">Invite members</string> + <string name="invite_members_to_format">Invite members to %s</string> + <plurals name="member_plurals"> <item quantity="one">%d member</item> <item quantity="other">%d members</item> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d7bf13054ddff5ce94281bea2d6eb72d00cf9041..0ddfeee5c88a2b6395ba1245cb22c8892a092a12 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,4 @@ -<resources xmlns:tools="http://schemas.android.com/tools"> +<resources> <!-- Base application theme. --> <style name="Theme.Circles" parent="Theme.MaterialComponents.Light.NoActionBar"> <!-- Primary brand color. -->