diff --git a/app/src/main/java/se/ajpanton/notificationlog/EventSettingsFragment.kt b/app/src/main/java/se/ajpanton/notificationlog/EventSettingsFragment.kt new file mode 100644 index 0000000..2f3b311 --- /dev/null +++ b/app/src/main/java/se/ajpanton/notificationlog/EventSettingsFragment.kt @@ -0,0 +1,70 @@ +package se.ajpanton.notificationlog + +import android.os.Bundle +import android.view.View +import androidx.annotation.StringRes +import androidx.fragment.app.Fragment +import se.ajpanton.notificationlog.databinding.FragmentEventSettingsBinding +import se.ajpanton.notificationlog.settings.AppRuleMode +import se.ajpanton.notificationlog.settings.LoggingRuleStore +import se.ajpanton.notificationlog.settings.LoggingType + +class EventSettingsFragment : Fragment(R.layout.fragment_event_settings) { + private var binding: FragmentEventSettingsBinding? = null + private lateinit var type: LoggingType + private lateinit var store: LoggingRuleStore + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentEventSettingsBinding.bind(view) + type = requireArguments().getSerializable(ARG_TYPE, LoggingType::class.java)!! + store = LoggingRuleStore(requireContext()) + binding!!.pageTitle.setText(requireArguments().getInt(ARG_TITLE)) + bindRule() + } + + override fun onDestroyView() { binding = null; super.onDestroyView() } + + private fun bindRule() { + val rule = store.ruleFor(type) + listOf( + binding!!.masterToggle, + binding!!.appRuleToggle, + binding!!.onlySeenToggle, + binding!!.seenFirstToggle, + binding!!.routineUpdatesToggle, + ).forEach { it.setOnCheckedChangeListener(null) } + binding!!.masterToggle.isChecked = rule.enabled + binding!!.appRuleToggle.isChecked = rule.appRuleMode == AppRuleMode.WHITELIST + binding!!.onlySeenToggle.isChecked = rule.onlySeenApps + binding!!.seenFirstToggle.isChecked = rule.seenAppsFirst + binding!!.seenFirstToggle.isEnabled = !rule.onlySeenApps + binding!!.routineUpdatesToggle.visibility = if (type == LoggingType.EDITS) View.VISIBLE else View.GONE + binding!!.routineUpdatesToggle.isChecked = rule.ignoreRoutineUpdates + updateRuleLabels() + binding!!.masterToggle.setOnCheckedChangeListener { _, checked -> save { copy(enabled = checked) } } + binding!!.appRuleToggle.setOnCheckedChangeListener { _, checked -> save { copy(appRuleMode = if (checked) AppRuleMode.WHITELIST else AppRuleMode.BLACKLIST) } } + binding!!.onlySeenToggle.setOnCheckedChangeListener { _, checked -> save { copy(onlySeenApps = checked) } } + binding!!.seenFirstToggle.setOnCheckedChangeListener { _, checked -> save { copy(seenAppsFirst = checked) } } + binding!!.routineUpdatesToggle.setOnCheckedChangeListener { _, checked -> save { copy(ignoreRoutineUpdates = checked) } } + } + + private fun save(change: se.ajpanton.notificationlog.settings.LoggingRule.() -> se.ajpanton.notificationlog.settings.LoggingRule) { + store.save(type, store.ruleFor(type).change()) + bindRule() + } + + private fun updateRuleLabels() { + val rule = store.ruleFor(type) + binding!!.appRuleToggle.text = if (rule.appRuleMode == AppRuleMode.WHITELIST) "Whitelist chosen" else "Blacklist chosen" + binding!!.onlySeenToggle.text = if (rule.onlySeenApps) "Show only seen apps" else "Show all apps" + } + + companion object { + private const val ARG_TITLE = "title" + private const val ARG_TYPE = "type" + fun newInstance(@StringRes title: Int, type: LoggingType) = EventSettingsFragment().apply { + arguments = Bundle().apply { putInt(ARG_TITLE, title); putSerializable(ARG_TYPE, type) } + } + } +} diff --git a/app/src/main/java/se/ajpanton/notificationlog/MainActivity.kt b/app/src/main/java/se/ajpanton/notificationlog/MainActivity.kt index 2309483..56c3a22 100644 --- a/app/src/main/java/se/ajpanton/notificationlog/MainActivity.kt +++ b/app/src/main/java/se/ajpanton/notificationlog/MainActivity.kt @@ -18,6 +18,7 @@ import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.commit import com.google.android.material.navigation.NavigationView import se.ajpanton.notificationlog.databinding.ActivityMainBinding +import se.ajpanton.notificationlog.settings.LoggingType class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { private lateinit var binding: ActivityMainBinding @@ -92,7 +93,11 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte syncDrawerSelection(itemId) val page = Page.fromMenuItem(itemId) supportFragmentManager.commit { - replace(R.id.content_frame, PageFragment.newInstance(page.titleRes)) + replace( + R.id.content_frame, + page.loggingType?.let { EventSettingsFragment.newInstance(page.titleRes, it) } + ?: PageFragment.newInstance(page.titleRes), + ) runOnCommit(::applyPageTitleVisibility) } title = getString(page.titleRes) @@ -240,14 +245,18 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte drawerToggle.drawerArrowDrawable.color = getColor(R.color.on_primary) } - private enum class Page(val menuId: Int, val titleRes: Int) { + private enum class Page( + val menuId: Int, + val titleRes: Int, + val loggingType: LoggingType? = null, + ) { VIEW_LOGS(R.id.nav_view_logs, R.string.page_view_logs), SETTINGS(R.id.nav_settings, R.string.page_settings), - APPEARING(R.id.nav_appearing, R.string.page_appearing), - DISAPPEARING(R.id.nav_disappearing, R.string.page_disappearing), - TEXT_CONTENT(R.id.nav_text_content, R.string.page_text_content), - IMAGE_CONTENT(R.id.nav_image_content, R.string.page_image_content), - EDITS(R.id.nav_edits, R.string.page_edits), + APPEARING(R.id.nav_appearing, R.string.page_appearing, LoggingType.APPEARING), + DISAPPEARING(R.id.nav_disappearing, R.string.page_disappearing, LoggingType.DISAPPEARING), + TEXT_CONTENT(R.id.nav_text_content, R.string.page_text_content, LoggingType.TEXT_CONTENT), + IMAGE_CONTENT(R.id.nav_image_content, R.string.page_image_content, LoggingType.IMAGE_CONTENT), + EDITS(R.id.nav_edits, R.string.page_edits, LoggingType.EDITS), ; companion object { diff --git a/app/src/main/res/layout/fragment_event_settings.xml b/app/src/main/res/layout/fragment_event_settings.xml new file mode 100644 index 0000000..c50f638 --- /dev/null +++ b/app/src/main/res/layout/fragment_event_settings.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +