Skip to content
Snippets Groups Projects
Commit d5c9df38 authored by Taras's avatar Taras
Browse files

Create dialog fragment for timeline options

parent 9acdb9e0
No related branches found
No related tags found
No related merge requests found
package org.futo.circles.feature.timeline.options
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.navArgs
import dagger.hilt.android.AndroidEntryPoint
import org.futo.circles.R
import org.futo.circles.core.extensions.isCurrentUserAbleToChangeSettings
import org.futo.circles.core.extensions.isCurrentUserAbleToInvite
import org.futo.circles.core.extensions.isCurrentUserOnlyAdmin
import org.futo.circles.core.extensions.observeData
import org.futo.circles.core.extensions.observeResponse
import org.futo.circles.core.extensions.onBackPressed
import org.futo.circles.core.extensions.setIsVisible
import org.futo.circles.core.extensions.showDialog
import org.futo.circles.core.extensions.withConfirmation
import org.futo.circles.core.fragment.BaseFullscreenDialogFragment
import org.futo.circles.core.model.CircleRoomTypeArg
import org.futo.circles.core.provider.PreferencesProvider
import org.futo.circles.core.utils.getTimelineRoomFor
import org.futo.circles.databinding.DialogFragmentTimelineOptionsBinding
import org.futo.circles.model.DeleteCircle
import org.futo.circles.model.DeleteGroup
import org.futo.circles.model.LeaveGroup
@AndroidEntryPoint
class TimelineOptionsDialogFragment :
BaseFullscreenDialogFragment(DialogFragmentTimelineOptionsBinding::inflate) {
private val binding by lazy {
getBinding() as DialogFragmentTimelineOptionsBinding
}
private val args: TimelineOptionsDialogFragmentArgs by navArgs()
private val isGroupMode by lazy { args.type == CircleRoomTypeArg.Group }
private val timelineId by lazy {
if (isGroupMode) args.roomId
else getTimelineRoomFor(args.roomId)?.roomId ?: throw IllegalArgumentException(
"Timeline not found"
)
}
private val viewModel by viewModels<TimelineOptionsViewModel>()
private val preferencesProvider by lazy { PreferencesProvider(requireContext()) }
private val navigator by lazy { TimelineOptionsNavigator(this) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
setupObservers()
}
private fun setupViews() {
with(binding) {
tvConfigure.apply {
setText(
getString(if (isGroupMode) R.string.configure_group else R.string.configure_circle)
)
setOnClickListener { navigator.navigateToUpdateRoom(args.roomId, args.type) }
}
tvDelete.apply {
text = getString(if (isGroupMode) R.string.delete_group else R.string.delete_circle)
setOnClickListener {
withConfirmation(if (isGroupMode) DeleteGroup() else DeleteCircle()) {
viewModel.delete(isGroupMode)
}
}
}
tvStateEvents.apply {
setIsVisible(preferencesProvider.isDeveloperModeEnabled())
setOnClickListener { navigator.navigateToStateEvents(timelineId) }
}
tvInviteMembers.apply {
setText(getString(if (isGroupMode) R.string.invite_members else R.string.invite_followers))
setOnClickListener { navigator.navigateToInviteMembers(timelineId) }
}
tvLeave.apply {
setIsVisible(isGroupMode)
setOnClickListener { showLeaveGroupDialog() }
}
tvShare.setOnClickListener { navigator.navigateToShareRoom(timelineId) }
tvManageMembers.apply {
setIsVisible(isGroupMode)
setOnClickListener { navigator.navigateToManageMembers(timelineId, args.type) }
}
tvMyFollowers.apply {
setIsVisible(isGroupMode.not())
setOnClickListener { navigator.navigateToManageMembers(timelineId, args.type) }
}
tvPeopleImFollowing.apply {
setIsVisible(isGroupMode.not())
setOnClickListener { navigator.navigateToFollowing(args.roomId) }
}
}
}
private fun setupObservers() {
viewModel.leaveDeleteEventLiveData.observeResponse(this, success = { onBackPressed() })
viewModel.accessLevelLiveData.observeData(this) { groupPowerLevelsContent ->
if (!isGroupMode) return@observeData
with(binding) {
tvConfigure.setIsVisible(groupPowerLevelsContent.isCurrentUserAbleToChangeSettings())
tvInviteMembers.setIsVisible(groupPowerLevelsContent.isCurrentUserAbleToInvite())
tvDelete.setIsVisible(groupPowerLevelsContent.isCurrentUserOnlyAdmin(args.roomId))
}
}
}
private fun showLeaveGroupDialog() {
if (viewModel.canLeaveRoom()) {
withConfirmation(LeaveGroup()) { viewModel.leaveGroup() }
} else {
showDialog(
titleResIdRes = R.string.leave_group,
messageResId = R.string.select_another_admin_message
)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="0dp"
android:layout_height="?attr/actionBarSize"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="?attr/homeAsUpIndicator"
app:titleCentered="true"
tools:title="Room name" />
<View
android:id="@+id/divider"
android:layout_width="0dp"
android:layout_height="@dimen/divider_height"
android:background="@color/divider_color"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/ivCover"
android:layout_width="@dimen/group_icon_size"
android:layout_height="@dimen/group_icon_size"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:clickable="true"
android:focusable="true"
android:scaleType="centerCrop"
app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.GroupIconRadius"
tools:background="@color/highlight_color" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/lPushNotifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="?selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal">
<TextView
android:id="@+id/tvPushNotifications"
style="@style/settingMenuItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/push_notifications"
app:drawableStartCompat="@drawable/ic_notifications"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/svPushNotifications"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:clickable="false"
android:focusable="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/divider_height"
android:layout_marginHorizontal="8dp"
android:background="@color/divider_color" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvShare"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_share"
app:optionName="@string/share" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvStateEvents"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_info"
app:optionName="@string/state_events" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvConfigure"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_settings"
app:optionName="@string/configure_group" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvManageMembers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_round_people"
app:optionName="@string/manage_members" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvMyFollowers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_outline_people"
app:optionName="@string/my_followers" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvPeopleImFollowing"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_round_people"
app:optionName="@string/people_i_m_following" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvInviteMembers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_invite"
app:optionName="@string/invite_members" />
<org.futo.circles.view.SettingsMenuItemView
android:id="@+id/tvLeave"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:optionIcon="@drawable/ic_logout"
app:optionName="@string/leave_group" />
<TextView
android:id="@+id/tvDelete"
style="@style/settingMenuItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/delete"
android:textColor="@color/red"
app:drawableStartCompat="@drawable/ic_delete"
app:drawableTint="@color/red" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment