Add per-event logging settings pages
This commit is contained in:
@@ -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) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ import androidx.drawerlayout.widget.DrawerLayout
|
|||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
import com.google.android.material.navigation.NavigationView
|
import com.google.android.material.navigation.NavigationView
|
||||||
import se.ajpanton.notificationlog.databinding.ActivityMainBinding
|
import se.ajpanton.notificationlog.databinding.ActivityMainBinding
|
||||||
|
import se.ajpanton.notificationlog.settings.LoggingType
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
|
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
|
||||||
private lateinit var binding: ActivityMainBinding
|
private lateinit var binding: ActivityMainBinding
|
||||||
@@ -92,7 +93,11 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
|
|||||||
syncDrawerSelection(itemId)
|
syncDrawerSelection(itemId)
|
||||||
val page = Page.fromMenuItem(itemId)
|
val page = Page.fromMenuItem(itemId)
|
||||||
supportFragmentManager.commit {
|
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)
|
runOnCommit(::applyPageTitleVisibility)
|
||||||
}
|
}
|
||||||
title = getString(page.titleRes)
|
title = getString(page.titleRes)
|
||||||
@@ -240,14 +245,18 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
|
|||||||
drawerToggle.drawerArrowDrawable.color = getColor(R.color.on_primary)
|
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),
|
VIEW_LOGS(R.id.nav_view_logs, R.string.page_view_logs),
|
||||||
SETTINGS(R.id.nav_settings, R.string.page_settings),
|
SETTINGS(R.id.nav_settings, R.string.page_settings),
|
||||||
APPEARING(R.id.nav_appearing, R.string.page_appearing),
|
APPEARING(R.id.nav_appearing, R.string.page_appearing, LoggingType.APPEARING),
|
||||||
DISAPPEARING(R.id.nav_disappearing, R.string.page_disappearing),
|
DISAPPEARING(R.id.nav_disappearing, R.string.page_disappearing, LoggingType.DISAPPEARING),
|
||||||
TEXT_CONTENT(R.id.nav_text_content, R.string.page_text_content),
|
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),
|
IMAGE_CONTENT(R.id.nav_image_content, R.string.page_image_content, LoggingType.IMAGE_CONTENT),
|
||||||
EDITS(R.id.nav_edits, R.string.page_edits),
|
EDITS(R.id.nav_edits, R.string.page_edits, LoggingType.EDITS),
|
||||||
;
|
;
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
|
||||||
|
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="@dimen/page_padding">
|
||||||
|
<TextView android:id="@+id/page_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?attr/textAppearanceHeadline5" />
|
||||||
|
<com.google.android.material.switchmaterial.SwitchMaterial android:id="@+id/master_toggle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="Logging enabled" />
|
||||||
|
<com.google.android.material.switchmaterial.SwitchMaterial android:id="@+id/app_rule_toggle" android:layout_width="match_parent" android:layout_height="wrap_content" />
|
||||||
|
<com.google.android.material.switchmaterial.SwitchMaterial android:id="@+id/only_seen_toggle" android:layout_width="match_parent" android:layout_height="wrap_content" />
|
||||||
|
<com.google.android.material.switchmaterial.SwitchMaterial android:id="@+id/seen_first_toggle" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Show seen apps at the top" />
|
||||||
|
<com.google.android.material.switchmaterial.SwitchMaterial android:id="@+id/routine_updates_toggle" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Ignore routine updates" />
|
||||||
|
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" android:text="App list will appear here." android:textAppearance="?attr/textAppearanceBody2" />
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
Reference in New Issue
Block a user