From 8e3e5aea3bc79ff8ea2e95fbe85124201bd54574 Mon Sep 17 00:00:00 2001 From: shah Date: Fri, 8 Nov 2024 19:56:21 +0530 Subject: [PATCH] fix: App should work without no data inside custom.properties file ALS-1884 --- .../amazonlocation/ui/main/MainActivity.kt | 76 ++++++++++++++-- .../SimulationBottomSheetFragment.kt | 87 ++++++++++++------- .../ui/main/simulation/SimulationUtils.kt | 6 +- .../welcome/WelcomeBottomSheetFragment.kt | 2 +- .../com/aws/amazonlocation/utils/Constants.kt | 18 ++++ .../com/aws/amazonlocation/utils/MapHelper.kt | 1 + .../utils/analytics/AnalyticsUtils.kt | 6 +- .../utils/providers/LocationProvider.kt | 3 + app/src/main/res/values-ar/string.xml | 5 ++ app/src/main/res/values-de/string.xml | 5 ++ app/src/main/res/values-es/string.xml | 5 ++ app/src/main/res/values-fr/string.xml | 5 ++ app/src/main/res/values-hi/string.xml | 5 ++ app/src/main/res/values-it/string.xml | 5 ++ app/src/main/res/values-iw/string.xml | 5 ++ app/src/main/res/values-ja/string.xml | 5 ++ app/src/main/res/values-ko/string.xml | 5 ++ app/src/main/res/values-pt/string.xml | 5 ++ app/src/main/res/values-zh-rCN/string.xml | 5 ++ app/src/main/res/values-zh-rTW/string.xml | 5 ++ app/src/main/res/values/strings.xml | 6 ++ 21 files changed, 224 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/aws/amazonlocation/ui/main/MainActivity.kt b/app/src/main/java/com/aws/amazonlocation/ui/main/MainActivity.kt index 1e2fb1c3..16698f51 100644 --- a/app/src/main/java/com/aws/amazonlocation/ui/main/MainActivity.kt +++ b/app/src/main/java/com/aws/amazonlocation/ui/main/MainActivity.kt @@ -1,6 +1,7 @@ package com.aws.amazonlocation.ui.main import android.annotation.SuppressLint +import android.app.AlertDialog import android.app.Dialog import android.content.pm.ActivityInfo import android.content.res.Configuration @@ -14,7 +15,6 @@ import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.OnBackPressedCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment @@ -85,14 +85,17 @@ import com.aws.amazonlocation.utils.SIGN_OUT import com.aws.amazonlocation.utils.Units.checkInternetConnection import com.aws.amazonlocation.utils.VERSION_FRAGMENT import com.aws.amazonlocation.utils.analytics.AnalyticsUtils +import com.aws.amazonlocation.utils.analyticsFields import com.aws.amazonlocation.utils.getLanguageCode import com.aws.amazonlocation.utils.hide import com.aws.amazonlocation.utils.hideViews import com.aws.amazonlocation.utils.invisible import com.aws.amazonlocation.utils.makeTransparentStatusBar +import com.aws.amazonlocation.utils.requiredFields import com.aws.amazonlocation.utils.setLocale import com.aws.amazonlocation.utils.show import com.aws.amazonlocation.utils.showViews +import com.aws.amazonlocation.utils.simulationFields import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async @@ -642,6 +645,7 @@ class MainActivity : var mRegion = mPreferenceManager.getValue(KEY_USER_REGION, "") if (mRegion.isNullOrEmpty()) { + if (BuildConfig.DEFAULT_REGION == "null") return@launch mRegion = BuildConfig.DEFAULT_REGION } val iotClient = @@ -690,6 +694,7 @@ class MainActivity : private fun setSimulationIotPolicy() { val identityId = mLocationProvider.getIdentityId() + if (identityId.isNullOrEmpty()) return CoroutineScope(Dispatchers.IO).launch { val attachPolicyRequest = AttachPolicyRequest { @@ -699,7 +704,7 @@ class MainActivity : val iotClient = IotClient { - region = identityId?.split(":")?.get(0) + region = identityId.split(":")[0] credentialsProvider = createCredentialsProviderForPolicy( mLocationProvider.getCredentials(), @@ -934,7 +939,7 @@ class MainActivity : mBinding.imgAmazonLogo?.setImageResource(logoResId) } - fun setExplorer() { + private fun setExplorer() { val fragment = mNavHostFragment.childFragmentManager.fragments[0] if (fragment !is ExploreFragment) { mNavController.navigate(R.id.explore_fragment) @@ -998,7 +1003,6 @@ class MainActivity : mTrackingUtils?.hideTrackingBottomSheet() mSimulationUtils?.showSimulationBottomSheet() if (mNavHostFragment.childFragmentManager.fragments.isNotEmpty()) { - val fragment = mNavHostFragment.childFragmentManager.fragments[0] if (fragment is ExploreFragment) { if (isTablet) { fragment.hideDirectionAndCurrentLocationIcon() @@ -1200,7 +1204,64 @@ class MainActivity : } } - fun setWelcomeToExplorer() { + fun checkPropertiesData() { + val missingRequiredFields = requiredFields.filter { it.value == "null" }.keys + val simulationMissingFields = simulationFields.filter { it.value == "null" }.keys + val analyticsMissingFields = analyticsFields.filter { it.value == "null" }.keys + + if (missingRequiredFields.isNotEmpty() || simulationMissingFields.isNotEmpty() || analyticsMissingFields.isNotEmpty()) { + val dialogMessage = buildString { + when { + missingRequiredFields.isNotEmpty() -> { + append(getString(R.string.label_required_fields_missing)) + append("\n") + missingRequiredFields.forEach { append("• $it\n") } + simulationMissingFields.forEach { append("• $it\n") } + analyticsMissingFields.forEach { append("• $it\n") } + } + simulationMissingFields.isNotEmpty() && analyticsMissingFields.isNotEmpty() -> { + append(getString(R.string.label_some_fields_missing)) + append("\n") + simulationMissingFields.forEach { append("• $it\n") } + analyticsMissingFields.forEach { append("• $it\n") } + } + simulationMissingFields.isNotEmpty() -> { + append(getString(R.string.label_simulation_fields_missing)) + append("\n") + simulationMissingFields.forEach { append("• $it\n") } + } + analyticsMissingFields.isNotEmpty() -> { + append(getString(R.string.label_analytics_fields_missing)) + append("\n") + analyticsMissingFields.forEach { append("• $it\n") } + } + } + } + + val dialogTitle = getString(R.string.title_configuration_incomplete) + val positiveButtonText = if (missingRequiredFields.isNotEmpty()) { + getString(R.string.ok) + } else { + getString(R.string.label_continue) + } + + AlertDialog + .Builder(this) + .setTitle(dialogTitle) + .setMessage(dialogMessage) + .setPositiveButton(positiveButtonText) { _, _ -> + if (missingRequiredFields.isNotEmpty()) { + finish() + } else { + setWelcomeToExplorer() + } + }.setCancelable(false).show() + } else { + setWelcomeToExplorer() + } + } + + private fun setWelcomeToExplorer() { mPreferenceManager.setValue(IS_APP_FIRST_TIME_OPENED, true) isAppNotFirstOpened = true val fragment = @@ -1232,11 +1293,12 @@ class MainActivity : } } - fun initClient(isAfterSignOut:Boolean = false){ + fun initClient(isAfterSignOut: Boolean = false) { if (!isAfterSignOut) { try { mLocationProvider.clearCredentials() - } catch (_: Exception) { } + } catch (_: Exception) { + } } CoroutineScope(Dispatchers.IO).launch { async { initMobileClient() }.await() diff --git a/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationBottomSheetFragment.kt b/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationBottomSheetFragment.kt index 7e2644d8..9a65def9 100644 --- a/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationBottomSheetFragment.kt +++ b/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationBottomSheetFragment.kt @@ -2,6 +2,7 @@ package com.aws.amazonlocation.ui.main.simulation import android.Manifest.permission.POST_NOTIFICATIONS import android.annotation.SuppressLint +import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.content.DialogInterface @@ -27,6 +28,7 @@ import com.aws.amazonlocation.utils.AnalyticsAttributeValue import com.aws.amazonlocation.utils.EventType import com.aws.amazonlocation.utils.NotificationDialogInterface import com.aws.amazonlocation.utils.notificationPermission +import com.aws.amazonlocation.utils.simulationFields import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -99,36 +101,28 @@ class SimulationBottomSheetFragment : BottomSheetDialogFragment() { private fun clickListener() { mBinding.apply { btnStartSimulation.setOnClickListener { - when { - ContextCompat.checkSelfPermission( - requireContext(), - POST_NOTIFICATIONS - ) == PackageManager.PERMISSION_GRANTED -> { - openSimulation() - } - shouldShowRequestPermissionRationale(POST_NOTIFICATIONS) -> { - if (!NotificationManagerCompat.from(requireContext()).areNotificationsEnabled()) { - requireContext().notificationPermission(object : NotificationDialogInterface { - override fun onOkClick(dialog: DialogInterface) { - openAppNotificationSettings(requireContext()) - } - - override fun onCancelClick(dialog: DialogInterface) { - openSimulation() - } - }) - } - } - else -> { - // The registered ActivityResultCallback gets the result of this request - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - requestPermissionLauncher.launch( - POST_NOTIFICATIONS - ) - } else { - openSimulation() + val simulationMissingFields = simulationFields.filter { it.value == "null" }.keys + + if (simulationMissingFields.isNotEmpty()) { + val dialogMessage = + buildString { + append(getString(R.string.label_simulation_fields_missing)) + append("\n") + simulationMissingFields.forEach { append("• $it\n") } } - } + + val dialogTitle: String = getString(R.string.title_configuration_incomplete) + val positiveButtonText: String = getString(R.string.ok) + + AlertDialog + .Builder(activity) + .setTitle(dialogTitle) + .setMessage(dialogMessage) + .setPositiveButton(positiveButtonText) { dialog, _ -> + dialog.dismiss() + }.setCancelable(false).show() + } else { + startSimulation() } } tvMaybeLater.setOnClickListener { @@ -140,6 +134,41 @@ class SimulationBottomSheetFragment : BottomSheetDialogFragment() { } } + private fun startSimulation() { + when { + ContextCompat.checkSelfPermission( + requireContext(), + POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED -> { + openSimulation() + } + + shouldShowRequestPermissionRationale(POST_NOTIFICATIONS) -> { + if (!NotificationManagerCompat.from(requireContext()).areNotificationsEnabled()) { + requireContext().notificationPermission(object : NotificationDialogInterface { + override fun onOkClick(dialog: DialogInterface) { + openAppNotificationSettings(requireContext()) + } + + override fun onCancelClick(dialog: DialogInterface) { + openSimulation() + } + }) + } + } + + else -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + requestPermissionLauncher.launch( + POST_NOTIFICATIONS + ) + } else { + openSimulation() + } + } + } + } + @SuppressLint("ObsoleteSdkInt") private fun openAppNotificationSettings(context: Context) { val intent = Intent() diff --git a/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationUtils.kt b/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationUtils.kt index 1fe3f2dd..d8f0f092 100644 --- a/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationUtils.kt +++ b/app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationUtils.kt @@ -819,9 +819,11 @@ class SimulationUtils( ), mPreferenceManager?.getValue(KEY_NEAREST_REGION, "") ) - + if (defaultIdentityPoolId == "null") return val credentials = createCredentialsProvider(mLocationProvider.getCredentials()) - mqttClient = AWSIotMqttClient(getSimulationWebSocketUrl(defaultIdentityPoolId), identityId, credentials, defaultIdentityPoolId.split(":")[0]) + val webSocketUrl = getSimulationWebSocketUrl(defaultIdentityPoolId) + if (webSocketUrl == "null") return + mqttClient = AWSIotMqttClient(webSocketUrl, identityId, credentials, defaultIdentityPoolId.split(":")[0]) try { mqttClient?.connect(MQTT_CONNECT_TIME_OUT, false) diff --git a/app/src/main/java/com/aws/amazonlocation/ui/main/welcome/WelcomeBottomSheetFragment.kt b/app/src/main/java/com/aws/amazonlocation/ui/main/welcome/WelcomeBottomSheetFragment.kt index 02be645b..dae0c09c 100644 --- a/app/src/main/java/com/aws/amazonlocation/ui/main/welcome/WelcomeBottomSheetFragment.kt +++ b/app/src/main/java/com/aws/amazonlocation/ui/main/welcome/WelcomeBottomSheetFragment.kt @@ -90,7 +90,7 @@ class WelcomeBottomSheetFragment : BottomSheetDialogFragment() { private fun clickListener() { mBinding.apply { btnContinueToApp.setOnClickListener { - (activity as MainActivity).setWelcomeToExplorer() + (activity as MainActivity).checkPropertiesData() dialog.dismiss() } } diff --git a/app/src/main/java/com/aws/amazonlocation/utils/Constants.kt b/app/src/main/java/com/aws/amazonlocation/utils/Constants.kt index fa782823..73ed95d9 100644 --- a/app/src/main/java/com/aws/amazonlocation/utils/Constants.kt +++ b/app/src/main/java/com/aws/amazonlocation/utils/Constants.kt @@ -249,6 +249,24 @@ val notificationData = arrayListOf( NotificationData("Bus 05 UBC", false) ) +val requiredFields = mapOf( + "API_KEY_EU_CENTRAL" to BuildConfig.API_KEY_EU_CENTRAL, + "API_KEY_US_EAST" to BuildConfig.API_KEY_US_EAST +) + +val simulationFields = mapOf( + "DEFAULT_IDENTITY_POOL_ID" to BuildConfig.DEFAULT_IDENTITY_POOL_ID, + "DEFAULT_IDENTITY_POOL_ID_EU" to BuildConfig.DEFAULT_IDENTITY_POOL_ID_EU, + "DEFAULT_REGION" to BuildConfig.DEFAULT_REGION, + "SIMULATION_WEB_SOCKET_URL" to BuildConfig.SIMULATION_WEB_SOCKET_URL, + "SIMULATION_WEB_SOCKET_URL_EU" to BuildConfig.SIMULATION_WEB_SOCKET_URL_EU, +) + +val analyticsFields = mapOf( + "ANALYTICS_IDENTITY_POOL_ID" to BuildConfig.ANALYTICS_IDENTITY_POOL_ID, + "ANALYTICS_APP_ID" to BuildConfig.ANALYTICS_APP_ID +) + object EventType { const val SCREEN_OPEN = "SCREEN_OPEN" const val SCREEN_CLOSE = "SCREEN_CLOSE" diff --git a/app/src/main/java/com/aws/amazonlocation/utils/MapHelper.kt b/app/src/main/java/com/aws/amazonlocation/utils/MapHelper.kt index 7f9583b2..bec967ce 100644 --- a/app/src/main/java/com/aws/amazonlocation/utils/MapHelper.kt +++ b/app/src/main/java/com/aws/amazonlocation/utils/MapHelper.kt @@ -175,6 +175,7 @@ class MapHelper( ), mPreferenceManager?.getValue(KEY_NEAREST_REGION, ""), ) + if (defaultIdentityPoolId == "null") return region = defaultIdentityPoolId.split(":")[0] } } diff --git a/app/src/main/java/com/aws/amazonlocation/utils/analytics/AnalyticsUtils.kt b/app/src/main/java/com/aws/amazonlocation/utils/analytics/AnalyticsUtils.kt index aab6e913..455aa00f 100644 --- a/app/src/main/java/com/aws/amazonlocation/utils/analytics/AnalyticsUtils.kt +++ b/app/src/main/java/com/aws/amazonlocation/utils/analytics/AnalyticsUtils.kt @@ -45,12 +45,12 @@ class AnalyticsUtils( suspend fun initAnalytics() { credentialProvider = mLocationProvider.getAnalyticsCredentialProvider() - credentialProvider?.let { + if (BuildConfig.ANALYTICS_IDENTITY_POOL_ID != "null" || credentialProvider != null) { val region = BuildConfig.ANALYTICS_IDENTITY_POOL_ID.split(":")[0] pinpointClient = PinpointClient { this.region = region - credentialsProvider = it + credentialsProvider = credentialProvider } if (endpointId.isEmpty()) { endpointId = UUID.randomUUID().toString() @@ -89,6 +89,7 @@ class AnalyticsUtils( event: String, properties: List> = emptyList(), ) { + if (BuildConfig.ANALYTICS_APP_ID == "null") return CoroutineScope(Dispatchers.IO).launch { if (!mLocationProvider.isUnAuthCredentialsValid(true)) { runBlocking { initAnalytics() } @@ -211,6 +212,7 @@ class AnalyticsUtils( } suspend fun startSession() { + if (BuildConfig.ANALYTICS_APP_ID == "null") return session.creationStatus = AnalyticsSessionStatus.IN_PROGRESS runBlocking { createOrUpdateEndpoint() } session.id = UUID.randomUUID().toString() diff --git a/app/src/main/java/com/aws/amazonlocation/utils/providers/LocationProvider.kt b/app/src/main/java/com/aws/amazonlocation/utils/providers/LocationProvider.kt index f39f00f6..242890a6 100644 --- a/app/src/main/java/com/aws/amazonlocation/utils/providers/LocationProvider.kt +++ b/app/src/main/java/com/aws/amazonlocation/utils/providers/LocationProvider.kt @@ -77,6 +77,7 @@ class LocationProvider( suspend fun initPlaceRoutesClients(baseActivity: BaseActivity) { val mRegion = Units.getRegion(mPreferenceManager) val apiKey = Units.getApiKey(mPreferenceManager) + if (apiKey == "null") return val credentialProvider = CoroutineScope(Dispatchers.Main) .async { @@ -113,6 +114,7 @@ class LocationProvider( "", ).toString() } + if (defaultIdentityPoolId == "null") return val defaultRegion = defaultIdentityPoolId.split(":")[0] region = defaultRegion region?.let { @@ -232,6 +234,7 @@ class LocationProvider( } } suspend fun getAnalyticsCredentialProvider(): CredentialsProvider? { + if (BuildConfig.ANALYTICS_IDENTITY_POOL_ID == "null") return null val defaultIdentityPoolId = BuildConfig.ANALYTICS_IDENTITY_POOL_ID val defaultRegion = BuildConfig.ANALYTICS_IDENTITY_POOL_ID.split(":")[0] return generateUnAuthCredentials(defaultRegion, defaultIdentityPoolId, true) diff --git a/app/src/main/res/values-ar/string.xml b/app/src/main/res/values-ar/string.xml index 4c74b053..022dc4aa 100644 --- a/app/src/main/res/values-ar/string.xml +++ b/app/src/main/res/values-ar/string.xml @@ -254,4 +254,9 @@ تنزانيا منظر في بحيرة مالاوي الأوروغواي منظر في رينكون دي أرتيجاس فيتنام منظر في ال باراسيل الجزر و سبراتلي الجزر + مطلوب التكوين مفاتيح يكونوا في عداد المفقودين، و ال تطبيق غير قادر وظيفة بدون هم. ال التالي مفاتيح يكونوا مفقود:\n + بعض التكوين مفاتيح يكونوا مفقود. خريطة، ابحث، الأماكن، و المسار يكونوا متاح، لكن محاكاة و تحليلات يكونوا معاق حتى ال التالي مفاتيح يكونوا وأضاف:\n + بعض التكوين مفاتيح يكونوا مفقود. خريطة، ابحث، الأماكن، و المسار يكونوا متاح، لكن محاكاة هو معاق حتى ال التالي مفاتيح يكونوا وأضاف:\n + تحليلات تتبع هو معاق بسبب ال التالي التكوين مفاتيح يكونوا مفقود:\n + التكوين غير مكتمل \ No newline at end of file diff --git a/app/src/main/res/values-de/string.xml b/app/src/main/res/values-de/string.xml index 4afa43c0..65cd682a 100644 --- a/app/src/main/res/values-de/string.xml +++ b/app/src/main/res/values-de/string.xml @@ -254,4 +254,9 @@ Tansania\'s anzeigen auf See Malawi Uruguays anzeigen auf Rincon de Artigas Vietnams anzeigen auf die Paracel Inseln und Spratli Inseln + Erforderlich Aufbau Schlüssel sind fehlt, und die Anwendung kann nicht wirken ohne sie. Das folgend Schlüssel sind fehlt:\n + Einige Aufbau Schlüssel sind fehlt. Landkarte, Suche, Orte, und Route sind verfügbar, aber Simulation und Analytik sind Behinderte bis die folgend Schlüssel sind hinzugefügt:\n + Einige Aufbau Schlüssel sind fehlt. Landkarte, Suche, Orte, und Route sind verfügbar, aber Simulation ist Behinderte bis die folgend Schlüssel sind hinzugefügt:\n + Analytik Verfolgung ist Behinderte da die folgend Aufbau Schlüssel sind fehlt:\n + Konfiguration Unvollständig \ No newline at end of file diff --git a/app/src/main/res/values-es/string.xml b/app/src/main/res/values-es/string.xml index e9d62123..2916d097 100644 --- a/app/src/main/res/values-es/string.xml +++ b/app/src/main/res/values-es/string.xml @@ -254,4 +254,9 @@ Tanzania\'s vista en lago Malawi Uruguay\'s vista en Rincón de Artigas Vietnam vista en la Paracelso Islas y Spratly Islas + Necesario configuración llaves somos desaparecido, y la aplicación no poder función sin ellos. El siguiendo llaves somos falta:\n + Algunos configuración llaves somos desaparecido. Mapa, Buscar, Lugares, y Ruta somos disponible, pero Simulación y Analítica somos inhabilitado hasta la siguiendo llaves somos agregado:\n + Algunos configuración llaves somos desaparecido. Mapa, Buscar, Lugares, y Ruta somos disponible, pero Simulación es inhabilitado hasta la siguiendo llaves somos agregado:\n + Analítica rastreo es inhabilitado porque la siguiendo configuración llaves somos falta:\n + Configuración Incompleto \ No newline at end of file diff --git a/app/src/main/res/values-fr/string.xml b/app/src/main/res/values-fr/string.xml index 4a62f2e4..231f3262 100644 --- a/app/src/main/res/values-fr/string.xml +++ b/app/src/main/res/values-fr/string.xml @@ -254,4 +254,9 @@ Tanzanie voir sur Lac Malawi Uruguay voir sur Rincón de Artigas Vietnam voir sur le Paracelle Îles et Spratly Îles + Nécessaire configuration clés sont disparu, et le candidature ne peut pas fonction sans eux. Le suivant clés sont manquant :\n + Certains configuration clés sont disparu. Carte, Rechercher, Des lieux, et Parcours sont disponible, mais Simulation et Analytique sont handicapé jusqu\'à le suivant clés sont ajouté :\n + Certains configuration clés sont disparu. Carte, Rechercher, Des lieux, et Parcours sont disponible, mais Simulation est handicapé jusqu\'à le suivant clés sont ajouté :\n + Analytique suivi est handicapé parce que le suivant configuration clés sont manquant :\n + Configuration Incomplet \ No newline at end of file diff --git a/app/src/main/res/values-hi/string.xml b/app/src/main/res/values-hi/string.xml index abdea279..21c751a2 100644 --- a/app/src/main/res/values-hi/string.xml +++ b/app/src/main/res/values-hi/string.xml @@ -254,4 +254,9 @@ तंज़ानिया\'s राय के ऊपर झील मलावी उरुग्वे\'s राय के ऊपर रिनकोन डी अर्टिगास वियतनाम का राय के ऊपर यह पैरासेल द्वीप समूह और स्प्रैटली द्वीप समूह + ज़रूरी कॉन्फ़िगरेशन चांबियाँ हैं गुम, और यह आवेदन नहीं कर सकता समारोह बगैर उन्हें। द निम्नलिखित चांबियाँ हैं अनुपलब्ध:\n + कुछ कॉन्फ़िगरेशन चांबियाँ हैं लापता। नक्शा, खोजें, जगहें, और रूट हैं उपलब्ध, परंतु सिमुलेशन और एनालिटिक्स हैं दिव्यांग जब तक यह निम्नलिखित चांबियाँ हैं जोड़ा गया:\n + कुछ कॉन्फ़िगरेशन चांबियाँ हैं लापता। नक्शा, खोजें, जगहें, और रूट हैं उपलब्ध, परंतु सिमुलेशन है दिव्यांग जब तक यह निम्नलिखित चांबियाँ हैं जोड़ा गया:\n + एनालिटिक्स नज़र रखना है दिव्यांग इसलिये यह निम्नलिखित कॉन्फ़िगरेशन चांबियाँ हैं अनुपलब्ध:\n + कॉन्फ़िगरेशन अधूरा \ No newline at end of file diff --git a/app/src/main/res/values-it/string.xml b/app/src/main/res/values-it/string.xml index 02019c8c..54940ce2 100644 --- a/app/src/main/res/values-it/string.xml +++ b/app/src/main/res/values-it/string.xml @@ -254,4 +254,9 @@ della Tanzania vista sul Lago Malawi Uruguay\'s vista sul Rincon de Artigas Vietnam\'s vista sul lo Paracel Isole e Spratly Isole + Richiesto configurazione chiavi siamo mancante, e lo candidatura Non posso funzione senza loro. Le seguenti chiavi siamo mancante:\n + Alcuni configurazione chiavi siamo mancante. Mappa, Cerca, Luoghi, e Percorso siamo disponibile, tranne Simulazione e analitica siamo disabili fino a lo seguenti chiavi siamo aggiunto:\n + Alcuni configurazione chiavi siamo mancante. Mappa, Cerca, Luoghi, e Percorso siamo disponibile, tranne Simulazione è disabili fino a lo seguenti chiavi siamo aggiunto:\n + analitica tracciamento è disabili perché lo seguenti configurazione chiavi siamo mancante:\n + Configurazione Incompleto \ No newline at end of file diff --git a/app/src/main/res/values-iw/string.xml b/app/src/main/res/values-iw/string.xml index 31c8de0d..29cae31f 100644 --- a/app/src/main/res/values-iw/string.xml +++ b/app/src/main/res/values-iw/string.xml @@ -254,4 +254,9 @@ טנזניה מבט על אגם מלאווי אורוגוואי\ של מבט על רינקון דה ארטיגאס וייטנאם\ מבט על ה פאראסל איים ו ספראטלי איים + חובה תצורה מפתחות מהווים חסר, ו ה יישום לא יכול תפקוד בלי אותם. ה הבא מפתחות מהווים חסר:\ n + חלק תצורה מפתחות מהווים חסר. מפה, חיפוש, מקומות, ו מסלול מהווים זמין, אולם סימולציה ו ניתוח מהווים מושבת עד ה הבא מפתחות מהווים הוסיף:\ n + חלק תצורה מפתחות מהווים חסר. מפה, חיפוש, מקומות, ו מסלול מהווים זמין, אולם סימולציה הווה מושבת עד ה הבא מפתחות מהווים הוסיף:\ n + ניתוח מעקב הווה מושבת בגלל ה הבא תצורה מפתחות מהווים חסר:\ n + תצורה לא שלם \ No newline at end of file diff --git a/app/src/main/res/values-ja/string.xml b/app/src/main/res/values-ja/string.xml index 5f80f25f..981f660a 100644 --- a/app/src/main/res/values-ja/string.xml +++ b/app/src/main/res/values-ja/string.xml @@ -254,4 +254,9 @@ タンザニア 見る オン 湖 マラウイ ウルグアイ\ 見る オン リンコン de アルティガス ベトナムの 見る オン その パラセル 島々 そして スプラトリー 島々 + 必須 設定 キー です 行方不明、 そして その 応用 できない 関数 なし それら。 ザの 以下 キー です 見つからない:\n + 一部 設定 キー です 行方不明。 マップ、 検索、 場所、 そして ルート です 利用可能、 しかし シミュレーション そして 分析 です 無効になっています まで その 以下 キー です 追加されました:\n + 一部 設定 キー です 行方不明。 マップ、 検索、 場所、 そして ルート です 利用可能、 しかし シミュレーション です 無効になっています まで その 以下 キー です 追加されました:\n + 分析 追跡 です 無効になっています なぜなら その 以下 設定 キー です 見つからない:\n + コンフィギュレーション 不完全 \ No newline at end of file diff --git a/app/src/main/res/values-ko/string.xml b/app/src/main/res/values-ko/string.xml index 674236e9..d55d8aff 100644 --- a/app/src/main/res/values-ko/string.xml +++ b/app/src/main/res/values-ko/string.xml @@ -254,4 +254,9 @@ 탄자니아 전망 ...에 호수 말라위 우루과이 전망 ...에 린콘 de 아르티가스 베트남 전망 ...에 그 파라셀 섬 과 스프래틀리 섬 + 필수 구성 키를 누릅니다 입니다 실종, 과 그 응용 프로그램 할 수 없다 기능 없이 그들을. 더 다음의 키를 누릅니다 입니다 누락:\n + 일부 구성 키를 누릅니다 입니다 누락되었습니다. 지도, 검색, 장소, 과 노선 입니다 사용 가능, 하지만 시뮬레이션 과 해석학 입니다 비활성화 ...까지 그 다음의 키를 누릅니다 입니다 추가됨:\n + 일부 구성 키를 누릅니다 입니다 누락되었습니다. 지도, 검색, 장소, 과 노선 입니다 사용 가능, 하지만 시뮬레이션 입니다 비활성화 ...까지 그 다음의 키를 누릅니다 입니다 추가됨:\n + 해석학 추적 입니다 비활성화 왜냐하면 그 다음의 구성 키를 누릅니다 입니다 누락:\n + 구성 불완전 \ No newline at end of file diff --git a/app/src/main/res/values-pt/string.xml b/app/src/main/res/values-pt/string.xml index 3ef5a51d..ae815d17 100644 --- a/app/src/main/res/values-pt/string.xml +++ b/app/src/main/res/values-pt/string.xml @@ -254,4 +254,9 @@ Tanzânia\'s olhar em Lago Malawi Uruguai\'s olhar em Rincon de Artigas Vietnã\'s olhar em a Paracel Ilhas e Spratly Ilhas + Obrigatório configuração chaves está desaparecido, e a aplicativo não pode função sem eles. O segue chaves está ausente:\n + Alguns configuração chaves está desaparecido. Mapa, Pesquisar, Lugares, e Rota está disponível, mas Simulação e Análise está deficiente até a segue chaves está adicionado:\n + Alguns configuração chaves está desaparecido. Mapa, Pesquisar, Lugares, e Rota está disponível, mas Simulação é deficiente até a segue chaves está adicionado:\n + Análise rastreamento é deficiente porque a segue configuração chaves está ausente:\n + Configuração Incompleto \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/string.xml b/app/src/main/res/values-zh-rCN/string.xml index 2af7679e..99131642 100644 --- a/app/src/main/res/values-zh-rCN/string.xml +++ b/app/src/main/res/values-zh-rCN/string.xml @@ -254,4 +254,9 @@ 坦桑尼亚的 观点 上 湖 马拉维 乌拉圭 观点 上 林康 de 阿蒂加斯 越南 观点 上 这 帕拉塞尔 岛屿 和 南沙群岛 岛屿 + 必填项 配置 钥匙 是 失踪, 和 这 应用程序 不能 功能 没有 他们。 这个 以下 钥匙 是 缺失:\n + 一些 配置 钥匙 是 失踪。 地图, 搜索, 地方, 和 路线 是 可用, 但是 模拟 和 分析 是 残疾的 直到 这 以下 钥匙 是 已添加:\n + 一些 配置 钥匙 是 失踪。 地图, 搜索, 地方, 和 路线 是 可用, 但是 模拟 是 残疾的 直到 这 以下 钥匙 是 已添加:\n + 分析 追踪 是 残疾的 因为 这 以下 配置 钥匙 是 缺失:\n + 配置 不完整 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/string.xml b/app/src/main/res/values-zh-rTW/string.xml index c4a9fc5a..f13b17d4 100644 --- a/app/src/main/res/values-zh-rTW/string.xml +++ b/app/src/main/res/values-zh-rTW/string.xml @@ -254,4 +254,9 @@ 坦桑尼亞\ 的 檢視 上 湖 馬拉威 烏拉圭\ 的 檢視 上 林康 下 阿蒂加斯 越南\ 的 檢視 上 該 帕拉塞爾 島嶼 和 普拉特利 島嶼 + 必須 配置 按鍵 是 遺失, 和 該 應用程式 不能 功能 無 他們。 The 以下 按鍵 是 缺少:\n + 一些 配置 按鍵 是 遺失。 地圖, 搜索, 地點, 和 路線 是 可用, 但 模擬 和 分析 是 殘疾人 直到 該 以下 按鍵 是 添加:\n + 一些 配置 按鍵 是 遺失。 地圖, 搜索, 地點, 和 路線 是 可用, 但 模擬 是 殘疾人 直到 該 以下 按鍵 是 添加:\n + 分析 追蹤 是 殘疾人 因為 該 以下 配置 按鍵 是 缺少:\n + 配置 不完整 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5674a083..fec699f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -300,4 +300,10 @@ TZA URY VNM + + Required configuration keys are missing, and the application cannot function without them. The following keys are missing:\n + Some configuration keys are missing. Map, Search, Places, and Route are available, but Simulation and Analytics are disabled until the following keys are added:\n + Some configuration keys are missing. Map, Search, Places, and Route are available, but Simulation is disabled until the following keys are added:\n + Analytics tracking is disabled because the following configuration keys are missing:\n + Configuration Incomplete \ No newline at end of file