diff --git a/app/src/main/java/se/ajpanton/notificationlog/ViewLogsFragment.kt b/app/src/main/java/se/ajpanton/notificationlog/ViewLogsFragment.kt index a903fdf..457da53 100644 --- a/app/src/main/java/se/ajpanton/notificationlog/ViewLogsFragment.kt +++ b/app/src/main/java/se/ajpanton/notificationlog/ViewLogsFragment.kt @@ -8,6 +8,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import se.ajpanton.notificationlog.data.EncryptedNotificationLogStore import se.ajpanton.notificationlog.databinding.FragmentViewLogsBinding import se.ajpanton.notificationlog.model.NotificationLogEntry +import se.ajpanton.notificationlog.settings.LogField +import se.ajpanton.notificationlog.settings.LogViewSettingsStore +import se.ajpanton.notificationlog.settings.TimestampZone import java.text.DateFormat import java.util.Date @@ -44,16 +47,24 @@ class ViewLogsFragment : Fragment(R.layout.fragment_view_logs) { private fun render(view: FragmentViewLogsBinding, entries: List) { view.logRows.removeAllViews() view.emptyView.visibility = if (entries.isEmpty()) View.VISIBLE else View.GONE + val settings = LogViewSettingsStore(requireContext()).load() entries.forEach { entry -> view.logRows.addView(TextView(requireContext()).apply { - text = listOfNotNull( - DateFormat.getDateTimeInstance().format(Date(entry.recordedAtEpochMillis)), - entry.appName, - entry.action.name.lowercase().replace('_', ' '), - entry.contents, - ).joinToString(" · ") + text = settings.order.filter { it in settings.visibleFields }.mapNotNull { field -> when (field) { + LogField.TIMESTAMP -> timestamp(entry.recordedAtEpochMillis, settings.timestampZone) + LogField.APP_NAME -> entry.appName + LogField.PACKAGE_NAME -> entry.packageName + LogField.ACTION -> entry.action.name.lowercase().replace('_', ' ') + LogField.CONTENTS -> entry.contents + } }.joinToString(" · ") setPadding(0, 12, 0, 12) }) } } + + private fun timestamp(value: Long, zone: TimestampZone): String { + val format = DateFormat.getDateTimeInstance() + if (zone == TimestampZone.UTC) format.timeZone = java.util.TimeZone.getTimeZone("UTC") + return format.format(Date(value)) + } } diff --git a/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettings.kt b/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettings.kt new file mode 100644 index 0000000..e4e15b9 --- /dev/null +++ b/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettings.kt @@ -0,0 +1,10 @@ +package se.ajpanton.notificationlog.settings + +enum class LogField { TIMESTAMP, APP_NAME, PACKAGE_NAME, ACTION, CONTENTS } +enum class TimestampZone { LOCAL_NOW, UTC, EVENT_LOCAL } + +data class LogViewSettings( + val visibleFields: Set = setOf(LogField.TIMESTAMP, LogField.APP_NAME, LogField.ACTION, LogField.CONTENTS), + val order: List = LogField.entries, + val timestampZone: TimestampZone = TimestampZone.LOCAL_NOW, +) diff --git a/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettingsStore.kt b/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettingsStore.kt new file mode 100644 index 0000000..f6ffa74 --- /dev/null +++ b/app/src/main/java/se/ajpanton/notificationlog/settings/LogViewSettingsStore.kt @@ -0,0 +1,19 @@ +package se.ajpanton.notificationlog.settings + +import android.content.Context +import androidx.core.content.edit + +class LogViewSettingsStore(context: Context) { + private val prefs = context.getSharedPreferences("log-view-settings", Context.MODE_PRIVATE) + fun load() = LogViewSettings( + visibleFields = prefs.getStringSet("visible", LogViewSettings().visibleFields.map { it.name }.toSet())!! + .map(LogField::valueOf).toSet(), + order = prefs.getString("order", null)?.split(',')?.map(LogField::valueOf) ?: LogField.entries, + timestampZone = TimestampZone.valueOf(prefs.getString("zone", TimestampZone.LOCAL_NOW.name)!!), + ) + fun save(settings: LogViewSettings) = prefs.edit { + putStringSet("visible", settings.visibleFields.map { it.name }.toSet()) + putString("order", settings.order.joinToString(",") { it.name }) + putString("zone", settings.timestampZone.name) + } +}