mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-14 18:57:07 -07:00
Show Logs in Settings on Android
This commit is contained in:
parent
03a4d53d72
commit
588548cbb3
7 changed files with 109 additions and 18 deletions
|
@ -24,11 +24,11 @@ import java.text.SimpleDateFormat
|
|||
import java.util.*
|
||||
import java.util.regex.Pattern
|
||||
|
||||
private val dateFormat = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSSSSS", Locale.US)
|
||||
private val filePrefix = "chiaki_session_"
|
||||
private val filePostfix = ".log"
|
||||
private val dateFormat = SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS", Locale.US)
|
||||
private const val filePrefix = "chiaki_session_"
|
||||
private const val filePostfix = ".log"
|
||||
private val fileRegex = Regex("$filePrefix(.*)$filePostfix")
|
||||
private val keepLogFilesCount = 5
|
||||
private const val keepLogFilesCount = 5
|
||||
|
||||
class LogFile private constructor(val logManager: LogManager, val filename: String)
|
||||
{
|
||||
|
|
|
@ -21,15 +21,21 @@ import android.view.View
|
|||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.metallic.chiaki.R
|
||||
import com.metallic.chiaki.common.RegisteredHost
|
||||
import com.metallic.chiaki.common.LogFile
|
||||
import com.metallic.chiaki.common.ext.inflate
|
||||
import kotlinx.android.synthetic.main.item_registered_host.view.*
|
||||
import kotlinx.android.synthetic.main.item_log_file.view.*
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
class SettingsLogsAdapter: RecyclerView.Adapter<SettingsLogsAdapter.ViewHolder>()
|
||||
{
|
||||
val dateFormat: DateFormat = DateFormat.getDateInstance(DateFormat.SHORT)
|
||||
val timeFormat = SimpleDateFormat("HH:mm:ss:SSS", Locale.getDefault())
|
||||
|
||||
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
|
||||
|
||||
var logFiles: List<String> = listOf()
|
||||
var logFiles: List<LogFile> = listOf()
|
||||
set(value)
|
||||
{
|
||||
field = value
|
||||
|
@ -44,6 +50,7 @@ class SettingsLogsAdapter: RecyclerView.Adapter<SettingsLogsAdapter.ViewHolder>(
|
|||
{
|
||||
val view = holder.itemView
|
||||
val logFile = logFiles[position]
|
||||
// TODO
|
||||
view.nameTextView.text = "${dateFormat.format(logFile.date)} ${timeFormat.format(logFile.date)}"
|
||||
view.summaryTextView.text = logFile.filename
|
||||
}
|
||||
}
|
|
@ -23,9 +23,13 @@ import android.view.LayoutInflater
|
|||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.appcompat.app.AppCompatDialogFragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.metallic.chiaki.R
|
||||
import com.metallic.chiaki.common.LogManager
|
||||
import com.metallic.chiaki.common.ext.viewModelFactory
|
||||
import kotlinx.android.synthetic.main.fragment_settings_logs.*
|
||||
|
||||
|
@ -38,13 +42,30 @@ class SettingsLogsFragment: AppCompatDialogFragment(), TitleFragment
|
|||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
|
||||
{
|
||||
val context = context!!
|
||||
|
||||
viewModel = ViewModelProviders
|
||||
.of(this, viewModelFactory { SettingsLogsViewModel() })
|
||||
.of(this, viewModelFactory { SettingsLogsViewModel(LogManager(context)) })
|
||||
.get(SettingsLogsViewModel::class.java)
|
||||
|
||||
val adapter = SettingsLogsAdapter()
|
||||
logsRecyclerView.layoutManager = LinearLayoutManager(context)
|
||||
logsRecyclerView.adapter = adapter
|
||||
viewModel.sessionLogs.observe(this, Observer {
|
||||
adapter.logFiles = it
|
||||
emptyInfoGroup.visibility = if(it.isEmpty()) View.VISIBLE else View.GONE
|
||||
})
|
||||
|
||||
val itemTouchSwipeCallback = object : ItemTouchSwipeCallback(context)
|
||||
{
|
||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int)
|
||||
{
|
||||
val pos = viewHolder.adapterPosition
|
||||
val file = viewModel.sessionLogs.value?.getOrNull(pos) ?: return
|
||||
viewModel.deleteLog(file)
|
||||
}
|
||||
}
|
||||
ItemTouchHelper(itemTouchSwipeCallback).attachToRecyclerView(logsRecyclerView)
|
||||
}
|
||||
|
||||
override fun getTitle(resources: Resources): String = resources.getString(R.string.preferences_logs_title)
|
||||
|
|
|
@ -17,14 +17,31 @@
|
|||
|
||||
package com.metallic.chiaki.settings
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import com.metallic.chiaki.common.AppDatabase
|
||||
import com.metallic.chiaki.common.LogFile
|
||||
import com.metallic.chiaki.common.LogManager
|
||||
import com.metallic.chiaki.common.RegisteredHost
|
||||
import com.metallic.chiaki.common.ext.toLiveData
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.rxkotlin.addTo
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
|
||||
class SettingsLogsViewModel: ViewModel()
|
||||
class SettingsLogsViewModel(val logManager: LogManager): ViewModel()
|
||||
{
|
||||
private val _sessionLogs = MutableLiveData<List<LogFile>>(logManager.files)
|
||||
val sessionLogs: LiveData<List<LogFile>> get() = _sessionLogs
|
||||
|
||||
private fun updateLogs()
|
||||
{
|
||||
_sessionLogs.value = logManager.files
|
||||
}
|
||||
|
||||
fun deleteLog(file: LogFile)
|
||||
{
|
||||
file.file.delete()
|
||||
updateLogs()
|
||||
}
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/rootLayout">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -11,4 +11,34 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/emptyInfoImageView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_log"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/emptyInfoTextView"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
android:alpha="0.5"/>
|
||||
|
||||
<com.google.android.material.textview.MaterialTextView
|
||||
android:id="@+id/emptyInfoTextView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:fontFamily="sans-serif-condensed"
|
||||
android:text="@string/session_logs_empty_info"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/emptyInfoImageView" />
|
||||
|
||||
<androidx.constraintlayout.widget.Group
|
||||
android:id="@+id/emptyInfoGroup"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:constraint_referenced_ids="emptyInfoImageView,emptyInfoTextView"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
<TextView
|
||||
android:id="@+id/nameTextView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
|
@ -34,13 +34,15 @@
|
|||
android:fadingEdge="horizontal"
|
||||
app:layout_constraintStart_toEndOf="@id/iconImageView"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:layout_marginStart="32dp"
|
||||
tools:text="Name" />
|
||||
tools:text="Name"
|
||||
app:layout_constraintEnd_toStartOf="@id/shareButton"
|
||||
app:layout_constraintBottom_toTopOf="@id/summaryTextView"
|
||||
app:layout_constraintVertical_chainStyle="packed"/>
|
||||
|
||||
<!--<TextView
|
||||
<TextView
|
||||
android:id="@+id/summaryTextView"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@android:id/title"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
|
@ -49,6 +51,19 @@
|
|||
app:layout_constraintStart_toStartOf="@id/nameTextView"
|
||||
app:layout_constraintTop_toBottomOf="@id/nameTextView"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
tools:text="Summary"/>-->
|
||||
tools:text="Summary"
|
||||
app:layout_constraintEnd_toEndOf="@id/nameTextView" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/shareButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_share"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
android:tint="?android:attr/textColorPrimary"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:padding="16dp"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
<string name="action_keep">Keep</string>
|
||||
<string name="action_delete">Delete</string>
|
||||
<string name="action_edit">Edit</string>
|
||||
<string name="session_logs_empty_info">No Session Logs recorded.</string>
|
||||
|
||||
<!-- Don't localize these -->
|
||||
<string name="preferences_discovery_enabled_key">discovery_enabled</string>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue