diff --git a/app/src/main/kotlin/app/AppModule.kt b/app/src/main/kotlin/app/AppModule.kt index 88951466..fc4293d4 100644 --- a/app/src/main/kotlin/app/AppModule.kt +++ b/app/src/main/kotlin/app/AppModule.kt @@ -10,6 +10,7 @@ import area.AreasRepo import conf.ConfQueries import conf.ConfRepo import db.Database +import delivery.DeliveryModel import element.ElementQueries import element.ElementsRepo import event.EventQueries @@ -77,4 +78,6 @@ val appModule = module { viewModelOf(::SearchResultModel) viewModelOf(::IssuesModel) + + viewModelOf(::DeliveryModel) } \ No newline at end of file diff --git a/app/src/main/kotlin/delivery/DeliveryAdapter.kt b/app/src/main/kotlin/delivery/DeliveryAdapter.kt new file mode 100644 index 00000000..38503b2a --- /dev/null +++ b/app/src/main/kotlin/delivery/DeliveryAdapter.kt @@ -0,0 +1,77 @@ +package delivery + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import element.Element +import icons.iconTypeface +import org.btcmap.databinding.ItemDeliveryBinding + +class DeliveryAdapter( + private val onItemClick: (Item) -> Unit, +) : ListAdapter(DiffCallback()) { + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int, + ): ItemViewHolder { + val binding = ItemDeliveryBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false, + ) + + binding.icon.typeface = parent.context.iconTypeface() + + return ItemViewHolder(binding) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + holder.bind(getItem(position), onItemClick) + } + + data class Item( + val element: Element, + val icon: String, + val name: String, + val distanceToUser: String, + ) + + class ItemViewHolder( + private val binding: ItemDeliveryBinding, + ) : RecyclerView.ViewHolder( + binding.root, + ) { + + fun bind(item: Item, onItemClick: (Item) -> Unit) { + binding.apply { + icon.text = item.icon + name.text = item.name + distance.visibility = + if (item.distanceToUser.isNotEmpty()) View.VISIBLE else View.GONE + distance.text = item.distanceToUser + root.setOnClickListener { onItemClick(item) } + } + } + } + + class DiffCallback : DiffUtil.ItemCallback() { + + override fun areItemsTheSame( + oldItem: Item, + newItem: Item, + ): Boolean { + return newItem.element.id == oldItem.element.id + } + + override fun areContentsTheSame( + oldItem: Item, + newItem: Item, + ): Boolean { + return true + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/delivery/DeliveryFragment.kt b/app/src/main/kotlin/delivery/DeliveryFragment.kt new file mode 100644 index 00000000..745f8f36 --- /dev/null +++ b/app/src/main/kotlin/delivery/DeliveryFragment.kt @@ -0,0 +1,87 @@ +package delivery + +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.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams +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.flow.update +import kotlinx.coroutines.launch +import org.btcmap.databinding.FragmentDeliveryBinding +import org.koin.androidx.viewmodel.ext.android.activityViewModel +import org.koin.androidx.viewmodel.ext.android.viewModel +import search.SearchResultModel + +class DeliveryFragment : Fragment() { + + private val model: DeliveryModel by viewModel() + + private val resultModel: SearchResultModel by activityViewModel() + + private var _binding: FragmentDeliveryBinding? = null + private val binding get() = _binding!! + + private val adapter = DeliveryAdapter { item -> + resultModel.element.update { item.element } + findNavController().popBackStack() + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View { + _binding = FragmentDeliveryBinding.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) + + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { + model.items.collect { adapter.submitList(it) } + } + } + + model.setArgs(requireArgs()) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + private fun requireArgs(): DeliveryModel.Args { + return DeliveryModel.Args( + userLat = requireArguments().getFloat("userLat").toDouble(), + userLon = requireArguments().getFloat("userLon").toDouble(), + searchAreaId = requireArguments().getLong("searchAreaId"), + ) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/delivery/DeliveryModel.kt b/app/src/main/kotlin/delivery/DeliveryModel.kt new file mode 100644 index 00000000..90f2b9da --- /dev/null +++ b/app/src/main/kotlin/delivery/DeliveryModel.kt @@ -0,0 +1,114 @@ +package delivery + +import android.app.Application +import android.location.Location +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import element.Element +import element.ElementsRepo +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.btcmap.R +import org.osmdroid.util.GeoPoint +import java.text.NumberFormat + +class DeliveryModel( + private val app: Application, + private val elementsRepo: ElementsRepo, +) : ViewModel() { + + companion object { + private val DISTANCE_FORMAT = NumberFormat.getNumberInstance().apply { + maximumFractionDigits = 1 + } + } + + private val args = MutableStateFlow(null) + + private val _items = MutableStateFlow>(emptyList()) + val items = _items.asStateFlow() + + init { + viewModelScope.launch { + args.collectLatest { args -> + if (args == null) { + return@collectLatest + } + + val unsortedElements = elementsRepo.selectByOsmTagValue( + "delivery", + "yes", + ) + elementsRepo.selectByOsmTagValue( + "delivery", + "only", + ) + + val sortedElements = unsortedElements.sortedBy { + getDistanceInMeters( + startLatitude = args.userLat, + startLongitude = args.userLon, + endLatitude = it.lat, + endLongitude = it.lon, + ) + } + + _items.update { + sortedElements.map { + it.toAdapterItem( + GeoPoint( + args.userLat, + args.userLon, + ) + ) + } + } + } + } + } + + fun setArgs(args: Args) { + this.args.update { args } + } + + private fun Element.toAdapterItem(userLocation: GeoPoint?): DeliveryAdapter.Item { + val distanceStringBuilder = StringBuilder() + + if (userLocation != null) { + val elementLocation = GeoPoint(lat, lon) + val distanceKm = userLocation.distanceToAsDouble(elementLocation) / 1000 + + distanceStringBuilder.apply { + append(DISTANCE_FORMAT.format(distanceKm)) + append(" ") + append(app.resources.getString(R.string.kilometers_short)) + } + } + + return DeliveryAdapter.Item( + element = this, + icon = tags.optString("icon:android").ifBlank { "question_mark" }, + name = overpassData.getJSONObject("tags").optString("name").ifBlank { "Unnamed" }, + distanceToUser = distanceStringBuilder.toString(), + ) + } + + private fun getDistanceInMeters( + startLatitude: Double, + startLongitude: Double, + endLatitude: Double, + endLongitude: Double, + ): Double { + val distance = FloatArray(1) + Location.distanceBetween(startLatitude, startLongitude, endLatitude, endLongitude, distance) + return distance[0].toDouble() + } + + data class Args( + val userLat: Double, + val userLon: Double, + val searchAreaId: 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 c5fa3bba..9e20d5c7 100644 --- a/app/src/main/kotlin/element/ElementQueries.kt +++ b/app/src/main/kotlin/element/ElementQueries.kt @@ -95,7 +95,7 @@ class ElementQueries(val db: SQLiteOpenHelper) { } } - fun selectByCategory(category: String): List { + fun selectByOsmTagValue(tagName: String, tagValue: String): List { val cursor = db.readableDatabase.query( """ SELECT @@ -103,13 +103,44 @@ class ElementQueries(val db: SQLiteOpenHelper) { overpass_data, tags, updated_at, - deleted_at, ext_lat, ext_lon FROM element - WHERE json_extract(tags, '$.category') = ? + WHERE json_extract(overpass_data, '$.tags.$tagName') = ? """, - arrayOf(category), + arrayOf(tagValue), + ) + + return buildList { + while (cursor.moveToNext()) { + add( + Element( + id = cursor.getLong(0), + overpassData = cursor.getJsonObject(1), + tags = cursor.getJsonObject(2), + updatedAt = cursor.getString(3)!!, + lat = cursor.getDouble(4), + lon = cursor.getDouble(5), + ) + ) + } + } + } + + fun selectByBtcMapTagValue(tagName: String, tagValue: String): List { + val cursor = db.readableDatabase.query( + """ + SELECT + id, + overpass_data, + tags, + updated_at, + ext_lat, + ext_lon + FROM element + WHERE json_extract(tags, '$.$tagName') = ? + """, + arrayOf(tagValue), ) return buildList { @@ -143,15 +174,15 @@ class ElementQueries(val db: SQLiteOpenHelper) { ext_lon, json_extract(tags, '$.icon:android') AS icon_id, json_extract(tags, '$.boost:expires') AS boost_expires, - json_extract(osm_json, '$.tags.payment:lightning:requires_companion_app') AS requires_companion_app + json_extract(overpass_data, '$.tags.payment:lightning:requires_companion_app') AS requires_companion_app FROM element WHERE - `json_extract(tags, '$.category') NOT IN (${excludedCategories.joinToString { "'$it'" }}) + json_extract(tags, '$.category') NOT IN (${excludedCategories.joinToString { "'$it'" }}) AND ext_lat > ? AND ext_lat < ? AND ext_lon > ? AND ext_lon < ? - ORDER BY lat DESC + ORDER BY ext_lat DESC """, arrayOf( minLat, diff --git a/app/src/main/kotlin/element/ElementsRepo.kt b/app/src/main/kotlin/element/ElementsRepo.kt index 123829ce..ab1beddb 100644 --- a/app/src/main/kotlin/element/ElementsRepo.kt +++ b/app/src/main/kotlin/element/ElementsRepo.kt @@ -25,8 +25,12 @@ class ElementsRepo( return withContext(Dispatchers.IO) { queries.selectBySearchString(searchString) } } - suspend fun selectByCategory(category: String): List { - return withContext(Dispatchers.IO) { queries.selectByCategory(category) } + suspend fun selectByOsmTagValue(tagName: String, tagValue: String): List { + return withContext(Dispatchers.IO) { queries.selectByOsmTagValue(tagName, tagValue) } + } + + suspend fun selectByBtcMapTagValue(tagName: String, tagValue: String): List { + return withContext(Dispatchers.IO) { queries.selectByBtcMapTagValue(tagName, tagValue) } } suspend fun selectByBoundingBox( diff --git a/app/src/main/kotlin/map/MapFragment.kt b/app/src/main/kotlin/map/MapFragment.kt index 6bedb3d4..1cee766e 100644 --- a/app/src/main/kotlin/map/MapFragment.kt +++ b/app/src/main/kotlin/map/MapFragment.kt @@ -164,6 +164,17 @@ class MapFragment : Fragment() { startActivity(intent) } + R.id.action_delivery -> { + nav.navigate( + R.id.deliveryFragment, + bundleOf( + "userLat" to binding.map.boundingBox.centerLatitude.toFloat(), + "userLon" to binding.map.boundingBox.centerLongitude.toFloat(), + "searchAreaId" to 662L, + ), + ) + } + R.id.action_areas -> { nav.navigate( R.id.areasFragment, diff --git a/app/src/main/kotlin/search/SearchModel.kt b/app/src/main/kotlin/search/SearchModel.kt index 55aa78e9..18ea2a4b 100644 --- a/app/src/main/kotlin/search/SearchModel.kt +++ b/app/src/main/kotlin/search/SearchModel.kt @@ -59,7 +59,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("atm") + elements = elementsRepo.selectByBtcMapTagValue("category", "atm") } else if ( searchString.equals("bar", ignoreCase = true) || searchString.equals("bars", ignoreCase = true) || @@ -72,7 +72,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("bar") + elements = elementsRepo.selectByBtcMapTagValue("category", "bar") } else if ( searchString.equals("cafe", ignoreCase = true) || searchString.equals("cafes", ignoreCase = true) || @@ -85,7 +85,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("cafe") + elements = elementsRepo.selectByBtcMapTagValue("category", "cafe") } else if ( searchString.equals("hotel", ignoreCase = true) || searchString.equals("hotels", ignoreCase = true) || @@ -98,7 +98,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("hotel") + elements = elementsRepo.selectByBtcMapTagValue("category", "hotel") } else if ( searchString.equals("pub", ignoreCase = true) || searchString.equals("pubs", ignoreCase = true) || @@ -111,7 +111,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("pub") + elements = elementsRepo.selectByBtcMapTagValue("category", "pub") } else if ( searchString.equals("restaurant", ignoreCase = true) || searchString.equals("restaurants", ignoreCase = true) || @@ -124,7 +124,7 @@ class SearchModel( ignoreCase = true ) ) { - elements = elementsRepo.selectByCategory("restaurant") + elements = elementsRepo.selectByBtcMapTagValue("category", "restaurant") } else { elements = elementsRepo.selectBySearchString(searchString) } diff --git a/app/src/main/res/layout/fragment_delivery.xml b/app/src/main/res/layout/fragment_delivery.xml new file mode 100644 index 00000000..d71fa839 --- /dev/null +++ b/app/src/main/res/layout/fragment_delivery.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_delivery.xml b/app/src/main/res/layout/item_delivery.xml new file mode 100644 index 00000000..423bf30a --- /dev/null +++ b/app/src/main/res/layout/item_delivery.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/map.xml b/app/src/main/res/menu/map.xml index 5aac27b7..c2479cfb 100644 --- a/app/src/main/res/menu/map.xml +++ b/app/src/main/res/menu/map.xml @@ -13,6 +13,11 @@ android:title="@string/add_location" app:showAsAction="never" /> + + + + + + + + diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 02863798..ff5531e1 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 8161933f..97e2f9ba 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 b3a732dc..e5183554 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d промяна %d промени diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 02863798..ff5531e1 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 a3b31b3c..6c266409 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d change %d changes diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index bacf7fbc..2d87c206 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 d607cb8a..68c39ad7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 fdf06760..06142f3c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d αλλαγή %d αλλαγές diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e897d555..a2050b2b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d cambio %d cambios diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 02863798..ff5531e1 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 074ce631..1ab83826 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 a3b31b3c..6c266409 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d change %d changes diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index d2647c4e..0690ae43 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery שינויים %d שינויים %d diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 535cc2dc..ad5c2cac 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d changes diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 535cc2dc..ad5c2cac 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d changes diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 02863798..ff5531e1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 a745d846..e11f8f88 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 350f63c3..8e3d1dad 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d mudança %d mudanças diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 3f600f2d..a04c89d1 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 b6f1dc4d..b4f8c5b6 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d правка %d правок diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 3f600f2d..a04c89d1 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 e47b5a8c..d321e9d1 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d การเปลี่ยนแปลง diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 06b6e44a..2ef7af58 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 a745d846..e11f8f88 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 02863798..ff5531e1 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %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 535cc2dc..ad5c2cac 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d changes diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 535cc2dc..ad5c2cac 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d changes diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 087a750e..a55eb638 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -66,6 +66,7 @@ Percentage of verified places Days since verified New merchant accepts bitcoins + Delivery %d changes %d change