Skip to content

Commit

Permalink
Merge branch 'develop' into fix/investigate-initializer-errors
Browse files Browse the repository at this point in the history
  • Loading branch information
KCeh authored Jul 14, 2024
2 parents f7666a1 + 1a5116c commit ee6f2e0
Show file tree
Hide file tree
Showing 18 changed files with 208 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,7 @@ package com.infinum.sentinel.data.models.raw

internal data class PreferencesData(
val name: String,
val values: List<Triple<PreferenceType, String, Any>>
val values: List<Triple<PreferenceType, String, Any>>,
val isSortedAscending: Boolean = false,
val isExpanded: Boolean = true,
)
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ internal class PreferencesCollector(
prefsDirectory.list().orEmpty().toList().map { it.removeSuffix(PREFS_SUFFIX) }
} else {
listOf()
}.sortedBy { name ->
name
}.map { name ->
val allPrefs = getSharedPreferences(name, MODE_PRIVATE).all
val tuples = allPrefs.keys.toSet().mapNotNull {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,32 +64,51 @@ internal class PreferencesFragment :
}
}

@Suppress("UNCHECKED_CAST")
private fun createItemView(data: PreferencesData): View =
SentinelViewItemPreferenceBinding.inflate(layoutInflater, binding.contentLayout, false)
.apply {
nameView.text = data.name
data.values.forEach { tuple ->
prefsLayout.addView(
SentinelViewItemTextBinding.inflate(layoutInflater, prefsLayout, false)
.apply {
labelView.isAllCaps = false
labelView.text = tuple.second
valueView.text = tuple.third.toString()
root.setOnClickListener { _ ->
viewModel.cache(
data.name,
tuple
)
}
root.setOnLongClickListener {
it.context.copyToClipboard(
key = tuple.second,
value = tuple.third.toString()
)
}
}.root
)
sortImageView.setOnClickListener {
viewModel.onSortClicked(data)
}
hideExpandImageView.setOnClickListener {
viewModel.onHideExpandClicked(data)
}

if (data.isExpanded) {
prefsLayout.visibility = View.VISIBLE
sortImageView.visibility = View.VISIBLE
hideExpandImageView.setImageResource(R.drawable.sentinel_ic_minus)
showPreferenceData(data)
} else {
prefsLayout.visibility = View.GONE
sortImageView.visibility = View.GONE
hideExpandImageView.setImageResource(R.drawable.sentinel_ic_plus)
}
}.root

private fun SentinelViewItemPreferenceBinding.showPreferenceData(data: PreferencesData) {
data.values.forEach { (preferenceType, label, value) ->
prefsLayout.addView(
SentinelViewItemTextBinding.inflate(layoutInflater, prefsLayout, false)
.apply {
labelView.isAllCaps = false
labelView.text = label
valueView.text = value.toString()
root.setOnClickListener { _ ->
viewModel.cache(
name = data.name,
tuple = Triple(preferenceType, label, value)
)
}
root.setOnLongClickListener {
it.context.copyToClipboard(
key = label,
value = value.toString()
)
}
}.root
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.infinum.sentinel.ui.main.preferences

import com.infinum.sentinel.data.models.raw.PreferenceType
import com.infinum.sentinel.data.models.raw.PreferencesData
import com.infinum.sentinel.domain.Factories
import com.infinum.sentinel.domain.Repositories
import com.infinum.sentinel.domain.preference.models.PreferenceParameters
Expand Down Expand Up @@ -38,4 +39,40 @@ internal class PreferencesViewModel(
}
emitEvent(PreferencesEvent.Cached())
}

fun onSortClicked(data: PreferencesData) {
val currentValues = (stateFlow.value as? PreferencesState.Data)?.value.orEmpty()
val sortedData = if (data.isSortedAscending) {
data.values.sortedByDescending { it.second }
} else {
data.values.sortedBy { it.second }
}
val changedValues = currentValues.map { preferencesData ->
if (preferencesData.name == data.name) {
preferencesData.copy(
values = sortedData,
isSortedAscending = !preferencesData.isSortedAscending
)
} else {
preferencesData
}
}
setState(PreferencesState.Data(value = changedValues))
}

fun onHideExpandClicked(data: PreferencesData) {
(stateFlow.value as? PreferencesState.Data)?.let { state ->
val currentValues = state.value
val changedValues = currentValues.map { preferencesData ->
if (preferencesData.name == data.name) {
preferencesData.copy(
isExpanded = !preferencesData.isExpanded
)
} else {
preferencesData
}
}
setState(PreferencesState.Data(value = changedValues))
}
}
}
11 changes: 11 additions & 0 deletions sentinel/src/main/res/drawable/sentinel_ic_sort.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">

<path
android:fillColor="?android:textColorSecondary"
android:pathData="M14.94,4.66h-4.72l2.36,-2.36zM10.25,19.37h4.66l-2.33,2.33zM6.1,6.27L1.6,17.73h1.84l0.92,-2.45h5.11l0.92,2.45h1.84L7.74,6.27L6.1,6.27zM4.97,13.64l1.94,-5.18 1.94,5.18L4.97,13.64zM15.73,16.14h6.12v1.59h-8.53v-1.29l5.92,-8.56h-5.88v-1.6h8.3v1.26l-5.93,8.6z" />

</vector>
41 changes: 36 additions & 5 deletions sentinel/src/main/res/layout/sentinel_view_item_preference.xml
Original file line number Diff line number Diff line change
@@ -1,18 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">

<com.google.android.material.textview.MaterialTextView
android:id="@+id/nameView"
style="@style/TextAppearance.Material3.BodySmall"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textColor="@color/sentinel_primary" />
android:orientation="horizontal"
android:paddingBottom="8dp">

<com.google.android.material.textview.MaterialTextView
android:id="@+id/nameView"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:textColor="@color/sentinel_primary"
tools:text="Preferences" />

<ImageView
android:id="@+id/sortImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:contentDescription="@string/sentinel_sort_preference_by_name"
android:src="@drawable/sentinel_ic_sort" />

<View
android:layout_width="16dp"
android:layout_height="match_parent" />

<ImageView
android:id="@+id/hideExpandImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:contentDescription="@string/sentinel_hide_expands_the_preferences"
android:src="@drawable/sentinel_ic_plus" />

</LinearLayout>

<LinearLayout
android:id="@+id/prefsLayout"
Expand Down
2 changes: 2 additions & 0 deletions sentinel/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@
<string name="sentinel_fragment_arguments">Fragment arguments</string>
<string name="sentinel_fragment_saved_state">Fragment Saved State</string>

<string name="sentinel_sort_preference_by_name">Sort preferences by name</string>
<string name="sentinel_hide_expands_the_preferences">Hide/expand the preferences</string>
<string name="sentinel_preferences_editor">Preferences editor</string>
<string name="sentinel_key">Key</string>
<string name="sentinel_current_value">Current value</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import android.content.Context
import com.infinum.sentinel.ui.logger.models.BaseEntry
import com.infinum.sentinel.ui.logger.models.FlowBuffer
import com.infinum.sentinel.ui.logger.models.Level
import com.infinum.sentinel.ui.shared.Constants.LOG_DATE_TIME_FORMAT
import com.infinum.sentinel.ui.shared.LogFileResolver
import java.io.File
import java.util.Calendar
import java.text.SimpleDateFormat
import java.util.Locale
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
Expand All @@ -21,6 +23,8 @@ internal class SentinelFileTree(
private val logFileResolver = LogFileResolver(context)

override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
val dateTimeFormat = SimpleDateFormat(LOG_DATE_TIME_FORMAT, Locale.getDefault())

MainScope().launch {
withContext(Dispatchers.IO) {
val entry = Entry(
Expand All @@ -34,7 +38,7 @@ internal class SentinelFileTree(
buffer.enqueue(entry)

val file: File = logFileResolver.createOrOpenFile()
val line = entry.asLineString()
val line = entry.asLineString(dateTimeFormat)

file.appendText(line)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.infinum.sentinel
import android.content.Context
import androidx.startup.Initializer
import com.infinum.sentinel.ui.logger.models.FlowBuffer
import kotlinx.coroutines.MainScope
import timber.log.Timber

public class TimberInitializer : Initializer<Class<TimberInitializer>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber


public class LoggerActivity : AppCompatActivity() {

private companion object {
Expand Down Expand Up @@ -94,21 +93,21 @@ public class LoggerActivity : AppCompatActivity() {
with(binding) {
toolbar.setNavigationOnClickListener { finish() }
toolbar.subtitle = (
packageManager.getApplicationLabel(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getApplicationInfo(
packageName,
PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
)
} else {
@Suppress("DEPRECATION")
packageManager.getApplicationInfo(
packageName,
PackageManager.GET_META_DATA
)
}
) as? String
) ?: getString(R.string.sentinel_name)
packageManager.getApplicationLabel(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getApplicationInfo(
packageName,
PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA.toLong())
)
} else {
@Suppress("DEPRECATION")
packageManager.getApplicationInfo(
packageName,
PackageManager.GET_META_DATA
)
}
) as? String
) ?: getString(R.string.sentinel_name)
toolbar.setOnMenuItemClickListener {
when (it.itemId) {
R.id.search -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,17 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import com.infinum.sentinel.SentinelFileTree
import com.infinum.sentinel.databinding.SentinelItemLogBinding
import com.infinum.sentinel.ui.shared.Constants.LOG_DATE_TIME_FORMAT
import java.text.SimpleDateFormat
import java.util.Locale

internal class LoggerAdapter(
private val onListChanged: (Boolean) -> Unit,
private val onClick: (SentinelFileTree.Entry) -> Unit
) : ListAdapter<SentinelFileTree.Entry, LoggerViewHolder>(LoggerDiffUtil()) {

private val dateTimeFormat = SimpleDateFormat(LOG_DATE_TIME_FORMAT, Locale.getDefault())

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LoggerViewHolder =
LoggerViewHolder(
SentinelItemLogBinding.inflate(
Expand All @@ -21,7 +26,11 @@ internal class LoggerAdapter(
)

override fun onBindViewHolder(holder: LoggerViewHolder, position: Int) {
holder.bind(getItem(position), onClick)
holder.bind(
item = getItem(position),
dateTimeFormat = dateTimeFormat,
onClick = onClick
)
}

override fun onViewRecycled(holder: LoggerViewHolder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ internal class LoggerViewHolder(
private val binding: SentinelItemLogBinding
) : RecyclerView.ViewHolder(binding.root) {

fun bind(item: SentinelFileTree.Entry?, onClick: (SentinelFileTree.Entry) -> Unit) {
fun bind(
item: SentinelFileTree.Entry?,
dateTimeFormat: SimpleDateFormat,
onClick: (SentinelFileTree.Entry) -> Unit
) {
item?.let { entry ->
with(binding) {
levelView.setBackgroundColor(
Expand All @@ -31,7 +35,7 @@ internal class LoggerViewHolder(
}
)
)
timestampView.text = SimpleDateFormat.getDateTimeInstance().format(Date(entry.timestamp))
timestampView.text = dateTimeFormat.format(Date(entry.timestamp))
tagView.text = entry.tag
entry.stackTrace?.let {
stackTraceView.text = it
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.infinum.sentinel.ui.logger.models

import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import org.json.JSONObject

internal open class BaseEntry(
Expand All @@ -10,7 +11,6 @@ internal open class BaseEntry(
open val message: String? = null,
open val stackTrace: String? = null
) {

fun asJSONString(): String =
JSONObject()
.put("level", level)
Expand All @@ -20,9 +20,9 @@ internal open class BaseEntry(
.put("stackTrace", stackTrace)
.toString()

fun asLineString(): String =
fun asLineString(dateTimeFormat: SimpleDateFormat): String =
buildString {
append(timestamp)
append(dateTimeFormat.format(Date(timestamp)))
append(" LEVEL: ")
append(level)
append(" TAG: ")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ internal class FlowBuffer<T : BaseEntry> {
} else {
queue.reversed().filter {
it.tag?.lowercase()?.contains(query.lowercase()) == true ||
it.message?.lowercase()?.contains(query.lowercase()) == true ||
it.stackTrace?.lowercase()?.contains(query.lowercase()) == true
it.message?.lowercase()?.contains(query.lowercase()) == true ||
it.stackTrace?.lowercase()?.contains(query.lowercase()) == true
}
}
)
Expand Down
Loading

0 comments on commit ee6f2e0

Please sign in to comment.