Skip to content

Commit

Permalink
Save scroll position on taggers screen
Browse files Browse the repository at this point in the history
  • Loading branch information
bubelov committed Oct 23, 2022
1 parent d4fe712 commit 33c613c
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 39 deletions.
49 changes: 10 additions & 39 deletions app/src/main/kotlin/users/UsersFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,21 @@ import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import db.SelectAllUsersAsListItems
import kotlinx.coroutines.launch
import org.btcmap.R
import org.btcmap.databinding.FragmentUsersBinding
import org.koin.android.ext.android.inject
import java.util.regex.Pattern
import org.koin.androidx.viewmodel.ext.android.viewModel

class UsersFragment : Fragment() {

private val usersRepo: UsersRepo by inject()
private val model: UsersModel by viewModel()

private var _binding: FragmentUsersBinding? = null
private val binding get() = _binding!!

val adapter = UsersAdapter {
findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToUserFragment(it.id))
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
Expand Down Expand Up @@ -60,29 +61,12 @@ class UsersFragment : Fragment() {
else -> false
}

binding.list.layoutManager = LinearLayoutManager(requireContext())
binding.list.adapter = adapter

viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {
binding.list.layoutManager = LinearLayoutManager(requireContext())
val adapter = UsersAdapter {
findNavController().navigate(UsersFragmentDirections.actionUsersFragmentToUserFragment(it.id))
}
binding.list.adapter = adapter

adapter.submitList(usersRepo.selectAllUsersAsListItems().map {
val changes = if (it.user_name == "Bill on Bitcoin Island") {
it.changes + 120
} else {
it.changes
}

UsersAdapter.Item(
id = it.user_id,
name = it.user_name ?: getString(R.string.unnamed_user),
changes = changes,
tipLnurl = it.lnurl(),
imgHref = it.user_img_href ?: "",
)
}.sortedByDescending { it.changes })
model.items.collect { adapter.submitList(it) }
}
}
}
Expand All @@ -91,17 +75,4 @@ class UsersFragment : Fragment() {
super.onDestroyView()
_binding = null
}

fun SelectAllUsersAsListItems.lnurl(): String {
val description = user_description ?: ""
val pattern = Pattern.compile("\\(lightning:[^)]*\\)", Pattern.CASE_INSENSITIVE)
val matcher = pattern.matcher(description)
val matchFound: Boolean = matcher.find()

return if (matchFound) {
matcher.group().trim('(', ')')
} else {
""
}
}
}
58 changes: 58 additions & 0 deletions app/src/main/kotlin/users/UsersModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package users

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import db.SelectAllUsersAsListItems
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import org.btcmap.R
import org.koin.android.annotation.KoinViewModel
import java.util.regex.Pattern

@KoinViewModel
class UsersModel(
private val app: Application,
private val usersRepo: UsersRepo,
): AndroidViewModel(app) {

private val _items: MutableStateFlow<List<UsersAdapter.Item>> = MutableStateFlow(emptyList())
val items = _items.asStateFlow()

init {
viewModelScope.launch {
val items = usersRepo.selectAllUsersAsListItems().map {
val changes = if (it.user_name == "Bill on Bitcoin Island") {
it.changes + 120
} else {
it.changes
}

UsersAdapter.Item(
id = it.user_id,
name = it.user_name ?: app.getString(R.string.unnamed_user),
changes = changes,
tipLnurl = it.lnurl(),
imgHref = it.user_img_href ?: "",
)
}.sortedByDescending { it.changes }

_items.update { items }
}
}

fun SelectAllUsersAsListItems.lnurl(): String {
val description = user_description ?: ""
val pattern = Pattern.compile("\\(lightning:[^)]*\\)", Pattern.CASE_INSENSITIVE)
val matcher = pattern.matcher(description)
val matchFound: Boolean = matcher.find()

return if (matchFound) {
matcher.group().trim('(', ')')
} else {
""
}
}
}

0 comments on commit 33c613c

Please sign in to comment.