diff --git a/examples/src/main/AndroidManifest.xml b/examples/src/main/AndroidManifest.xml
index 0315b1cb48e..213c4d8bc36 100644
--- a/examples/src/main/AndroidManifest.xml
+++ b/examples/src/main/AndroidManifest.xml
@@ -101,6 +101,11 @@
android:screenOrientation="portrait">
+
+
+
diff --git a/examples/src/main/java/com/mapbox/navigation/examples/MainActivity.kt b/examples/src/main/java/com/mapbox/navigation/examples/MainActivity.kt
index dcb54683038..c0132bb7ec3 100644
--- a/examples/src/main/java/com/mapbox/navigation/examples/MainActivity.kt
+++ b/examples/src/main/java/com/mapbox/navigation/examples/MainActivity.kt
@@ -33,6 +33,7 @@ import com.mapbox.navigation.examples.core.databinding.LayoutActivityMainBinding
import com.mapbox.navigation.examples.util.LocationPermissionsHelper
import com.mapbox.navigation.examples.util.LocationPermissionsHelper.Companion.areLocationPermissionsGranted
import com.mapbox.navigation.examples.util.RouteDrawingActivity
+import com.mapbox.navigation.examples.voicefeedback.MapboxVoiceFeedbackActivity
class MainActivity : AppCompatActivity(), PermissionsListener {
@@ -148,6 +149,11 @@ class MainActivity : AppCompatActivity(), PermissionsListener {
getString(R.string.title_adasis),
getString(R.string.description_adasis),
AdasisActivity::class.java
+ ),
+ SampleItem(
+ getString(R.string.title_voice_feedback),
+ getString(R.string.description_voice_feedback),
+ MapboxVoiceFeedbackActivity::class.java
)
)
}
diff --git a/examples/src/main/java/com/mapbox/navigation/examples/voicefeedback/MapboxVoiceFeedbackActivity.kt b/examples/src/main/java/com/mapbox/navigation/examples/voicefeedback/MapboxVoiceFeedbackActivity.kt
new file mode 100644
index 00000000000..437f8a6a7e9
--- /dev/null
+++ b/examples/src/main/java/com/mapbox/navigation/examples/voicefeedback/MapboxVoiceFeedbackActivity.kt
@@ -0,0 +1,100 @@
+package com.mapbox.navigation.examples.voicefeedback
+
+import android.Manifest
+import android.os.Bundle
+import android.widget.Toast
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.maps.MapboxMap
+import com.mapbox.maps.plugin.locationcomponent.location
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.base.options.NavigationOptions
+import com.mapbox.navigation.core.MapboxNavigation
+import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
+import com.mapbox.navigation.core.lifecycle.MapboxNavigationObserver
+import com.mapbox.navigation.core.lifecycle.requireMapboxNavigation
+import com.mapbox.navigation.examples.core.databinding.LayoutActivityVoiceFeedbackBinding
+import com.mapbox.navigation.examples.util.Utils
+import com.mapbox.navigation.ui.base.installer.installComponents
+import com.mapbox.navigation.ui.maps.location.NavigationLocationProvider
+import com.mapbox.navigation.ui.voicefeedback.voiceFeedbackButton
+
+/**
+ * Example activity demonstrating the [libnavui-voicefeedback](https://docs.mapbox.com/android/navigation/ui/latest/libnavui-voicefeedback/overview/)
+ * SDK. This SDK provides voice feedback capabilities, allowing users to report issues,
+ * suggest improvements, or give feedback directly through voice while navigating.
+ *
+ * It utilizes [MapboxVoiceFeedbackButton] and [FeedbackAgentSession] (via the ComponentInstaller)
+ * to manage the lifecycle and UI states of the voice interaction flow.
+ */
+@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
+class MapboxVoiceFeedbackActivity : AppCompatActivity() {
+
+ private val navigationLocationProvider = NavigationLocationProvider()
+ private lateinit var binding: LayoutActivityVoiceFeedbackBinding
+ private lateinit var mapboxMap: MapboxMap
+ private val mapboxNavigation: MapboxNavigation by requireMapboxNavigation(
+ onResumedObserver = object : MapboxNavigationObserver {
+ override fun onAttached(mapboxNavigation: MapboxNavigation) {
+ }
+
+ override fun onDetached(mapboxNavigation: MapboxNavigation) {
+ }
+ },
+ onInitialize = this::initNavigation
+ )
+
+ private val requestPermissionLauncher = registerForActivityResult(
+ ActivityResultContracts.RequestMultiplePermissions()
+ ) { permissions ->
+ val areGranted = permissions.values.all { it }
+ if (areGranted) {
+ mapboxNavigation.startTripSession()
+ } else {
+ Toast.makeText(this, "Location and Microphone permissions are required", Toast.LENGTH_LONG).show()
+ finish()
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = LayoutActivityVoiceFeedbackBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ mapboxMap = binding.mapView.getMapboxMap()
+
+ requestPermissionLauncher.launch(
+ arrayOf(
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.RECORD_AUDIO
+ )
+ )
+ }
+
+ private fun initNavigation() {
+ if (!MapboxNavigationApp.isSetup()) {
+ MapboxNavigationApp.setup(
+ NavigationOptions.Builder(this)
+ .accessToken(Utils.getMapboxAccessToken(this))
+ .build()
+ )
+ }
+
+ MapboxNavigationApp.installComponents(this) {
+ voiceFeedbackButton(binding.voiceFeedbackButton)
+ }
+
+ binding.mapView.location.apply {
+ enabled = true
+ setLocationProvider(navigationLocationProvider)
+ }
+
+ mapboxMap.setCamera(
+ com.mapbox.maps.CameraOptions.Builder()
+ .center(com.mapbox.geojson.Point.fromLngLat(-73.98513, 40.748817)) // New York City
+ .zoom(13.0)
+ .build()
+ )
+ }
+
+}
diff --git a/examples/src/main/res/layout/layout_activity_voice_feedback.xml b/examples/src/main/res/layout/layout_activity_voice_feedback.xml
new file mode 100644
index 00000000000..dbacd1fc037
--- /dev/null
+++ b/examples/src/main/res/layout/layout_activity_voice_feedback.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/examples/src/main/res/values/strings.xml b/examples/src/main/res/values/strings.xml
index 79afad8bcd0..ca1df0476f2 100644
--- a/examples/src/main/res/values/strings.xml
+++ b/examples/src/main/res/values/strings.xml
@@ -39,6 +39,9 @@
Adasis Example
Demonstrates to to access Adasis functionality.
+ Voice Feedback Example
+ Demonstrates the use of voice feedback API.
+
Start Navigation
Play history
Select history
diff --git a/gradle/publish.gradle b/gradle/publish.gradle
index 88366d61fe6..9e30f859f49 100644
--- a/gradle/publish.gradle
+++ b/gradle/publish.gradle
@@ -74,6 +74,7 @@ sdkNameMap["libnavui-tripprogress"] = "mobile-navigation-ui-tripprogress"
sdkNameMap["libnavui-maneuver"] = "mobile-navigation-ui-maneuver"
sdkNameMap["libnavui-resources"] = "mobile-navigation-ui-resources"
sdkNameMap["libnavui-voice"] = "mobile-navigation-ui-voice"
+sdkNameMap["libnavui-voicefeedback"] = "mobile-navigation-ui-voicefeedback"
sdkNameMap["libnavui-speedlimit"] = "mobile-navigation-ui-speedlimit"
sdkNameMap["libnavui-shield"] = "mobile-navigation-ui-shield"
sdkNameMap["libnavui-status"] = "mobile-navigation-ui-status"
diff --git a/libnavigation-android/build.gradle b/libnavigation-android/build.gradle
index 22795f76ce2..e17831df33a 100644
--- a/libnavigation-android/build.gradle
+++ b/libnavigation-android/build.gradle
@@ -34,6 +34,7 @@ dependencies {
api project(":libnavui-speedlimit")
api project(":libnavui-tripprogress")
api project(":libnavui-voice")
+ api project(":libnavui-voicefeedback")
api project(":libnavui-status")
}
diff --git a/libnavigation-voicefeedback/src/main/java/com/mapbox/navigation/voicefeedback/FeedbackAgentSession.kt b/libnavigation-voicefeedback/src/main/java/com/mapbox/navigation/voicefeedback/FeedbackAgentSession.kt
index ed67e1c18ef..e006f11ec98 100644
--- a/libnavigation-voicefeedback/src/main/java/com/mapbox/navigation/voicefeedback/FeedbackAgentSession.kt
+++ b/libnavigation-voicefeedback/src/main/java/com/mapbox/navigation/voicefeedback/FeedbackAgentSession.kt
@@ -197,7 +197,12 @@ class FeedbackAgentSession private constructor(
engine.disconnect()
}
- private companion object {
+ companion object {
private const val TAG = "FeedbackAgentSession"
+
+ @JvmStatic
+ fun getRegisteredInstance(): FeedbackAgentSession = MapboxNavigationApp
+ .getObservers(FeedbackAgentSession::class)
+ .firstOrNull() ?: Builder().build().also { MapboxNavigationApp.registerObserver(it) }
}
}
diff --git a/libnavui-dropin/build.gradle b/libnavui-dropin/build.gradle
index 93bc336a334..fd85ee31756 100644
--- a/libnavui-dropin/build.gradle
+++ b/libnavui-dropin/build.gradle
@@ -48,6 +48,7 @@ dependencies {
api project(":libnavui-speedlimit")
api project(":libnavui-tripprogress")
api project(":libnavui-voice")
+ api project(":libnavui-voicefeedback")
implementation project(":libnavui-app")
api dependenciesList.mapboxSdkServices
diff --git a/libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/voicefeedback/VoiceFeedbackScreenshotComponentInstaller.kt b/libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/voicefeedback/VoiceFeedbackScreenshotComponentInstaller.kt
new file mode 100644
index 00000000000..c873e26c2e3
--- /dev/null
+++ b/libnavui-dropin/src/main/java/com/mapbox/navigation/dropin/voicefeedback/VoiceFeedbackScreenshotComponentInstaller.kt
@@ -0,0 +1,31 @@
+package com.mapbox.navigation.dropin.voicefeedback
+
+import com.mapbox.maps.MapView
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.ui.base.installer.ComponentInstaller
+import com.mapbox.navigation.ui.base.installer.Installation
+import com.mapbox.navigation.ui.maps.util.ViewUtils.capture
+import com.mapbox.navigation.ui.voicefeedback.internal.ScreenshotCapturer
+import com.mapbox.navigation.ui.voicefeedback.internal.VoiceFeedbackComponent
+import com.mapbox.navigation.ui.voicefeedback.view.MapboxVoiceFeedbackButton
+
+/**
+ * Installs the voice feedback button component into the current Mapbox Navigation flow.
+ *
+ * @param mapView The [MapView] that will be used to capture screenshots during feedback. Leave null
+ * if you don't want to capture screenshots.
+ * @param button The visual representation of the voice feedback button.
+ * @return An [Installation] handle that can be used to remove the component.
+ */
+@ExperimentalPreviewMapboxNavigationAPI
+fun ComponentInstaller.voiceFeedbackButton(
+ mapView: MapView? = null,
+ button: MapboxVoiceFeedbackButton,
+): Installation {
+ val screenshotCapturer = mapView?.let {
+ ScreenshotCapturer { callback ->
+ it.capture { screenshot -> callback(screenshot) }
+ }
+ }
+ return component(VoiceFeedbackComponent(button, screenshotCapturer))
+}
diff --git a/libnavui-voicefeedback/.gitignore b/libnavui-voicefeedback/.gitignore
new file mode 100644
index 00000000000..c2a44471591
--- /dev/null
+++ b/libnavui-voicefeedback/.gitignore
@@ -0,0 +1,2 @@
+/build
+src/main/assets/sdk_versions/*
\ No newline at end of file
diff --git a/libnavui-voicefeedback/build.gradle b/libnavui-voicefeedback/build.gradle
new file mode 100644
index 00000000000..e8b940cef6b
--- /dev/null
+++ b/libnavui-voicefeedback/build.gradle
@@ -0,0 +1,77 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-kapt'
+apply plugin: 'kotlin-parcelize'
+apply plugin: 'org.jetbrains.dokka'
+apply plugin: 'com.jaredsburrows.license'
+apply plugin: 'com.mapbox.android.sdk.versions'
+apply from: "../gradle/ktlint.gradle"
+apply from: file("../gradle/artifact-settings.gradle")
+apply from: "../gradle/kdoc-settings.gradle"
+
+version = project.ext.versionName
+group = project.ext.mapboxArtifactGroupId
+
+android {
+ compileSdkVersion androidVersions.compileSdkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ minSdkVersion androidVersions.minSdkVersion
+ targetSdkVersion androidVersions.targetSdkVersion
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles 'proguard-rules.pro', "../proguard/proguard-project.pro"
+ }
+
+ testOptions {
+ unitTests.returnDefaultValues = true
+ unitTests.includeAndroidResources = true
+ }
+
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+dependencies {
+ api project(":libnavigation-voicefeedback")
+ api project(":libnavui-base")
+ implementation project(":libnavui-resources")
+
+ api dependenciesList.mapboxSdkServices
+
+ implementation dependenciesList.kotlinStdLib
+
+ implementation dependenciesList.coroutinesAndroid
+
+ // androidX
+ implementation dependenciesList.androidXConstraintLayout
+ implementation dependenciesList.androidXAppCompat
+ implementation dependenciesList.androidXCoreKtx
+
+ apply from: "../gradle/unit-testing-dependencies.gradle"
+ testImplementation(project(':libtesting-utils'))
+ testImplementation project(':libtesting-navigation-util')
+}
+
+dokkaHtmlPartial {
+ outputDirectory.set(kdocPath)
+ moduleName.set("UI Feedback Agent")
+ dokkaSourceSets {
+ configureEach {
+ reportUndocumented.set(true)
+ perPackageOption {
+ matchingRegex.set("com.mapbox.navigation.ui.voicefeedback.internal.*")
+ suppress.set(true)
+ }
+ }
+ }
+}
+
+apply from: "../gradle/track-public-apis.gradle"
+apply from: "../gradle/jacoco.gradle"
+apply from: "../gradle/publish.gradle"
diff --git a/libnavui-voicefeedback/gradle.properties b/libnavui-voicefeedback/gradle.properties
new file mode 100644
index 00000000000..01017c63583
--- /dev/null
+++ b/libnavui-voicefeedback/gradle.properties
@@ -0,0 +1,3 @@
+POM_ARTIFACT_ID=ui-voicefeedback
+POM_ARTIFACT_TITLE=Mapbox Navigation Feedback Agent
+POM_DESCRIPTION=Artifact that provides ability to collect feedback using voice
\ No newline at end of file
diff --git a/libnavui-voicefeedback/proguard-rules.pro b/libnavui-voicefeedback/proguard-rules.pro
new file mode 100644
index 00000000000..481bb434814
--- /dev/null
+++ b/libnavui-voicefeedback/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/AndroidManifest.xml b/libnavui-voicefeedback/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..3dbf7681d34
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/ComponentInstaller.kt b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/ComponentInstaller.kt
new file mode 100644
index 00000000000..0edf6826dac
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/ComponentInstaller.kt
@@ -0,0 +1,19 @@
+package com.mapbox.navigation.ui.voicefeedback
+
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.ui.base.installer.ComponentInstaller
+import com.mapbox.navigation.ui.base.installer.Installation
+import com.mapbox.navigation.ui.voicefeedback.internal.VoiceFeedbackComponent
+import com.mapbox.navigation.ui.voicefeedback.view.MapboxVoiceFeedbackButton
+
+/**
+ * Installs the voice feedback button component into the current Mapbox Navigation flow.
+ *
+ * @param button The visual representation of the voice feedback button.
+ * @return An [Installation] handle that can be used to remove the component.
+ */
+@ExperimentalPreviewMapboxNavigationAPI
+fun ComponentInstaller.voiceFeedbackButton(button: MapboxVoiceFeedbackButton): Installation {
+ return component(VoiceFeedbackComponent(button))
+}
+
diff --git a/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/internal/VoiceFeedbackComponent.kt b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/internal/VoiceFeedbackComponent.kt
new file mode 100644
index 00000000000..adf8711f632
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/internal/VoiceFeedbackComponent.kt
@@ -0,0 +1,149 @@
+package com.mapbox.navigation.ui.voicefeedback.internal
+
+import android.content.Context
+import android.content.ContextWrapper
+import android.graphics.Bitmap
+import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentManager
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.core.MapboxNavigation
+import com.mapbox.navigation.core.internal.extensions.flowLocationMatcherResult
+import com.mapbox.navigation.core.internal.telemetry.UserFeedbackCallback
+import com.mapbox.navigation.core.telemetry.events.FeedbackHelper
+import com.mapbox.navigation.core.trip.session.LocationMatcherResult
+import com.mapbox.navigation.ui.base.lifecycle.UIComponent
+import com.mapbox.navigation.ui.voicefeedback.view.MapboxVoiceFeedbackButton
+import com.mapbox.navigation.ui.voicefeedback.view.MapboxVoiceFeedbackDialog
+import com.mapbox.navigation.utils.internal.logE
+import com.mapbox.navigation.voicefeedback.ASRState
+import com.mapbox.navigation.voicefeedback.FeedbackAgentSession
+import com.mapbox.navigation.voicefeedback.postVoiceFeedback
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlin.coroutines.resume
+
+fun interface ScreenshotCapturer {
+ fun capture(callback: (Bitmap) -> Unit)
+}
+
+/**
+ * UI component that orchestrates the voice feedback flow: button interaction,
+ * [FeedbackAgentSession] lifecycle, ASR dialog, screenshot capture, and feedback posting.
+ *
+ * @param button the voice feedback button view that triggers the flow
+ */
+@ExperimentalPreviewMapboxNavigationAPI
+class VoiceFeedbackComponent(
+ private val button: MapboxVoiceFeedbackButton,
+ private val screenshotCapturer: ScreenshotCapturer? = null,
+) : UIComponent() {
+ private var locationMatcherResult: LocationMatcherResult? = null
+
+ private val session: FeedbackAgentSession =
+ FeedbackAgentSession
+ .Builder()
+ .build()
+
+ private val isDialogVisible = MutableStateFlow(false)
+
+ private var mapboxNavigation: MapboxNavigation? = null
+ private var dialog: MapboxVoiceFeedbackDialog? = null
+
+ override fun onAttached(mapboxNavigation: MapboxNavigation) {
+ super.onAttached(mapboxNavigation)
+ this.mapboxNavigation = mapboxNavigation
+ session.onAttached(mapboxNavigation)
+ session.connect()
+
+ coroutineScope.launch {
+ mapboxNavigation
+ .flowLocationMatcherResult()
+ .collect { locationMatcherResult = it }
+ }
+
+ coroutineScope.launch {
+ session.asrState.collect { state ->
+ if (state is ASRState.Result) {
+ postFeedback(state)
+ }
+ }
+ }
+
+ coroutineScope.launch {
+ isDialogVisible.collectLatest { visible ->
+ if (visible) {
+ showDialog()
+ } else {
+ dismissDialog()
+ }
+ }
+ }
+
+ button.setOnClickListener { onButtonClicked() }
+ }
+
+ override fun onDetached(mapboxNavigation: MapboxNavigation) {
+ button.setOnClickListener(null)
+ dismissDialog()
+ session.onDetached(mapboxNavigation)
+ this.mapboxNavigation = null
+ super.onDetached(mapboxNavigation)
+ }
+
+ private fun onButtonClicked() {
+ session.startListening()
+ isDialogVisible.value = true
+ }
+
+ private fun showDialog() {
+ val fragmentManager =
+ button.context.findFragmentManager() ?: run {
+ logE(TAG) { "Cannot show dialog: host Activity is not a FragmentActivity" }
+ return
+ }
+
+ dialog = MapboxVoiceFeedbackDialog().apply {
+ asrState = session.asrState
+ onCancel = { session.interruptListening() }
+ onDismiss = { isDialogVisible.value = false }
+ show(fragmentManager, MapboxVoiceFeedbackDialog.TAG)
+ }
+ }
+
+ private fun dismissDialog() {
+ dialog?.dismissAllowingStateLoss()
+ dialog = null
+ }
+
+ private suspend fun captureScreenshot(): Bitmap? = suspendCancellableCoroutine { cont ->
+ screenshotCapturer?.capture { cont.resume(it) } ?: cont.resume(null)
+ }
+
+ private suspend fun postFeedback(result: ASRState.Result) {
+ val nav = mapboxNavigation ?: return
+ val screenshot = captureScreenshot()?.let {
+ FeedbackHelper.encodeScreenshot(it)
+ } ?: ""
+ nav.postVoiceFeedback(
+ feedbackSubType = result.feedbackType,
+ description = result.text,
+ screenshot = screenshot,
+ userFeedbackCallback = UserFeedbackCallback {/*no-op*/},
+ )
+ }
+
+ private companion object {
+ private const val TAG = "VoiceFeedbackComponent"
+ }
+}
+
+private fun Context.findFragmentManager(): FragmentManager? {
+ var ctx = this
+ while (true) {
+ if (ctx is FragmentActivity) return ctx.supportFragmentManager
+ if (ctx is ContextWrapper) ctx = ctx.baseContext else return null
+ }
+}
diff --git a/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackButton.kt b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackButton.kt
new file mode 100644
index 00000000000..b07c5db74b6
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackButton.kt
@@ -0,0 +1,86 @@
+package com.mapbox.navigation.ui.voicefeedback.view
+
+import android.content.Context
+import android.content.res.TypedArray
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import androidx.annotation.StyleRes
+import androidx.annotation.UiThread
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.core.content.ContextCompat
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.ui.voicefeedback.R
+import com.mapbox.navigation.ui.voicefeedback.databinding.MapboxVoiceFeedbackButtonLayoutBinding
+
+@ExperimentalPreviewMapboxNavigationAPI
+@UiThread
+class MapboxVoiceFeedbackButton : FrameLayout {
+ private val binding =
+ MapboxVoiceFeedbackButtonLayoutBinding.inflate(LayoutInflater.from(context), this)
+
+ val iconImage: AppCompatImageView = binding.iconImage
+
+ constructor(context: Context) : this(context, null)
+
+ constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
+
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
+ this(context, attrs, defStyleAttr, R.style.MapboxStyleVoiceFeedbackButton)
+
+ constructor(
+ context: Context,
+ attrs: AttributeSet?,
+ defStyleAttr: Int,
+ defStyleRes: Int,
+ ) : super(context, attrs, defStyleAttr, defStyleRes) {
+ context.theme
+ .obtainStyledAttributes(
+ attrs,
+ R.styleable.MapboxVoiceFeedbackButton,
+ defStyleAttr,
+ defStyleRes,
+ ).apply {
+ try {
+ applyAttributes(this)
+ } finally {
+ recycle()
+ }
+ }
+ }
+
+ fun updateStyle(
+ @StyleRes style: Int,
+ ) {
+ context.obtainStyledAttributes(style, R.styleable.MapboxVoiceFeedbackButton).apply {
+ try {
+ applyAttributes(this)
+ } finally {
+ recycle()
+ }
+ }
+ }
+
+ private fun applyAttributes(typedArray: TypedArray) {
+ typedArray
+ .getResourceId(
+ R.styleable.MapboxVoiceFeedbackButton_voiceFeedbackButtonIcon,
+ R.drawable.mapbox_ic_voice_feedback,
+ ).also {
+ iconImage.setImageResource(it)
+ }
+ typedArray
+ .getColorStateList(
+ R.styleable.MapboxVoiceFeedbackButton_voiceFeedbackButtonIconTint,
+ )?.also {
+ iconImage.imageTintList = it
+ }
+ typedArray
+ .getResourceId(
+ R.styleable.MapboxVoiceFeedbackButton_voiceFeedbackButtonBackground,
+ R.drawable.mapbox_bg_button,
+ ).also {
+ background = ContextCompat.getDrawable(context, it)
+ }
+ }
+}
diff --git a/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackDialog.kt b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackDialog.kt
new file mode 100644
index 00000000000..18ff4947ebf
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/java/com/mapbox/navigation/ui/voicefeedback/view/MapboxVoiceFeedbackDialog.kt
@@ -0,0 +1,157 @@
+package com.mapbox.navigation.ui.voicefeedback.view
+
+import android.app.Dialog
+import android.content.DialogInterface
+import android.graphics.Color
+import android.graphics.drawable.AnimatedVectorDrawable
+import android.os.Bundle
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND
+import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+import androidx.core.view.isVisible
+import androidx.fragment.app.DialogFragment
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.mapbox.navigation.base.ExperimentalPreviewMapboxNavigationAPI
+import com.mapbox.navigation.ui.voicefeedback.R
+import com.mapbox.navigation.ui.voicefeedback.databinding.MapboxVoiceFeedbackDialogLayoutBinding
+import com.mapbox.navigation.voicefeedback.ASRState
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.filterNotNull
+import kotlinx.coroutines.launch
+import androidx.core.graphics.drawable.toDrawable
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.flow.collectLatest
+
+@ExperimentalPreviewMapboxNavigationAPI
+class MapboxVoiceFeedbackDialog : DialogFragment() {
+
+ internal var asrState: StateFlow? = null
+ internal var onCancel: (() -> Unit)? = null
+ internal var onDismiss: (() -> Unit)? = null
+
+ private lateinit var binding: MapboxVoiceFeedbackDialogLayoutBinding
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ return Dialog(requireContext(), theme).apply {
+ window?.apply {
+ setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
+ setGravity(Gravity.BOTTOM)
+ setFlags(FLAG_NOT_TOUCH_MODAL, FLAG_NOT_TOUCH_MODAL)
+ clearFlags(FLAG_DIM_BEHIND)
+ }
+ }
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View {
+ return MapboxVoiceFeedbackDialogLayoutBinding.inflate(inflater, container, false)
+ .also { binding = it }
+ .root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.closeButton.setOnClickListener {
+ onCancel?.invoke()
+ dismissAllowingStateLoss()
+ }
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
+ asrState?.filterNotNull()?.collectLatest { state -> renderState(state) }
+ }
+ }
+ }
+
+ override fun onDismiss(dialog: DialogInterface) {
+ super.onDismiss(dialog)
+ onDismiss?.invoke()
+ }
+
+ private suspend fun renderState(state: ASRState) {
+ val showContentBlock = state is ASRState.Listening || state is ASRState.SpeechFinishedWaitingForResult
+ binding.contentBlock.isVisible = showContentBlock
+ binding.infoBlock.isVisible = !showContentBlock
+
+ when (state) {
+ is ASRState.Listening -> showContentBlock(
+ icon = R.drawable.mapbox_ic_mic_pulsing,
+ header = R.string.mapbox_voice_feedback__share_your_feedback,
+ description = R.string.mapbox_voice_feedback__listening,
+ )
+ is ASRState.SpeechFinishedWaitingForResult -> showContentBlock(
+ icon = R.drawable.mapbox_ic_spinner_anim,
+ header = R.string.mapbox_voice_feedback__share_your_feedback,
+ description = R.string.mapbox_voice_feedback__processing,
+ )
+
+ is ASRState.Idle,
+ is ASRState.Error,
+ is ASRState.Interrupted,
+ is ASRState.InterruptedByTimeout -> {
+ showInfoBlock(
+ icon = R.drawable.mapbox_ic_error,
+ header = R.string.mapbox_voice_feedback__error_title,
+ description = R.string.mapbox_voice_feedback__error_description,
+ )
+ dismissWithDelay()
+ }
+ is ASRState.NoResult -> {
+ showInfoBlock(
+ icon = R.drawable.mapbox_ic_error,
+ header = R.string.mapbox_voice_feedback__speech_not_recognized_title,
+ description = R.string.mapbox_voice_feedback__error_description,
+ )
+ dismissWithDelay()
+ }
+ is ASRState.Result -> {
+ showInfoBlock(
+ icon = R.drawable.mapbox_ic_ok_sign,
+ header = R.string.mapbox_voice_feedback__success_title,
+ description = R.string.mapbox_voice_feedback__success_description,
+ )
+ dismissWithDelay()
+ }
+ }
+ }
+
+ private fun showContentBlock(
+ icon: Int,
+ header: Int,
+ description: Int,
+ ) = with(binding) {
+ contentIconImage.setImageResource(icon)
+ (contentIconImage.drawable as? AnimatedVectorDrawable)?.start()
+ contentHeader.setText(header)
+ contentDescription.setText(description)
+ }
+
+ private fun showInfoBlock(
+ icon: Int,
+ header: Int,
+ description: Int,
+ ) = with(binding) {
+ infoIcon.setImageResource(icon)
+ infoHeader.setText(header)
+ infoDescription.setText(description)
+ }
+
+ private suspend fun dismissWithDelay(delay: Long = AUTO_DISMISS_DELAY_MS) = coroutineScope {
+ delay(delay)
+ dismissAllowingStateLoss()
+ }
+
+ companion object Companion {
+ internal const val TAG = "VoiceFeedbackDialog"
+ private const val AUTO_DISMISS_DELAY_MS = 3_000L
+ }
+}
diff --git a/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_path.xml b/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_path.xml
new file mode 100644
index 00000000000..46793bc8295
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_path.xml
@@ -0,0 +1,9 @@
+
diff --git a/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_rotation.xml b/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_rotation.xml
new file mode 100644
index 00000000000..5e5fcf25b5f
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/animator/mapbox_spinner_rotation.xml
@@ -0,0 +1,8 @@
+
diff --git a/libnavui-voicefeedback/src/main/res/animator/pulse_circle_animation.xml b/libnavui-voicefeedback/src/main/res/animator/pulse_circle_animation.xml
new file mode 100644
index 00000000000..17153abe45b
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/animator/pulse_circle_animation.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_close_button_circle.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_close_button_circle.xml
new file mode 100644
index 00000000000..61b0a2825ef
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_close_button_circle.xml
@@ -0,0 +1,5 @@
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_voice_feedback_dialog.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_voice_feedback_dialog.xml
new file mode 100644
index 00000000000..26bf65b0d03
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_bg_voice_feedback_dialog.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_cancel.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_cancel.xml
new file mode 100644
index 00000000000..3f36f554a84
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_cancel.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_error.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_error.xml
new file mode 100644
index 00000000000..bbfd8e53f26
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_error.xml
@@ -0,0 +1,34 @@
+
+
+
+
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic.xml
new file mode 100644
index 00000000000..556bd80737c
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic_pulsing.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic_pulsing.xml
new file mode 100644
index 00000000000..0f0d9339995
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_mic_pulsing.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_ok_sign.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_ok_sign.xml
new file mode 100644
index 00000000000..3a4cdd837fd
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_ok_sign.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_anim.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_anim.xml
new file mode 100644
index 00000000000..e0f25668516
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_anim.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_icon.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_icon.xml
new file mode 100644
index 00000000000..1fceb1ebeee
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_spinner_icon.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_voice_feedback.xml b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_voice_feedback.xml
new file mode 100644
index 00000000000..41c518b9e62
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/drawable/mapbox_ic_voice_feedback.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_button_layout.xml b/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_button_layout.xml
new file mode 100644
index 00000000000..3e4553a99b5
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_button_layout.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_dialog_layout.xml b/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_dialog_layout.xml
new file mode 100644
index 00000000000..2c0e7cb4896
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/layout/mapbox_voice_feedback_dialog_layout.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ar/strings.xml b/libnavui-voicefeedback/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000000..3e8aaf5a296
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ar/strings.xml
@@ -0,0 +1,11 @@
+
+
+ شاركنا ملاحظاتك
+ جارٍ الاستماع...
+ جارٍ المعالجة…
+ شكرًا لمشاركتك
+ ملاحظاتك تساعدنا على التحسن
+ عذرًا! حدث خطأ ما
+ يرجى المحاولة مرة أخرى
+ عذرًا! لم أسمع ذلك جيدًا
+
diff --git a/libnavui-voicefeedback/src/main/res/values-bg/strings.xml b/libnavui-voicefeedback/src/main/res/values-bg/strings.xml
new file mode 100644
index 00000000000..0369ef926c0
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-bg/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Споделете вашето мнение
+ Слушане...
+ Обработва се…
+ Благодаря, че сподели
+ Вашата обратна връзка ни помага да се подобряваме
+ Опа! Нещо се обърка
+ Моля, опитайте отново
+ Опа! Не разбрах това
+
diff --git a/libnavui-voicefeedback/src/main/res/values-bs-rBA/strings.xml b/libnavui-voicefeedback/src/main/res/values-bs-rBA/strings.xml
new file mode 100644
index 00000000000..851dd14ad28
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-bs-rBA/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Podijelite svoje mišljenje
+ Slušanje…
+ Obrada…
+ Hvala što ste podijelili
+ Vaše povratne informacije nam pomažu da se poboljšamo
+ Ups! Nešto je pošlo po zlu
+ Pokušajte ponovo
+ Ups! Nisam to uhvatio/uhvatila
+
diff --git a/libnavui-voicefeedback/src/main/res/values-cs/strings.xml b/libnavui-voicefeedback/src/main/res/values-cs/strings.xml
new file mode 100644
index 00000000000..029a40cd037
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-cs/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Sdílejte svou zpětnou vazbu
+ Naslouchám…
+ Zpracovává se…
+ Děkuji za sdílení
+ Vaše zpětná vazba nám pomáhá se zlepšovat
+ Jejda! Něco se pokazilo
+ Zkuste to prosím znovu
+ Jejda! To jsem nezachytil.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-da/strings.xml b/libnavui-voicefeedback/src/main/res/values-da/strings.xml
new file mode 100644
index 00000000000..9f6c10f0499
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-da/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Del din feedback
+ Lytter…
+ Behandler…
+ Tak fordi du delte
+ Din feedback hjælper os med at blive bedre
+ Ups! Noget gik galt
+ Prøv venligst igen
+ Ups! Det fangede jeg ikke
+
diff --git a/libnavui-voicefeedback/src/main/res/values-de/strings.xml b/libnavui-voicefeedback/src/main/res/values-de/strings.xml
new file mode 100644
index 00000000000..f0c2e41c1d2
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-de/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Teilen Sie Ihr Feedback
+ Zuhören…
+ Verarbeitung…
+ Danke fürs Teilen
+ Ihr Feedback hilft uns, uns zu verbessern
+ Hoppla! Etwas ist schiefgelaufen
+ Bitte versuchen Sie es erneut
+ Hoppla! Das habe ich nicht verstanden
+
diff --git a/libnavui-voicefeedback/src/main/res/values-el/strings.xml b/libnavui-voicefeedback/src/main/res/values-el/strings.xml
new file mode 100644
index 00000000000..c4c3d6b78b4
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-el/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Μοιραστείτε τα σχόλιά σας
+ Ακρόαση…
+ Γίνεται επεξεργασία…
+ Ευχαριστώ που το μοιράστηκες
+ Τα σχόλιά σας μας βοηθούν να βελτιωνόμαστε
+ Ουπς! Κάτι πήγε στραβά
+ Παρακαλώ δοκιμάστε ξανά
+ Ουπς! Δεν το κατάλαβα αυτό
+
diff --git a/libnavui-voicefeedback/src/main/res/values-en-rAU/strings.xml b/libnavui-voicefeedback/src/main/res/values-en-rAU/strings.xml
new file mode 100644
index 00000000000..e24dbc9c81e
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-en-rAU/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Share your feedback
+ Listening…
+ Processing…
+ Thanks for sharing
+ Your feedback helps us improve
+ Whoops! Something went wrong
+ Please try again
+ Whoops! Didn’t quite catch that
+
diff --git a/libnavui-voicefeedback/src/main/res/values-en-rGB/strings.xml b/libnavui-voicefeedback/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000000..5123bd1a87e
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Share your feedback
+ Listening…
+ Processing…
+ Thanks for sharing
+ Your feedback helps us to improve
+ Oops! Something went wrong
+ Please try again
+ Oops! Didn’t catch that
+
diff --git a/libnavui-voicefeedback/src/main/res/values-en-rIN/strings.xml b/libnavui-voicefeedback/src/main/res/values-en-rIN/strings.xml
new file mode 100644
index 00000000000..477cfad3226
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-en-rIN/strings.xml
@@ -0,0 +1,11 @@
+
+
+ अपना फीडबैक साझा करें
+ सुन रहे हैं…
+ प्रोसेसिंग…
+ Thank you for sharing.
+ Your feedback helps us improve
+ अरे! कुछ गड़बड़ हो गई है
+ कृपया फिर से प्रयास करें
+ अरे! वह समझ में नहीं आया
+
diff --git a/libnavui-voicefeedback/src/main/res/values-en-rSG/strings.xml b/libnavui-voicefeedback/src/main/res/values-en-rSG/strings.xml
new file mode 100644
index 00000000000..335294f0e13
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-en-rSG/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Kongsi maklum balas anda
+ Sedang mendengar…
+ Sedang diproses…
+ Thanks for sharing
+ Your feedback helps us improve
+ Aiyo! Something went wrong lah
+ Please try again
+ Aiyo! Didn’t catch that leh
+
diff --git a/libnavui-voicefeedback/src/main/res/values-en-rUS/strings.xml b/libnavui-voicefeedback/src/main/res/values-en-rUS/strings.xml
new file mode 100644
index 00000000000..ad115c58ce8
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-en-rUS/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Share your feedback
+ Listening…
+ Processing…
+ Thanks for sharing
+ Your feedback helps us improve
+ Oops! Something went wrong
+ Please try again
+ Oops! Didn’t catch that
+
diff --git a/libnavui-voicefeedback/src/main/res/values-es-rES/strings.xml b/libnavui-voicefeedback/src/main/res/values-es-rES/strings.xml
new file mode 100644
index 00000000000..c9f698efa9e
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-es-rES/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Comparte tus comentarios
+ Escuchando…
+ Procesando…
+ Gracias por compartir
+ Tus comentarios nos ayudan a mejorar
+ ¡Vaya! Algo salió mal
+ Por favor, inténtalo de nuevo
+ ¡Ups! No entendí eso
+
diff --git a/libnavui-voicefeedback/src/main/res/values-es-rMX/strings.xml b/libnavui-voicefeedback/src/main/res/values-es-rMX/strings.xml
new file mode 100644
index 00000000000..67b68c8c814
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-es-rMX/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Comparte tus comentarios
+ Escuchando…
+ Procesando…
+ Gracias por compartir
+ Tus comentarios nos ayudan a mejorar
+ ¡Ups! Algo salió mal
+ Por favor, inténtalo de nuevo
+ ¡Ups! No entendí eso
+
diff --git a/libnavui-voicefeedback/src/main/res/values-es/strings.xml b/libnavui-voicefeedback/src/main/res/values-es/strings.xml
new file mode 100644
index 00000000000..f4015bb2ab6
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-es/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Comparte tus comentarios
+ Escuchando…
+ Procesando…
+ Gracias por compartir
+ Tus comentarios nos ayudan a mejorar
+ ¡Ups! Algo salió mal
+ Por favor intenta de nuevo
+ ¡Ups! No entendí eso
+
diff --git a/libnavui-voicefeedback/src/main/res/values-et/strings.xml b/libnavui-voicefeedback/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000000..d8ca69c388f
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-et/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Jaga oma tagasisidet
+ Kuulan…
+ Töötlemine…
+ Aitäh jagamast
+ Teie tagasiside aitab meil paremaks saada
+ Oih! Midagi läks valesti
+ Palun proovige uuesti
+ Oih! Ei saanud sellest aru
+
diff --git a/libnavui-voicefeedback/src/main/res/values-fi/strings.xml b/libnavui-voicefeedback/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000000..f4855c50310
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-fi/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Jaa palautteesi
+ Kuunnellaan…
+ Käsitellään…
+ Kiitos jakamisesta
+ Palautteesi auttaa meitä parantamaan toimintaamme
+ Hups! Jotain meni pieleen
+ Yritä uudelleen
+ Hups! En saanut siitä selvää
+
diff --git a/libnavui-voicefeedback/src/main/res/values-fr-rCA/strings.xml b/libnavui-voicefeedback/src/main/res/values-fr-rCA/strings.xml
new file mode 100644
index 00000000000..d39b59f1ac9
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-fr-rCA/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Partagez vos commentaires
+ Écoute en cours…
+ Traitement en cours…
+ Merci pour le partage
+ Vos commentaires nous aident à nous améliorer
+ Oups ! Quelque chose s\'est mal passé
+ Veuillez réessayer
+ Oups ! Je n’ai pas compris.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-fr/strings.xml b/libnavui-voicefeedback/src/main/res/values-fr/strings.xml
new file mode 100644
index 00000000000..9f4687324a6
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-fr/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Partagez vos commentaires
+ Écoute en cours…
+ Traitement en cours…
+ Merci pour le partage
+ Vos commentaires nous aident à nous améliorer
+ Oups ! Quelque chose s\'est mal passé
+ Veuillez réessayer
+ Oups ! Je n\'ai pas compris.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-hr/strings.xml b/libnavui-voicefeedback/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000000..dde2fa714d3
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-hr/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Podijelite svoje povratne informacije
+ Slušanje…
+ Obrada…
+ Hvala što ste podijelili
+ Vaše povratne informacije pomažu nam da se poboljšamo
+ Ups! Nešto je pošlo po zlu
+ Pokušajte ponovno
+ Ups! Nisam to uhvatio/la
+
diff --git a/libnavui-voicefeedback/src/main/res/values-hu/strings.xml b/libnavui-voicefeedback/src/main/res/values-hu/strings.xml
new file mode 100644
index 00000000000..a54153ac291
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-hu/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Ossza meg visszajelzését
+ Hallgatás…
+ Feldolgozás…
+ Köszönöm, hogy megosztottad
+ Az Ön visszajelzése segít nekünk a fejlődésben
+ Hoppá! Valami hiba történt
+ Kérjük, próbálja meg újra
+ Hoppá! Ezt nem értettem.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-in/strings.xml b/libnavui-voicefeedback/src/main/res/values-in/strings.xml
new file mode 100644
index 00000000000..4c92c6e91f8
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-in/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Bagikan masukan Anda
+ Mendengarkan…
+ Memproses…
+ Terima kasih sudah berbagi
+ Masukan Anda membantu kami untuk menjadi lebih baik
+ Ups! Terjadi kesalahan
+ Silakan coba lagi
+ Ups! Saya tidak menangkap itu
+
diff --git a/libnavui-voicefeedback/src/main/res/values-is/strings.xml b/libnavui-voicefeedback/src/main/res/values-is/strings.xml
new file mode 100644
index 00000000000..ef8c0d4a0ff
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-is/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Deildu ábendingum þínum
+ Hlusta…
+ Í vinnslu…
+ Takk fyrir að deila þessu
+ Endurgjöf þín hjálpar okkur að bæta þjónustuna.
+ Úbbs! Eitthvað fór úrskeiðis
+ Vinsamlegast reyndu aftur
+ Úbbs! Ég náði því ekki
+
diff --git a/libnavui-voicefeedback/src/main/res/values-it/strings.xml b/libnavui-voicefeedback/src/main/res/values-it/strings.xml
new file mode 100644
index 00000000000..233c403ef66
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-it/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Condividi il tuo feedback
+ In ascolto…
+ Elaborazione in corso…
+ Grazie per aver condiviso
+ Il tuo feedback ci aiuta a migliorare
+ Ops! Qualcosa è andato storto
+ Per favore riprova
+ Ops! Non ho capito
+
diff --git a/libnavui-voicefeedback/src/main/res/values-iw/strings.xml b/libnavui-voicefeedback/src/main/res/values-iw/strings.xml
new file mode 100644
index 00000000000..49a8d786878
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-iw/strings.xml
@@ -0,0 +1,11 @@
+
+
+ שתפו את המשוב שלכם
+ מקשיב…
+ מעבד…
+ תודה ששיתפת
+ המשוב שלך עוזר לנו להשתפר
+ אופס! משהו השתבש
+ אנא נסה שוב
+ אופס! לא קלטתי את זה
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ja-rJP/strings.xml b/libnavui-voicefeedback/src/main/res/values-ja-rJP/strings.xml
new file mode 100644
index 00000000000..1fbfec9f802
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ja-rJP/strings.xml
@@ -0,0 +1,11 @@
+
+
+ ご意見をお聞かせください
+ 聞き取り中…
+ 処理中…
+ 共有してくれてありがとうございます
+ ご意見は、私たちの改善に役立ちます。
+ おっと!何か問題が発生しました
+ もう一度お試しください
+ おっと!聞き取れませんでした
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ja/strings.xml b/libnavui-voicefeedback/src/main/res/values-ja/strings.xml
new file mode 100644
index 00000000000..647dfa9f377
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ja/strings.xml
@@ -0,0 +1,11 @@
+
+
+ ご意見をお聞かせください
+ 聞き取り中…
+ 処理中…
+ 共有してくれてありがとうございます
+ あなたのフィードバックは、私たちの改善に役立ちます。
+ おっと!何か問題が発生しました
+ もう一度お試しください
+ おっと!聞き取れませんでした
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ko/strings.xml b/libnavui-voicefeedback/src/main/res/values-ko/strings.xml
new file mode 100644
index 00000000000..ae7e5218279
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ko/strings.xml
@@ -0,0 +1,11 @@
+
+
+ 의견을 공유해 주세요
+ 듣는 중…
+ 처리 중…
+ 공유해 주셔서 감사합니다
+ 귀하의 피드백은 저희가 개선하는 데 도움이 됩니다
+ 이런! 문제가 발생했습니다
+ 다시 시도해 주세요
+ 이런! 잘 못 들었어요
+
diff --git a/libnavui-voicefeedback/src/main/res/values-lt/strings.xml b/libnavui-voicefeedback/src/main/res/values-lt/strings.xml
new file mode 100644
index 00000000000..d13a2ca2e2b
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-lt/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Pasidalinkite savo atsiliepimais
+ Klausoma…
+ Apdorojama…
+ Ačiū, kad pasidalinote
+ Jūsų atsiliepimai padeda mums tobulėti
+ Oi! Kažkas nepavyko
+ Pabandykite dar kartą
+ Oi! Nepagavau to
+
diff --git a/libnavui-voicefeedback/src/main/res/values-lv/strings.xml b/libnavui-voicefeedback/src/main/res/values-lv/strings.xml
new file mode 100644
index 00000000000..f5d8db6afaa
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-lv/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Dalieties ar savu atsauksmi
+ Klausās…
+ Notiek apstrāde…
+ Paldies, ka dalījāties
+ Jūsu atsauksmes palīdz mums uzlaboties
+ Ak! Kaut kas nogāja greizi
+ Lūdzu, mēģiniet vēlreiz
+ Ups! Nesapratu to
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ms/strings.xml b/libnavui-voicefeedback/src/main/res/values-ms/strings.xml
new file mode 100644
index 00000000000..79bde8ad07c
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ms/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Kongsi maklum balas anda
+ Sedang mendengar…
+ Memproses…
+ Terima kasih kerana berkongsi
+ Maklum balas anda membantu kami untuk menambah baik
+ Oops! Sesuatu telah berlaku kesilapan
+ Sila cuba lagi
+ Oops! Tidak dapat menangkap itu
+
diff --git a/libnavui-voicefeedback/src/main/res/values-nb/strings.xml b/libnavui-voicefeedback/src/main/res/values-nb/strings.xml
new file mode 100644
index 00000000000..587ef6866ff
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-nb/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Del dine tilbakemeldinger
+ Lytter…
+ Behandler …
+ Takk for at du delte
+ Din tilbakemelding hjelper oss å bli bedre
+ Oops! Noe gikk galt
+ Vennligst prøv igjen
+ Oi! Fikk ikke med meg det
+
diff --git a/libnavui-voicefeedback/src/main/res/values-nl-rBE/strings.xml b/libnavui-voicefeedback/src/main/res/values-nl-rBE/strings.xml
new file mode 100644
index 00000000000..f83a7104e2e
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-nl-rBE/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Deel je feedback
+ Luisteren...
+ Bezig met verwerken…
+ Bedankt om dit te delen
+ Uw feedback helpt ons om te verbeteren
+ Oeps! Er is iets misgegaan
+ Probeer het opnieuw
+ Oeps! Dat heb ik niet begrepen
+
diff --git a/libnavui-voicefeedback/src/main/res/values-nl-rNL/strings.xml b/libnavui-voicefeedback/src/main/res/values-nl-rNL/strings.xml
new file mode 100644
index 00000000000..e5186ab8c42
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-nl-rNL/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Deel je feedback
+ Luisteren...
+ Bezig met verwerken…
+ Bedankt voor het delen
+ Uw feedback helpt ons te verbeteren
+ Oeps! Er is iets misgegaan
+ Probeer het opnieuw
+ Oeps! Dat heb ik niet begrepen
+
diff --git a/libnavui-voicefeedback/src/main/res/values-nl/strings.xml b/libnavui-voicefeedback/src/main/res/values-nl/strings.xml
new file mode 100644
index 00000000000..5d0b04a12ac
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-nl/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Deel uw feedback
+ Luisteren...
+ Bezig met verwerken…
+ Bedankt voor het delen
+ Uw feedback helpt ons te verbeteren
+ Oeps! Er is iets misgegaan
+ Probeer het opnieuw
+ Oeps! Dat heb ik niet begrepen
+
diff --git a/libnavui-voicefeedback/src/main/res/values-no-rNO/strings.xml b/libnavui-voicefeedback/src/main/res/values-no-rNO/strings.xml
new file mode 100644
index 00000000000..8c00fdd5eab
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-no-rNO/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Del tilbakemeldingen din
+ Lytter…
+ Behandler …
+ Takk for at du delte
+ Din tilbakemelding hjelper oss å bli bedre
+ Oi! Noe gikk galt
+ Prøv igjen
+ Uff da! Fikk ikke med meg det
+
diff --git a/libnavui-voicefeedback/src/main/res/values-pl/strings.xml b/libnavui-voicefeedback/src/main/res/values-pl/strings.xml
new file mode 100644
index 00000000000..461efaf0457
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-pl/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Podziel się swoją opinią
+ Słucham…
+ Przetwarzanie…
+ Dziękuję za udostępnienie
+ Twoja opinia pomaga nam się rozwijać
+ Ups! Coś poszło nie tak
+ Proszę spróbować ponownie
+ Ups! Nie zrozumiałem tego.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-pt-rBR/strings.xml b/libnavui-voicefeedback/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000000..8708576f891
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Compartilhe seu feedback
+ Ouvindo...
+ Processando…
+ Obrigado por compartilhar
+ Seu feedback nos ajuda a melhorar
+ Ops! Algo deu errado
+ Por favor, tente novamente
+ Ops! Não entendi isso
+
diff --git a/libnavui-voicefeedback/src/main/res/values-pt/strings.xml b/libnavui-voicefeedback/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..8708576f891
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-pt/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Compartilhe seu feedback
+ Ouvindo...
+ Processando…
+ Obrigado por compartilhar
+ Seu feedback nos ajuda a melhorar
+ Ops! Algo deu errado
+ Por favor, tente novamente
+ Ops! Não entendi isso
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ro/strings.xml b/libnavui-voicefeedback/src/main/res/values-ro/strings.xml
new file mode 100644
index 00000000000..47a0b9c7bca
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ro/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Trimiteți feedback-ul dvs.
+ Ascultare…
+ Se procesează…
+ Mulțumesc că ai împărtășit
+ Feedback-ul dumneavoastră ne ajută să ne îmbunătățim
+ Ups! Ceva nu a mers bine
+ Vă rugăm să încercați din nou
+ Ups! Nu am prins asta
+
diff --git a/libnavui-voicefeedback/src/main/res/values-ru/strings.xml b/libnavui-voicefeedback/src/main/res/values-ru/strings.xml
new file mode 100644
index 00000000000..de75cf969a5
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-ru/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Поделитесь своим мнением
+ Прослушивание…
+ Обработка…
+ Спасибо за то, что поделились
+ Ваш отзыв помогает нам совершенствоваться
+ Ой! Что-то пошло не так
+ Пожалуйста, попробуйте еще раз
+ Ой! Не расслышал
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sk/strings.xml b/libnavui-voicefeedback/src/main/res/values-sk/strings.xml
new file mode 100644
index 00000000000..dca139638f1
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sk/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Podeľte sa o svoju spätnú väzbu
+ Počúvam…
+ Spracováva sa…
+ Ďakujeme za zdieľanie
+ Vaša spätná väzba nám pomáha zlepšovať sa
+ Ups! Niečo sa pokazilo
+ Skúste to prosím znova
+ Ups! Nezachytil som to
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sl/strings.xml b/libnavui-voicefeedback/src/main/res/values-sl/strings.xml
new file mode 100644
index 00000000000..731e2cea5c1
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sl/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Delite svoje mnenje
+ Poslušanje…
+ Obdelava …
+ Hvala, da ste delili
+ Vaše povratne informacije nam pomagajo izboljšati naše storitve
+ Ups! Nekaj je šlo narobe
+ Poskusite znova
+ Ups! Tega nisem razumel
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sq/strings.xml b/libnavui-voicefeedback/src/main/res/values-sq/strings.xml
new file mode 100644
index 00000000000..b48cb7cce71
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sq/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Ndani mendimet tuaja
+ Duke dëgjuar…
+ Duke përpunuar…
+ Faleminderit që e ndave
+ Mendimet tuaja na ndihmojnë të përmirësohemi
+ Ups! Diçka shkoi keq
+ Ju lutemi provoni përsëri
+ Ups! Nuk e kapa atë
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sr/strings.xml b/libnavui-voicefeedback/src/main/res/values-sr/strings.xml
new file mode 100644
index 00000000000..4c847e360ce
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sr/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Podelite svoje mišljenje
+ Слушање…
+ Обрада…
+ Hvala što ste podelili
+ Vaše povratne informacije nam pomažu da se poboljšamo
+ Упс! Нешто је пошло наопако
+ Pokušajte ponovo
+ Ups! Nisam to uhvatio.
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sv/strings.xml b/libnavui-voicefeedback/src/main/res/values-sv/strings.xml
new file mode 100644
index 00000000000..16f1d39e7e2
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sv/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Dela din feedback
+ Lyssnar…
+ Bearbetar…
+ Tack för att du delade med dig
+ Din feedback hjälper oss att bli bättre
+ Hoppsan! Något gick fel
+ Var god försök igen
+ Hoppsan! Det uppfattade jag inte
+
diff --git a/libnavui-voicefeedback/src/main/res/values-sw600dp-land/dimens.xml b/libnavui-voicefeedback/src/main/res/values-sw600dp-land/dimens.xml
new file mode 100644
index 00000000000..2b38134013a
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-sw600dp-land/dimens.xml
@@ -0,0 +1,30 @@
+
+
+
+ 72dp
+ 20dp
+
+
+ 540dp
+ 24dp
+ 12dp
+
+
+ 24dp
+
+
+ 60dp
+ 48dp
+
+
+ 32sp
+ 160dp
+ 28sp
+ 12dp
+
+
+ 80dp
+ 20dp
+ 8dp
+ 14dp
+
diff --git a/libnavui-voicefeedback/src/main/res/values-th/strings.xml b/libnavui-voicefeedback/src/main/res/values-th/strings.xml
new file mode 100644
index 00000000000..e40991bae3f
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-th/strings.xml
@@ -0,0 +1,11 @@
+
+
+ แบ่งปันความคิดเห็นของคุณ
+ กำลังฟัง...
+ กำลังประมวลผล…
+ ขอบคุณที่แบ่งปัน
+ ความคิดเห็นของคุณช่วยให้เราพัฒนาขึ้น
+ ขออภัย! เกิดข้อผิดพลาดบางอย่าง
+ กรุณาลองใหม่อีกครั้ง
+ อุ๊ย! ฟังไม่ทันค่ะ
+
diff --git a/libnavui-voicefeedback/src/main/res/values-tr/strings.xml b/libnavui-voicefeedback/src/main/res/values-tr/strings.xml
new file mode 100644
index 00000000000..931eebaf44a
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-tr/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Görüşlerinizi paylaşın
+ Dinleniyor…
+ İşleniyor…
+ Paylaştığınız için teşekkürler
+ Geri bildiriminiz bize gelişmemizde yardımcı oluyor
+ Hata! Bir şeyler ters gitti
+ Lütfen tekrar deneyin
+ Hata! Bunu anlayamadım
+
diff --git a/libnavui-voicefeedback/src/main/res/values-uk/strings.xml b/libnavui-voicefeedback/src/main/res/values-uk/strings.xml
new file mode 100644
index 00000000000..8707d83a034
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-uk/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Поділіться своїми відгуками
+ Слухаю…
+ Обробка…
+ Дякую, що поділилися
+ Ваш відгук допомагає нам ставати кращими
+ Ой! Щось пішло не так
+ Будь ласка, спробуйте ще раз
+ Ой! Не зрозумів(ла) цього
+
diff --git a/libnavui-voicefeedback/src/main/res/values-vi/strings.xml b/libnavui-voicefeedback/src/main/res/values-vi/strings.xml
new file mode 100644
index 00000000000..fee5f44860a
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-vi/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Chia sẻ phản hồi của bạn
+ Đang lắng nghe…
+ Đang xử lý…
+ Cảm ơn bạn đã chia sẻ
+ Phản hồi của bạn giúp chúng tôi cải thiện
+ Ôi! Đã xảy ra sự cố
+ Vui lòng thử lại
+ Ôi! Tôi không nghe rõ điều đó
+
diff --git a/libnavui-voicefeedback/src/main/res/values-zh-rCN/strings.xml b/libnavui-voicefeedback/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000000..7f3049b1b6f
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,11 @@
+
+
+ 分享您的反馈
+ 正在聆听…
+ 处理中…
+ 感谢分享
+ 您的反馈有助于我们改进
+ 哎呀!出了点问题
+ 请再试一次
+ 哎呀!没听清楚
+
diff --git a/libnavui-voicefeedback/src/main/res/values-zh-rHK/strings.xml b/libnavui-voicefeedback/src/main/res/values-zh-rHK/strings.xml
new file mode 100644
index 00000000000..bd79a429b8d
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-zh-rHK/strings.xml
@@ -0,0 +1,11 @@
+
+
+ 分享你的意見
+ 正在聆聽…
+ 處理中…
+ 多謝分享
+ 您的意見有助我們改進
+ 哎呀!出現了一些問題
+ 請再試一次
+ 哎呀!我聽唔清楚你講咩
+
diff --git a/libnavui-voicefeedback/src/main/res/values-zh-rTW/strings.xml b/libnavui-voicefeedback/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000000..db7953cc7ea
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,11 @@
+
+
+ 分享您的意見
+ 聆聽中…
+ 處理中…
+ 感謝分享
+ 您的回饋幫助我們改進
+ 哎呀!出了點問題
+ 請再試一次
+ 哎呀!沒聽清楚
+
diff --git a/libnavui-voicefeedback/src/main/res/values/attrs.xml b/libnavui-voicefeedback/src/main/res/values/attrs.xml
new file mode 100644
index 00000000000..6c99fc09670
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values/attrs.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/res/values/colors.xml b/libnavui-voicefeedback/src/main/res/values/colors.xml
new file mode 100644
index 00000000000..310b6a263fa
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ @color/colorSurface
+ @color/colorSecondaryVariant
+ @color/colorOnSurface
+ @color/colorSecondary
+ @color/colorPrimary
+ #4CAF50
+ @color/colorError
+
diff --git a/libnavui-voicefeedback/src/main/res/values/dimens.xml b/libnavui-voicefeedback/src/main/res/values/dimens.xml
new file mode 100644
index 00000000000..3d8b784b01a
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values/dimens.xml
@@ -0,0 +1,31 @@
+
+
+
+ 60dp
+ 16dp
+
+
+ 340dp
+ 16dp
+ 8dp
+
+
+ 16dp
+
+
+ 40dp
+ 32dp
+
+
+ 0dp
+ 20sp
+ 120dp
+ 18sp
+ 4dp
+
+
+ 48dp
+ 16dp
+ 4dp
+ 16dp
+
diff --git a/libnavui-voicefeedback/src/main/res/values/strings.xml b/libnavui-voicefeedback/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..0c1c255f5ae
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values/strings.xml
@@ -0,0 +1,11 @@
+
+
+ Share your feedback
+ Listening…
+ Processing…
+ Thanks for sharing
+ Your feedback helps us improve
+ Oops! Something went wrong
+ Please try again
+ Oops! Didn’t catch that
+
\ No newline at end of file
diff --git a/libnavui-voicefeedback/src/main/res/values/styles.xml b/libnavui-voicefeedback/src/main/res/values/styles.xml
new file mode 100644
index 00000000000..971ea9a8e35
--- /dev/null
+++ b/libnavui-voicefeedback/src/main/res/values/styles.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 64af2a73a9f..8d0544e0219 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -22,6 +22,7 @@ include ':examples',
':libnavui-maneuver',
':libnavui-resources',
':libnavui-voice',
+ ':libnavui-voicefeedback',
':libnavui-speedlimit',
':libnavui-shield',
':libnavui-status',