diff --git a/app/src/main/kotlin/app/AppModule.kt b/app/src/main/kotlin/app/AppModule.kt index ea48918f..63c4c733 100644 --- a/app/src/main/kotlin/app/AppModule.kt +++ b/app/src/main/kotlin/app/AppModule.kt @@ -33,6 +33,7 @@ import user.UsersRepo import okhttp3.HttpUrl.Companion.toHttpUrl import org.koin.dsl.bind import log.LogRecordQueries +import issue.IssuesModel val appModule = module { single { @@ -86,4 +87,6 @@ val appModule = module { viewModelOf(::SearchModel) viewModelOf(::SearchResultModel) + + viewModelOf(::IssuesModel) } \ No newline at end of file diff --git a/app/src/main/kotlin/area/AreaAdapter.kt b/app/src/main/kotlin/area/AreaAdapter.kt index 4067e06d..de1d6d85 100644 --- a/app/src/main/kotlin/area/AreaAdapter.kt +++ b/app/src/main/kotlin/area/AreaAdapter.kt @@ -154,6 +154,7 @@ class AreaAdapter( item.count, item.count, ) + root.setOnClickListener { listener.onIssuesClick() } } } @@ -206,12 +207,13 @@ class AreaAdapter( } interface Listener { - fun onMapClick() - fun onElementClick(item: Item.Element) - fun onUrlClick(url: HttpUrl) + + fun onIssuesClick() + + fun onElementClick(item: Item.Element) } companion object { diff --git a/app/src/main/kotlin/area/AreaFragment.kt b/app/src/main/kotlin/area/AreaFragment.kt index 8d6b428f..29a66cb8 100644 --- a/app/src/main/kotlin/area/AreaFragment.kt +++ b/app/src/main/kotlin/area/AreaFragment.kt @@ -42,18 +42,25 @@ class AreaFragment : Fragment() { } } + override fun onUrlClick(url: HttpUrl) { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse(url.toString()) + startActivity(intent) + } + + override fun onIssuesClick() { + findNavController().navigate( + R.id.action_areaFragment_to_issuesFragment, + bundleOf("area_id" to requireArgs().areaId), + ) + } + override fun onElementClick(item: AreaAdapter.Item.Element) { findNavController().navigate( R.id.elementFragment, bundleOf("element_id" to item.id), ) } - - override fun onUrlClick(url: HttpUrl) { - val intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse(url.toString()) - startActivity(intent) - } }, ) @@ -100,6 +107,7 @@ class AreaFragment : Fragment() { binding.progress.isVisible = true binding.list.isVisible = false } + is AreaModel.State.Loaded -> { val elements = state.items.filterIsInstance().size diff --git a/app/src/main/kotlin/element/AreaElement.kt b/app/src/main/kotlin/element/AreaElement.kt index 1dd525f4..62790300 100644 --- a/app/src/main/kotlin/element/AreaElement.kt +++ b/app/src/main/kotlin/element/AreaElement.kt @@ -9,4 +9,6 @@ data class AreaElement( val icon: String, val osmTags: OsmTags, val issues: JSONArray, + val osmType: String, + val osmId: Long, ) \ No newline at end of file diff --git a/app/src/main/kotlin/element/ElementQueries.kt b/app/src/main/kotlin/element/ElementQueries.kt index 90a907dd..870cca83 100644 --- a/app/src/main/kotlin/element/ElementQueries.kt +++ b/app/src/main/kotlin/element/ElementQueries.kt @@ -251,7 +251,9 @@ class ElementQueries(private val db: SQLiteOpenHelper) { lon, json_extract(tags, '$.icon:android') AS icon_id, json_extract(osm_json, '$.tags') AS osm_tags, - json_extract(tags, '$.issues') AS issues + json_extract(tags, '$.issues') AS issues, + json_extract(osm_json, '$.type') AS osm_type, + json_extract(osm_json, '$.id') AS osm_id FROM element WHERE deleted_at = '' @@ -276,7 +278,9 @@ class ElementQueries(private val db: SQLiteOpenHelper) { lon = cursor.getDouble(2), icon = cursor.getString(3), osmTags = cursor.getJsonObject(4), - issues = cursor.getJsonArray(5) + issues = cursor.getJsonArray(5), + osmType = cursor.getString(6), + osmId = cursor.getLong(7), ) } } diff --git a/app/src/main/kotlin/issue/IssuesAdapter.kt b/app/src/main/kotlin/issue/IssuesAdapter.kt new file mode 100644 index 00000000..bd5405ff --- /dev/null +++ b/app/src/main/kotlin/issue/IssuesAdapter.kt @@ -0,0 +1,79 @@ +package issue + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import org.btcmap.R +import org.btcmap.databinding.ItemIssueBinding + +class IssuesAdapter( + private val listener: Listener, +) : ListAdapter(DiffCallback()) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val binding = ItemIssueBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false, + ) + + return ItemViewHolder(binding) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.bind(getItem(position), listener) + } + + class ItemViewHolder( + private val binding: ItemIssueBinding, + ) : ViewHolder( + binding.root, + ) { + + fun bind(item: Item, listener: Listener) { + binding.apply { + when (item.type) { + "not_verified" -> icon.setImageResource(R.drawable.verified) + "out_of_date" -> icon.setImageResource(R.drawable.schedule) + else -> icon.setImageResource(R.drawable.place) + } + + title.text = item.description + subtitle.text = item.elementName + + root.setOnClickListener { listener.onItemClick(item) } + } + } + } + + class DiffCallback : DiffUtil.ItemCallback() { + + override fun areItemsTheSame( + oldItem: Item, + newItem: Item, + ): Boolean { + return newItem == oldItem + } + + override fun areContentsTheSame( + oldItem: Item, + newItem: Item, + ): Boolean { + return newItem == oldItem + } + } + + data class Item( + val type: String, + val severity: Int, + val description: String, + val osmUrl: String, + val elementName: String, + ) + + interface Listener { + fun onItemClick(item: Item) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/issue/IssuesFragment.kt b/app/src/main/kotlin/issue/IssuesFragment.kt new file mode 100644 index 00000000..0eb367a8 --- /dev/null +++ b/app/src/main/kotlin/issue/IssuesFragment.kt @@ -0,0 +1,90 @@ +package issue + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.* +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import kotlinx.coroutines.launch +import org.btcmap.databinding.FragmentIssuesBinding +import org.koin.androidx.viewmodel.ext.android.viewModel + +class IssuesFragment : Fragment() { + + private val model: IssuesModel by viewModel() + + private var _binding: FragmentIssuesBinding? = null + private val binding get() = _binding!! + + private val adapter = IssuesAdapter(object : IssuesAdapter.Listener { + override fun onItemClick(item: IssuesAdapter.Item) { + val intent = Intent(Intent.ACTION_VIEW) + intent.data = Uri.parse(item.osmUrl) + startActivity(intent) + } + }) + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + _binding = FragmentIssuesBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + ViewCompat.setOnApplyWindowInsetsListener(binding.toolbar) { toolbar, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars()) + toolbar.updateLayoutParams { + topMargin = insets.top + } + val navBarsInsets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + binding.list.setPadding(0, 0, 0, navBarsInsets.bottom) + WindowInsetsCompat.CONSUMED + } + + binding.toolbar.setNavigationOnClickListener { + findNavController().popBackStack() + } + + binding.list.layoutManager = LinearLayoutManager(requireContext()) + binding.list.adapter = adapter + binding.list.setHasFixedSize(true) + + model.setArgs(requireArgs()) + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { + model.state.collect { + when (it) { + is IssuesModel.State.ShowingItems -> { + adapter.submitList(it.items) + } + + else -> {} + } + } + + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun requireArgs(): IssuesModel.Args { + return IssuesModel.Args(requireArguments().getString("area_id")!!) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/issue/IssuesModel.kt b/app/src/main/kotlin/issue/IssuesModel.kt new file mode 100644 index 00000000..97b8baa2 --- /dev/null +++ b/app/src/main/kotlin/issue/IssuesModel.kt @@ -0,0 +1,74 @@ +package issue + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import area.AreasRepo +import area.name +import area.polygons +import element.ElementsRepo +import json.toList +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import map.boundingBox +import org.locationtech.jts.geom.Coordinate +import org.locationtech.jts.geom.GeometryFactory + +class IssuesModel( + private val areasRepo: AreasRepo, + private val elementsRepo: ElementsRepo, + private val app: Application, +) : AndroidViewModel(app) { + + private val _state: MutableStateFlow = MutableStateFlow(State.Loading) + val state = _state.asStateFlow() + + fun setArgs(args: Args) { + viewModelScope.launch { + val area = areasRepo.selectById(args.areaId)!! + + val polygons = area.tags.polygons() + val boundingBox = boundingBox(polygons) + val geometryFactory = GeometryFactory() + + val elements = elementsRepo.selectByBoundingBox( + minLat = boundingBox.latSouth, + maxLat = boundingBox.latNorth, + minLon = boundingBox.lonWest, + maxLon = boundingBox.lonEast, + ).filter { element -> + polygons.any { + val coordinate = Coordinate(element.lon, element.lat) + it.contains(geometryFactory.createPoint(coordinate)) + } + } + + val issues = elements.map { element -> + val osmUrl = "https://www.openstreetmap.org/${element.osmType}/${element.osmId}" + + element.issues.toList().map { + IssuesAdapter.Item( + type = it.getString("type"), + severity = it.getInt("severity"), + description = it.getString("description"), + osmUrl = osmUrl, + elementName = element.osmTags.name(app.resources) + ) + } + }.flatten() + + _state.update { State.ShowingItems(issues.sortedByDescending { it.severity }) } + } + } + + data class Args(val areaId: String) + + sealed class State { + + data object Loading : State() + + data class ShowingItems(val items: List) : State() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_issues.xml b/app/src/main/res/layout/fragment_issues.xml new file mode 100644 index 00000000..ccdcd746 --- /dev/null +++ b/app/src/main/res/layout/fragment_issues.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_issue.xml b/app/src/main/res/layout/item_issue.xml new file mode 100644 index 00000000..676b521b --- /dev/null +++ b/app/src/main/res/layout/item_issue.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index e419e73b..152cee91 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -160,6 +160,13 @@ app:exitAnim="@anim/nav_default_exit_anim" app:popEnterAnim="@anim/nav_default_pop_enter_anim" app:popExitAnim="@anim/nav_default_pop_exit_anim" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b2918613..03d38f54 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes %d change diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index c5365912..193dd39c 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -56,6 +56,7 @@ Платете Onchain Платете с Lightning Снимка + Issues %d промяна %d промени diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 07249344..3595a732 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -56,12 +56,15 @@ Pay Onchain Pay with Lightning Image + Issues %d change + %d changes %d changes %d place + %d places %d places \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index efc0a321..88dfebc9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -56,6 +56,7 @@ Zaplať Onchain Zaplať Lightning Image + Issues %d změn %d změn diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c3211111..755b79f9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d Änderung %d Änderungen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b9fe696e..36e89734 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d αλλαγή %d αλλαγές diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fd7f9006..264a67af 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -56,12 +56,15 @@ Pay Onchain Pay with Lightning Image + Issues %d cambio + %d cambios %d cambios %d lugar + %d lugares %d lugares diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 807d1656..58b0c4d6 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d modification %d modifications diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 07249344..3595a732 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -56,12 +56,15 @@ Pay Onchain Pay with Lightning Image + Issues %d change + %d changes %d changes %d place + %d places %d places \ No newline at end of file diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index fba15af1..33d76a1e 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -56,16 +56,15 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes - %d changes %d changes %d place %d places - %d places %d places \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cbb3496c..2076d645 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index cbb3496c..2076d645 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 70ebeb58..728da1f3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d9840f73..4cad39f2 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -56,12 +56,15 @@ Pagar Onchain Pagamentos com Lightning Imagem + Issues %d mudança + %d mudanças %d mudanças %d lugar + %d lugares %d lugares \ No newline at end of file diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 6abf8f13..352e7ef6 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 8b0410f8..34d3f55c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -56,6 +56,7 @@ Ончейн платеж Lightning платеж Image + Issues %d правка %d правок diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 6abf8f13..352e7ef6 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 678d6fa3..4ab83e50 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d การเปลี่ยนแปลง diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index b0f52e22..5c427e64 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 70ebeb58..728da1f3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 07249344..9a65e631 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d change %d changes diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cbb3496c..2076d645 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index cbb3496c..2076d645 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ba88398..be36b7b2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,6 +56,7 @@ Pay Onchain Pay with Lightning Image + Issues %d changes %d change