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',