Skip to content
Snippets Groups Projects
Unverified Commit 709ff324 authored by Lukas Lechner's avatar Lukas Lechner Committed by GitHub
Browse files

Create category list screen (EXPOSUREAPP-5719) #2604


* Add strings for Category Screen

* Create TraceLocationCategory lists for event and location

* Create base implementation of EventRegistrationTestFragment.kt

* Move some classes to sub package

* Finalize layout

* Some layout and accessibility adaptations

* Fix ktlint issues

* Refactor TraceLocationCategoryFragment.kt

* Fix typo

* Use MaterialToolbar

* Add tools:layout for category fragment in test_nav_graph.xml

* Refactor to RecyclerView with ModularAdapter

* Adapt naming of fragment and layouts

* Create TraceLocationCategoryViewModel.kt

* Move CategoryItemList to ViewModel

* Create TraceLocationCategoryViewModelTest.kt

* Fix Lint issues

* Refactor some DI logic

* Move UI components to correct package

* Reformat separator layout

Co-authored-by: default avatarJuraj Kusnier <jurajkusnier@users.noreply.github.com>
Co-authored-by: default avatarRalf Gehrer <ralfgehrer@users.noreply.github.com>
parent fc8ece09
No related branches found
No related tags found
No related merge requests found
Showing
with 498 additions and 1 deletion
......@@ -50,6 +50,10 @@ class EventRegistrationTestFragment : Fragment(R.layout.fragment_test_eventregis
showEventsButton.setOnClickListener {
findNavController().navigate(R.id.showStoredEventsTestFragment)
}
startCreateEventFlowButton.setOnClickListener {
findNavController().navigate(R.id.traceLocationOrganizerCategoriesFragment)
}
}
binding.runMatcher.setOnClickListener {
Toast.makeText(context, "Not implemented", Toast.LENGTH_SHORT).show()
......
......@@ -147,6 +147,17 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/create_event_button"
app:layout_constraintTop_toBottomOf="@id/events_body" />
<com.google.android.material.button.MaterialButton
android:id="@+id/start_create_event_flow_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Start Create Event Flow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/create_event_button"
app:layout_constraintTop_toBottomOf="@id/create_event_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
......@@ -167,6 +167,10 @@
android:name="de.rki.coronawarnapp.test.eventregistration.ui.showevents.ShowStoredEventsTestFragment"
android:label="ShowStoredEventsTestFragment"
tools:layout="@layout/fragment_test_showstoredevents" />
<fragment
android:id="@+id/traceLocationOrganizerCategoriesFragment"
android:name="de.rki.coronawarnapp.ui.eventregistration.organizer.category.TraceLocationCategoryFragment"
android:label="TraceLocationCategoryFragment"
tools:layout="@layout/trace_location_organizer_category_fragment" />
</navigation>
......@@ -8,6 +8,8 @@ import de.rki.coronawarnapp.ui.eventregistration.attendee.confirm.ConfirmCheckIn
import de.rki.coronawarnapp.ui.eventregistration.attendee.confirm.ConfirmCheckInModule
import de.rki.coronawarnapp.ui.eventregistration.attendee.scan.ScanCheckInQrCodeFragment
import de.rki.coronawarnapp.ui.eventregistration.attendee.scan.ScanCheckInQrCodeModule
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.TraceLocationCategoryFragment
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.TraceLocationCategoryModule
@Module
internal abstract class EventRegistrationUIModule {
......@@ -20,4 +22,7 @@ internal abstract class EventRegistrationUIModule {
@ContributesAndroidInjector(modules = [CheckInsModule::class])
abstract fun checkInsFragment(): CheckInsFragment
@ContributesAndroidInjector(modules = [TraceLocationCategoryModule::class])
abstract fun traceLocationCategoryFragment(): TraceLocationCategoryFragment
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category
import android.os.Bundle
import android.view.View
import android.view.accessibility.AccessibilityEvent
import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.TraceLocationOrganizerCategoryFragmentBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.TraceLocationCategoryAdapter
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.popBackStack
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import timber.log.Timber
import javax.inject.Inject
class TraceLocationCategoryFragment : Fragment(R.layout.trace_location_organizer_category_fragment), AutoInject {
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: TraceLocationCategoryViewModel by cwaViewModels { viewModelFactory }
private val binding: TraceLocationOrganizerCategoryFragmentBinding by viewBindingLazy()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.toolbar.setNavigationOnClickListener { popBackStack() }
vm.categoryItems.observe2(this) { categoryItems ->
val adapter = TraceLocationCategoryAdapter(categoryItems) {
// TODO: Set click-listener - Continue with event creation flow in next PR
Timber.d("Clicked on TraceLocationCategory: $it")
}
binding.recyclerViewCategories.adapter = adapter
}
}
override fun onResume() {
super.onResume()
binding.categoryRoot.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT)
}
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelKey
@Module
abstract class TraceLocationCategoryModule {
@Binds
@IntoMap
@CWAViewModelKey(TraceLocationCategoryViewModel::class)
abstract fun traceLocationCategoryViewModel(factory: TraceLocationCategoryViewModel.Factory):
CWAViewModelFactory<out CWAViewModel>
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.CategoryItem
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.TraceLocationUIType
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.traceLocationCategories
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.header.TraceLocationHeaderItem
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.separator.TraceLocationSeparatorItem
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
class TraceLocationCategoryViewModel @AssistedInject constructor() : CWAViewModel() {
@AssistedFactory
interface Factory : SimpleCWAViewModelFactory<TraceLocationCategoryViewModel>
private val categoryItemList = mutableListOf<CategoryItem>().apply {
add(TraceLocationHeaderItem(R.string.tracelocation_organizer_category_type_location_header))
addAll(traceLocationCategories.filter { it.uiType == TraceLocationUIType.LOCATION })
add(TraceLocationSeparatorItem)
add(TraceLocationHeaderItem(R.string.tracelocation_organizer_category_type_event_header))
addAll(traceLocationCategories.filter { it.uiType == TraceLocationUIType.EVENT })
}.toList()
val categoryItems: LiveData<List<CategoryItem>> = MutableLiveData(categoryItemList)
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter
import de.rki.coronawarnapp.util.lists.HasStableId
interface CategoryItem : HasStableId
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.viewbinding.ViewBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.TraceLocationCategory
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.TraceLocationCategoryVH
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.header.TraceLocationHeaderItem
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.header.TraceLocationHeaderVH
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.separator.TraceLocationSeparatorItem
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.separator.TraceLocationSeparatorVH
import de.rki.coronawarnapp.util.lists.BindableVH
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffUtilAdapter
import de.rki.coronawarnapp.util.lists.diffutil.AsyncDiffer
import de.rki.coronawarnapp.util.lists.diffutil.update
import de.rki.coronawarnapp.util.lists.modular.ModularAdapter
import de.rki.coronawarnapp.util.lists.modular.mods.DataBinderMod
import de.rki.coronawarnapp.util.lists.modular.mods.StableIdMod
import de.rki.coronawarnapp.util.lists.modular.mods.TypedVHCreatorMod
class TraceLocationCategoryAdapter(
categoryList: List<CategoryItem>,
private val itemClickListener: (category: TraceLocationCategory) -> Unit
) : ModularAdapter<TraceLocationCategoryAdapter.ItemVH<CategoryItem, ViewBinding>>(),
AsyncDiffUtilAdapter<CategoryItem> {
override val asyncDiffer: AsyncDiffer<CategoryItem> = AsyncDiffer(adapter = this)
init {
modules.addAll(
listOf(
StableIdMod(data),
DataBinderMod<CategoryItem, ItemVH<CategoryItem, ViewBinding>>(data),
TypedVHCreatorMod({ data[it] is TraceLocationHeaderItem }) { TraceLocationHeaderVH(it) },
TypedVHCreatorMod({ data[it] is TraceLocationCategory }) {
TraceLocationCategoryVH(
it,
itemClickListener
)
},
TypedVHCreatorMod({ data[it] is TraceLocationSeparatorItem }) { TraceLocationSeparatorVH(it) }
)
)
update(categoryList)
}
override fun getItemCount(): Int {
return data.size
}
abstract class ItemVH<Item : CategoryItem, VB : ViewBinding>(
@LayoutRes layoutRes: Int,
parent: ViewGroup
) : ModularAdapter.VH(layoutRes, parent), BindableVH<Item, VB>
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category
import androidx.annotation.StringRes
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_CRAFT
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_EDUCATIONAL_INSTITUTION
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_FOOD_SERVICE
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_OTHER
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_PUBLIC_BUILDING
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_RETAIL
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_PERMANENT_WORKPLACE
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_CLUB_ACTIVITY
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_CULTURAL_EVENT
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_OTHER
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_PRIVATE_EVENT
import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass.TraceLocationType.LOCATION_TYPE_TEMPORARY_WORSHIP_SERVICE
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.CategoryItem
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.TraceLocationUIType.EVENT
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category.TraceLocationUIType.LOCATION
data class TraceLocationCategory(
val type: TraceLocationOuterClass.TraceLocationType,
val uiType: TraceLocationUIType,
@StringRes val title: Int,
@StringRes val subtitle: Int? = null
) : CategoryItem {
override val stableId = hashCode().toLong()
}
enum class TraceLocationUIType {
LOCATION, EVENT
}
val traceLocationCategories = listOf(
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_RETAIL,
LOCATION,
R.string.tracelocation_organizer_category_retail_title,
R.string.tracelocation_organizer_category_retail_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_FOOD_SERVICE,
LOCATION,
R.string.tracelocation_organizer_category_food_service_title,
R.string.tracelocation_organizer_category_food_service_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_CRAFT,
LOCATION,
R.string.tracelocation_organizer_category_craft_title,
R.string.tracelocation_organizer_category_craft_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_WORKPLACE,
LOCATION,
R.string.tracelocation_organizer_category_workplace_title,
R.string.tracelocation_organizer_category_workplace_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_EDUCATIONAL_INSTITUTION,
LOCATION,
R.string.tracelocation_organizer_category_educational_institution_title,
R.string.tracelocation_organizer_category_educational_institution_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_PUBLIC_BUILDING,
LOCATION,
R.string.tracelocation_organizer_category_public_building_title,
R.string.tracelocation_organizer_category_public_building_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_PERMANENT_OTHER,
LOCATION,
R.string.tracelocation_organizer_category_other_location_title
),
TraceLocationCategory(
LOCATION_TYPE_TEMPORARY_CULTURAL_EVENT,
EVENT,
R.string.tracelocation_organizer_category_cultural_event_title,
R.string.tracelocation_organizer_category_cultural_event_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_TEMPORARY_CLUB_ACTIVITY,
EVENT,
R.string.tracelocation_organizer_category_club_activity_title,
R.string.tracelocation_organizer_category_club_activity_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_TEMPORARY_PRIVATE_EVENT,
EVENT,
R.string.tracelocation_organizer_category_private_event_title,
R.string.tracelocation_organizer_category_private_event_subtitle
),
TraceLocationCategory(
LOCATION_TYPE_TEMPORARY_WORSHIP_SERVICE,
EVENT,
R.string.tracelocation_organizer_category_worship_service_title
),
TraceLocationCategory(
LOCATION_TYPE_TEMPORARY_OTHER,
EVENT,
R.string.tracelocation_organizer_category_other_event_title
)
)
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.category
import android.view.ViewGroup
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.TraceLocationOrganizerCategoryItemBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.TraceLocationCategoryAdapter
class TraceLocationCategoryVH(parent: ViewGroup, onItemClickListener: (category: TraceLocationCategory) -> Unit) :
TraceLocationCategoryAdapter.ItemVH<TraceLocationCategory, TraceLocationOrganizerCategoryItemBinding>(
layoutRes = R.layout.trace_location_organizer_category_item,
parent = parent
) {
override val viewBinding: Lazy<TraceLocationOrganizerCategoryItemBinding> = lazy {
TraceLocationOrganizerCategoryItemBinding.bind(itemView)
}
override val onBindData:
TraceLocationOrganizerCategoryItemBinding.(item: TraceLocationCategory, payloads: List<Any>) -> Unit =
{ item, _ ->
title.text = context.getString(item.title)
if (item.subtitle != null) {
subtitle.text = context.getString(item.subtitle)
}
root.setOnClickListener { onItemClickListener.invoke(item) }
}
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.header
import androidx.annotation.StringRes
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.CategoryItem
data class TraceLocationHeaderItem(@StringRes val headerText: Int) : CategoryItem {
override val stableId = this.hashCode().toLong()
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.header
import android.view.ViewGroup
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.TraceLocationOrganizerCategoryHeaderBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.TraceLocationCategoryAdapter
class TraceLocationHeaderVH(parent: ViewGroup) :
TraceLocationCategoryAdapter.ItemVH<TraceLocationHeaderItem, TraceLocationOrganizerCategoryHeaderBinding>(
layoutRes = R.layout.trace_location_organizer_category_header,
parent = parent
) {
override val viewBinding: Lazy<TraceLocationOrganizerCategoryHeaderBinding> =
lazy { TraceLocationOrganizerCategoryHeaderBinding.bind(itemView) }
override val onBindData:
TraceLocationOrganizerCategoryHeaderBinding.(item: TraceLocationHeaderItem, payloads: List<Any>) -> Unit =
{ item, _ ->
categoryHeader.text = context.getString(item.headerText)
}
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.separator
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.CategoryItem
object TraceLocationSeparatorItem : CategoryItem {
override val stableId = this.hashCode().toLong()
}
package de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.separator
import android.view.ViewGroup
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.TraceLocationOrganizerCategorySeparatorBinding
import de.rki.coronawarnapp.ui.eventregistration.organizer.category.adapter.TraceLocationCategoryAdapter
class TraceLocationSeparatorVH(parent: ViewGroup) :
TraceLocationCategoryAdapter.ItemVH<TraceLocationSeparatorItem, TraceLocationOrganizerCategorySeparatorBinding>(
layoutRes = R.layout.trace_location_organizer_category_separator,
parent = parent
) {
override val viewBinding: Lazy<TraceLocationOrganizerCategorySeparatorBinding> =
lazy { TraceLocationOrganizerCategorySeparatorBinding.bind(itemView) }
override val onBindData:
TraceLocationOrganizerCategorySeparatorBinding.(item: TraceLocationSeparatorItem, payloads: List<Any>) -> Unit =
{ _, _ ->
// NOOP
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/category_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/tracelocation_organizer_category_title"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="@style/CWAToolbar.Close.Transparent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/tracelocation_organizer_category_title" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_categories"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/category_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/spacing_normal"
android:layout_marginTop="@dimen/spacing_tiny"
android:layout_marginBottom="@dimen/spacing_tiny"
android:text="@string/tracelocation_organizer_category_type_location_header" />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingStart="@dimen/spacing_normal"
android:paddingEnd="@dimen/spacing_normal"
android:background="?android:selectableItemBackground"
android:orientation="vertical">
<TextView
android:id="@+id/title"
style="@style/body1"
android:textSize="17sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Einzelhandel" />
<TextView
android:id="@+id/subtitle"
style="@style/subtitleMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Geschäft, Verkaufsraum" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginBottom="@dimen/spacing_small"
android:background="@color/colorHairline" />
\ No newline at end of file
......@@ -34,4 +34,68 @@
<string name="trace_location_checkins_remove_single_title">Wollen Sie diesen Eintrag wirklich entfernen?</string>
<!-- XTXT: My checkin-ins: Confirmation dialog description when removing all/single items -->
<string name="trace_location_checkins_remove_message">Sie können dann Personen, die zur selben Zeit für diesen Ort oder Event eingecheckt waren, bei Bedarf nicht mehr warnen oder von ihnen gewarnt werden.</string>
<!-- XHED: Title of the category list screen of the event creation -->
<string name="tracelocation_organizer_category_title">QR-Code erstellen</string>
<!-- XHED: Title of location types in the category list screen of the event creation -->
<string name="tracelocation_organizer_category_type_location_header">Ort</string>
<!-- XTXT: Title for the retail category -->
<string name="tracelocation_organizer_category_retail_title">Einzelhandel</string>
<!-- XTXT: Subtitle for the retail category -->
<string name="tracelocation_organizer_category_retail_subtitle">Geschäft, Verkaufsraum</string>
<!-- XTXT: Title for the food service category -->
<string name="tracelocation_organizer_category_food_service_title">Gastronomiebetrieb</string>
<!-- XTXT: Subtitle for the food service category -->
<string name="tracelocation_organizer_category_food_service_subtitle">Café, Kneipe, Restaurant, Hotel</string>
<!-- XTXT: Title for the craft category -->
<string name="tracelocation_organizer_category_craft_title">Handwerksbetrieb</string>
<!-- XTXT: Subtitle for the craft category -->
<string name="tracelocation_organizer_category_craft_subtitle">Friseur, Schreinerei</string>
<!-- XTXT: Title for the workplace category -->
<string name="tracelocation_organizer_category_workplace_title">Arbeitsstätte</string>
<!-- XTXT: Subtitle for the workplace category -->
<string name="tracelocation_organizer_category_workplace_subtitle">Büro, Konferenzraum, Kantine</string>
<!-- XTXT: Title for the educational institution category -->
<string name="tracelocation_organizer_category_educational_institution_title">Bildungsstätte</string>
<!-- XTXT: Subtitle for the educational institution category -->
<string name="tracelocation_organizer_category_educational_institution_subtitle">Klassenzimmer, Vorlesungssaal, Bibliothek</string>
<!-- XTXT: Title for the public building category -->
<string name="tracelocation_organizer_category_public_building_title">öffentliches Gebäude</string>
<!-- XTXT: Subtitle for the public building category -->
<string name="tracelocation_organizer_category_public_building_subtitle">Bürgeramt, Museum</string>
<!-- XTXT: Title for other location -->
<string name="tracelocation_organizer_category_other_location_title">anderer Ort</string>
<!-- XHED: Title of event types in the category list screen of the event creation -->
<string name="tracelocation_organizer_category_type_event_header">Event</string>
<!-- XTXT: Title for the cultural event category -->
<string name="tracelocation_organizer_category_cultural_event_title">Kulturveranstaltung</string>
<!-- XTXT: Subtitle for the cultural event category -->
<string name="tracelocation_organizer_category_cultural_event_subtitle">Konzert, Kunstausstellung</string>
<!-- XTXT: Title for the club activity category -->
<string name="tracelocation_organizer_category_club_activity_title">Vereinsaktivität</string>
<!-- XTXT: Subtitle for the club activity category -->
<string name="tracelocation_organizer_category_club_activity_subtitle">Sporttraining, Mitgliederversammlung</string>
<!-- XTXT: Title for the private event category -->
<string name="tracelocation_organizer_category_private_event_title">private Feier</string>
<!-- XTXT: Subtitle for the private event category -->
<string name="tracelocation_organizer_category_private_event_subtitle">Geburtstag, Familienfeier</string>
<!-- XTXT: Title for the worship service category -->
<string name="tracelocation_organizer_category_worship_service_title">Gottesdienst</string>
<!-- XTXT: Title for other event -->
<string name="tracelocation_organizer_category_other_event_title">anderes Event</string>
</resources>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment