Signal-Android/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/notifications/manual/NotificationProfileSelectio...

88 wiersze
3.6 KiB
Kotlin

package org.thoughtcrime.securesms.components.settings.app.notifications.manual
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels
import org.signal.core.util.DimensionUnit
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity
import org.thoughtcrime.securesms.components.settings.app.notifications.manual.models.NotificationProfileSelection
import org.thoughtcrime.securesms.components.settings.app.notifications.profiles.NotificationProfilesRepository
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfiles
import org.thoughtcrime.securesms.util.BottomSheetUtil
/**
* BottomSheetDialogFragment that allows a user to select a notification profile to manually enable/disable.
*/
class NotificationProfileSelectionFragment : DSLSettingsBottomSheetFragment() {
private val viewModel: NotificationProfileSelectionViewModel by viewModels(
factoryProducer = {
NotificationProfileSelectionViewModel.Factory(NotificationProfilesRepository())
}
)
override fun bindAdapter(adapter: DSLSettingsAdapter) {
NotificationProfileSelection.register(adapter)
recyclerView.itemAnimator = null
viewModel.state.observe(viewLifecycleOwner) {
adapter.submitList(getConfiguration(it).toMappingModelList())
}
}
private fun getConfiguration(state: NotificationProfileSelectionState): DSLConfiguration {
val activeProfile: NotificationProfile? = NotificationProfiles.getActiveProfile(state.notificationProfiles)
return configure {
state.notificationProfiles.forEach { profile ->
customPref(
NotificationProfileSelection.Entry(
isOn = profile == activeProfile,
summary = if (profile == activeProfile) DSLSettingsText.from(NotificationProfiles.getActiveProfileDescription(requireContext(), profile)) else DSLSettingsText.from(R.string.NotificationProfileDetails__off),
notificationProfile = profile,
isExpanded = profile.id == state.expandedId,
timeSlotB = state.timeSlotB,
onRowClick = viewModel::toggleEnabled,
onTimeSlotAClick = viewModel::enableForOneHour,
onTimeSlotBClick = viewModel::enableUntil,
onToggleClick = viewModel::setExpanded,
onViewSettingsClick = { navigateToSettings(it) }
)
)
space(DimensionUnit.DP.toPixels(16f).toInt())
}
customPref(
NotificationProfileSelection.New(
onClick = {
startActivity(AppSettingsActivity.createNotificationProfile(requireContext()))
dismissAllowingStateLoss()
}
)
)
space(DimensionUnit.DP.toPixels(20f).toInt())
}
}
private fun navigateToSettings(notificationProfile: NotificationProfile) {
startActivity(AppSettingsActivity.notificationProfileDetails(requireContext(), notificationProfile.id))
dismissAllowingStateLoss()
}
companion object {
@JvmStatic
fun show(fragmentManager: FragmentManager) {
NotificationProfileSelectionFragment().show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
}
}
}