Skip to content

Commit 8e3e5ae

Browse files
committed
fix: App should work without no data inside custom.properties file
ALS-1884
1 parent ddfc221 commit 8e3e5ae

File tree

21 files changed

+224
-41
lines changed

21 files changed

+224
-41
lines changed

app/src/main/java/com/aws/amazonlocation/ui/main/MainActivity.kt

+69-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.aws.amazonlocation.ui.main
22

33
import android.annotation.SuppressLint
4+
import android.app.AlertDialog
45
import android.app.Dialog
56
import android.content.pm.ActivityInfo
67
import android.content.res.Configuration
@@ -14,7 +15,6 @@ import android.webkit.WebResourceRequest
1415
import android.webkit.WebView
1516
import android.webkit.WebViewClient
1617
import androidx.activity.OnBackPressedCallback
17-
import androidx.activity.result.contract.ActivityResultContracts
1818
import androidx.constraintlayout.widget.ConstraintSet
1919
import androidx.core.content.ContextCompat
2020
import androidx.fragment.app.Fragment
@@ -85,14 +85,17 @@ import com.aws.amazonlocation.utils.SIGN_OUT
8585
import com.aws.amazonlocation.utils.Units.checkInternetConnection
8686
import com.aws.amazonlocation.utils.VERSION_FRAGMENT
8787
import com.aws.amazonlocation.utils.analytics.AnalyticsUtils
88+
import com.aws.amazonlocation.utils.analyticsFields
8889
import com.aws.amazonlocation.utils.getLanguageCode
8990
import com.aws.amazonlocation.utils.hide
9091
import com.aws.amazonlocation.utils.hideViews
9192
import com.aws.amazonlocation.utils.invisible
9293
import com.aws.amazonlocation.utils.makeTransparentStatusBar
94+
import com.aws.amazonlocation.utils.requiredFields
9395
import com.aws.amazonlocation.utils.setLocale
9496
import com.aws.amazonlocation.utils.show
9597
import com.aws.amazonlocation.utils.showViews
98+
import com.aws.amazonlocation.utils.simulationFields
9699
import kotlinx.coroutines.CoroutineScope
97100
import kotlinx.coroutines.Dispatchers
98101
import kotlinx.coroutines.async
@@ -642,6 +645,7 @@ class MainActivity :
642645
var mRegion = mPreferenceManager.getValue(KEY_USER_REGION, "")
643646

644647
if (mRegion.isNullOrEmpty()) {
648+
if (BuildConfig.DEFAULT_REGION == "null") return@launch
645649
mRegion = BuildConfig.DEFAULT_REGION
646650
}
647651
val iotClient =
@@ -690,6 +694,7 @@ class MainActivity :
690694

691695
private fun setSimulationIotPolicy() {
692696
val identityId = mLocationProvider.getIdentityId()
697+
if (identityId.isNullOrEmpty()) return
693698
CoroutineScope(Dispatchers.IO).launch {
694699
val attachPolicyRequest =
695700
AttachPolicyRequest {
@@ -699,7 +704,7 @@ class MainActivity :
699704

700705
val iotClient =
701706
IotClient {
702-
region = identityId?.split(":")?.get(0)
707+
region = identityId.split(":")[0]
703708
credentialsProvider =
704709
createCredentialsProviderForPolicy(
705710
mLocationProvider.getCredentials(),
@@ -934,7 +939,7 @@ class MainActivity :
934939
mBinding.imgAmazonLogo?.setImageResource(logoResId)
935940
}
936941

937-
fun setExplorer() {
942+
private fun setExplorer() {
938943
val fragment = mNavHostFragment.childFragmentManager.fragments[0]
939944
if (fragment !is ExploreFragment) {
940945
mNavController.navigate(R.id.explore_fragment)
@@ -998,7 +1003,6 @@ class MainActivity :
9981003
mTrackingUtils?.hideTrackingBottomSheet()
9991004
mSimulationUtils?.showSimulationBottomSheet()
10001005
if (mNavHostFragment.childFragmentManager.fragments.isNotEmpty()) {
1001-
val fragment = mNavHostFragment.childFragmentManager.fragments[0]
10021006
if (fragment is ExploreFragment) {
10031007
if (isTablet) {
10041008
fragment.hideDirectionAndCurrentLocationIcon()
@@ -1200,7 +1204,64 @@ class MainActivity :
12001204
}
12011205
}
12021206

1203-
fun setWelcomeToExplorer() {
1207+
fun checkPropertiesData() {
1208+
val missingRequiredFields = requiredFields.filter { it.value == "null" }.keys
1209+
val simulationMissingFields = simulationFields.filter { it.value == "null" }.keys
1210+
val analyticsMissingFields = analyticsFields.filter { it.value == "null" }.keys
1211+
1212+
if (missingRequiredFields.isNotEmpty() || simulationMissingFields.isNotEmpty() || analyticsMissingFields.isNotEmpty()) {
1213+
val dialogMessage = buildString {
1214+
when {
1215+
missingRequiredFields.isNotEmpty() -> {
1216+
append(getString(R.string.label_required_fields_missing))
1217+
append("\n")
1218+
missingRequiredFields.forEach { append("$it\n") }
1219+
simulationMissingFields.forEach { append("$it\n") }
1220+
analyticsMissingFields.forEach { append("$it\n") }
1221+
}
1222+
simulationMissingFields.isNotEmpty() && analyticsMissingFields.isNotEmpty() -> {
1223+
append(getString(R.string.label_some_fields_missing))
1224+
append("\n")
1225+
simulationMissingFields.forEach { append("$it\n") }
1226+
analyticsMissingFields.forEach { append("$it\n") }
1227+
}
1228+
simulationMissingFields.isNotEmpty() -> {
1229+
append(getString(R.string.label_simulation_fields_missing))
1230+
append("\n")
1231+
simulationMissingFields.forEach { append("$it\n") }
1232+
}
1233+
analyticsMissingFields.isNotEmpty() -> {
1234+
append(getString(R.string.label_analytics_fields_missing))
1235+
append("\n")
1236+
analyticsMissingFields.forEach { append("$it\n") }
1237+
}
1238+
}
1239+
}
1240+
1241+
val dialogTitle = getString(R.string.title_configuration_incomplete)
1242+
val positiveButtonText = if (missingRequiredFields.isNotEmpty()) {
1243+
getString(R.string.ok)
1244+
} else {
1245+
getString(R.string.label_continue)
1246+
}
1247+
1248+
AlertDialog
1249+
.Builder(this)
1250+
.setTitle(dialogTitle)
1251+
.setMessage(dialogMessage)
1252+
.setPositiveButton(positiveButtonText) { _, _ ->
1253+
if (missingRequiredFields.isNotEmpty()) {
1254+
finish()
1255+
} else {
1256+
setWelcomeToExplorer()
1257+
}
1258+
}.setCancelable(false).show()
1259+
} else {
1260+
setWelcomeToExplorer()
1261+
}
1262+
}
1263+
1264+
private fun setWelcomeToExplorer() {
12041265
mPreferenceManager.setValue(IS_APP_FIRST_TIME_OPENED, true)
12051266
isAppNotFirstOpened = true
12061267
val fragment =
@@ -1232,11 +1293,12 @@ class MainActivity :
12321293
}
12331294
}
12341295

1235-
fun initClient(isAfterSignOut:Boolean = false){
1296+
fun initClient(isAfterSignOut: Boolean = false) {
12361297
if (!isAfterSignOut) {
12371298
try {
12381299
mLocationProvider.clearCredentials()
1239-
} catch (_: Exception) { }
1300+
} catch (_: Exception) {
1301+
}
12401302
}
12411303
CoroutineScope(Dispatchers.IO).launch {
12421304
async { initMobileClient() }.await()

app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationBottomSheetFragment.kt

+58-29
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.aws.amazonlocation.ui.main.simulation
22

33
import android.Manifest.permission.POST_NOTIFICATIONS
44
import android.annotation.SuppressLint
5+
import android.app.AlertDialog
56
import android.app.Dialog
67
import android.content.Context
78
import android.content.DialogInterface
@@ -27,6 +28,7 @@ import com.aws.amazonlocation.utils.AnalyticsAttributeValue
2728
import com.aws.amazonlocation.utils.EventType
2829
import com.aws.amazonlocation.utils.NotificationDialogInterface
2930
import com.aws.amazonlocation.utils.notificationPermission
31+
import com.aws.amazonlocation.utils.simulationFields
3032
import com.google.android.material.bottomsheet.BottomSheetBehavior
3133
import com.google.android.material.bottomsheet.BottomSheetDialog
3234
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@@ -99,36 +101,28 @@ class SimulationBottomSheetFragment : BottomSheetDialogFragment() {
99101
private fun clickListener() {
100102
mBinding.apply {
101103
btnStartSimulation.setOnClickListener {
102-
when {
103-
ContextCompat.checkSelfPermission(
104-
requireContext(),
105-
POST_NOTIFICATIONS
106-
) == PackageManager.PERMISSION_GRANTED -> {
107-
openSimulation()
108-
}
109-
shouldShowRequestPermissionRationale(POST_NOTIFICATIONS) -> {
110-
if (!NotificationManagerCompat.from(requireContext()).areNotificationsEnabled()) {
111-
requireContext().notificationPermission(object : NotificationDialogInterface {
112-
override fun onOkClick(dialog: DialogInterface) {
113-
openAppNotificationSettings(requireContext())
114-
}
115-
116-
override fun onCancelClick(dialog: DialogInterface) {
117-
openSimulation()
118-
}
119-
})
120-
}
121-
}
122-
else -> {
123-
// The registered ActivityResultCallback gets the result of this request
124-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
125-
requestPermissionLauncher.launch(
126-
POST_NOTIFICATIONS
127-
)
128-
} else {
129-
openSimulation()
104+
val simulationMissingFields = simulationFields.filter { it.value == "null" }.keys
105+
106+
if (simulationMissingFields.isNotEmpty()) {
107+
val dialogMessage =
108+
buildString {
109+
append(getString(R.string.label_simulation_fields_missing))
110+
append("\n")
111+
simulationMissingFields.forEach { append("$it\n") }
130112
}
131-
}
113+
114+
val dialogTitle: String = getString(R.string.title_configuration_incomplete)
115+
val positiveButtonText: String = getString(R.string.ok)
116+
117+
AlertDialog
118+
.Builder(activity)
119+
.setTitle(dialogTitle)
120+
.setMessage(dialogMessage)
121+
.setPositiveButton(positiveButtonText) { dialog, _ ->
122+
dialog.dismiss()
123+
}.setCancelable(false).show()
124+
} else {
125+
startSimulation()
132126
}
133127
}
134128
tvMaybeLater.setOnClickListener {
@@ -140,6 +134,41 @@ class SimulationBottomSheetFragment : BottomSheetDialogFragment() {
140134
}
141135
}
142136

137+
private fun startSimulation() {
138+
when {
139+
ContextCompat.checkSelfPermission(
140+
requireContext(),
141+
POST_NOTIFICATIONS
142+
) == PackageManager.PERMISSION_GRANTED -> {
143+
openSimulation()
144+
}
145+
146+
shouldShowRequestPermissionRationale(POST_NOTIFICATIONS) -> {
147+
if (!NotificationManagerCompat.from(requireContext()).areNotificationsEnabled()) {
148+
requireContext().notificationPermission(object : NotificationDialogInterface {
149+
override fun onOkClick(dialog: DialogInterface) {
150+
openAppNotificationSettings(requireContext())
151+
}
152+
153+
override fun onCancelClick(dialog: DialogInterface) {
154+
openSimulation()
155+
}
156+
})
157+
}
158+
}
159+
160+
else -> {
161+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
162+
requestPermissionLauncher.launch(
163+
POST_NOTIFICATIONS
164+
)
165+
} else {
166+
openSimulation()
167+
}
168+
}
169+
}
170+
}
171+
143172
@SuppressLint("ObsoleteSdkInt")
144173
private fun openAppNotificationSettings(context: Context) {
145174
val intent = Intent()

app/src/main/java/com/aws/amazonlocation/ui/main/simulation/SimulationUtils.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -819,9 +819,11 @@ class SimulationUtils(
819819
),
820820
mPreferenceManager?.getValue(KEY_NEAREST_REGION, "")
821821
)
822-
822+
if (defaultIdentityPoolId == "null") return
823823
val credentials = createCredentialsProvider(mLocationProvider.getCredentials())
824-
mqttClient = AWSIotMqttClient(getSimulationWebSocketUrl(defaultIdentityPoolId), identityId, credentials, defaultIdentityPoolId.split(":")[0])
824+
val webSocketUrl = getSimulationWebSocketUrl(defaultIdentityPoolId)
825+
if (webSocketUrl == "null") return
826+
mqttClient = AWSIotMqttClient(webSocketUrl, identityId, credentials, defaultIdentityPoolId.split(":")[0])
825827

826828
try {
827829
mqttClient?.connect(MQTT_CONNECT_TIME_OUT, false)

app/src/main/java/com/aws/amazonlocation/ui/main/welcome/WelcomeBottomSheetFragment.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class WelcomeBottomSheetFragment : BottomSheetDialogFragment() {
9090
private fun clickListener() {
9191
mBinding.apply {
9292
btnContinueToApp.setOnClickListener {
93-
(activity as MainActivity).setWelcomeToExplorer()
93+
(activity as MainActivity).checkPropertiesData()
9494
dialog.dismiss()
9595
}
9696
}

app/src/main/java/com/aws/amazonlocation/utils/Constants.kt

+18
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,24 @@ val notificationData = arrayListOf(
249249
NotificationData("Bus 05 UBC", false)
250250
)
251251

252+
val requiredFields = mapOf(
253+
"API_KEY_EU_CENTRAL" to BuildConfig.API_KEY_EU_CENTRAL,
254+
"API_KEY_US_EAST" to BuildConfig.API_KEY_US_EAST
255+
)
256+
257+
val simulationFields = mapOf(
258+
"DEFAULT_IDENTITY_POOL_ID" to BuildConfig.DEFAULT_IDENTITY_POOL_ID,
259+
"DEFAULT_IDENTITY_POOL_ID_EU" to BuildConfig.DEFAULT_IDENTITY_POOL_ID_EU,
260+
"DEFAULT_REGION" to BuildConfig.DEFAULT_REGION,
261+
"SIMULATION_WEB_SOCKET_URL" to BuildConfig.SIMULATION_WEB_SOCKET_URL,
262+
"SIMULATION_WEB_SOCKET_URL_EU" to BuildConfig.SIMULATION_WEB_SOCKET_URL_EU,
263+
)
264+
265+
val analyticsFields = mapOf(
266+
"ANALYTICS_IDENTITY_POOL_ID" to BuildConfig.ANALYTICS_IDENTITY_POOL_ID,
267+
"ANALYTICS_APP_ID" to BuildConfig.ANALYTICS_APP_ID
268+
)
269+
252270
object EventType {
253271
const val SCREEN_OPEN = "SCREEN_OPEN"
254272
const val SCREEN_CLOSE = "SCREEN_CLOSE"

app/src/main/java/com/aws/amazonlocation/utils/MapHelper.kt

+1
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class MapHelper(
175175
),
176176
mPreferenceManager?.getValue(KEY_NEAREST_REGION, ""),
177177
)
178+
if (defaultIdentityPoolId == "null") return
178179
region = defaultIdentityPoolId.split(":")[0]
179180
}
180181
}

app/src/main/java/com/aws/amazonlocation/utils/analytics/AnalyticsUtils.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ class AnalyticsUtils(
4545

4646
suspend fun initAnalytics() {
4747
credentialProvider = mLocationProvider.getAnalyticsCredentialProvider()
48-
credentialProvider?.let {
48+
if (BuildConfig.ANALYTICS_IDENTITY_POOL_ID != "null" || credentialProvider != null) {
4949
val region = BuildConfig.ANALYTICS_IDENTITY_POOL_ID.split(":")[0]
5050
pinpointClient =
5151
PinpointClient {
5252
this.region = region
53-
credentialsProvider = it
53+
credentialsProvider = credentialProvider
5454
}
5555
if (endpointId.isEmpty()) {
5656
endpointId = UUID.randomUUID().toString()
@@ -89,6 +89,7 @@ class AnalyticsUtils(
8989
event: String,
9090
properties: List<Pair<String, String>> = emptyList(),
9191
) {
92+
if (BuildConfig.ANALYTICS_APP_ID == "null") return
9293
CoroutineScope(Dispatchers.IO).launch {
9394
if (!mLocationProvider.isUnAuthCredentialsValid(true)) {
9495
runBlocking { initAnalytics() }
@@ -211,6 +212,7 @@ class AnalyticsUtils(
211212
}
212213

213214
suspend fun startSession() {
215+
if (BuildConfig.ANALYTICS_APP_ID == "null") return
214216
session.creationStatus = AnalyticsSessionStatus.IN_PROGRESS
215217
runBlocking { createOrUpdateEndpoint() }
216218
session.id = UUID.randomUUID().toString()

app/src/main/java/com/aws/amazonlocation/utils/providers/LocationProvider.kt

+3
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class LocationProvider(
7777
suspend fun initPlaceRoutesClients(baseActivity: BaseActivity) {
7878
val mRegion = Units.getRegion(mPreferenceManager)
7979
val apiKey = Units.getApiKey(mPreferenceManager)
80+
if (apiKey == "null") return
8081
val credentialProvider =
8182
CoroutineScope(Dispatchers.Main)
8283
.async {
@@ -113,6 +114,7 @@ class LocationProvider(
113114
"",
114115
).toString()
115116
}
117+
if (defaultIdentityPoolId == "null") return
116118
val defaultRegion = defaultIdentityPoolId.split(":")[0]
117119
region = defaultRegion
118120
region?.let {
@@ -232,6 +234,7 @@ class LocationProvider(
232234
}
233235
}
234236
suspend fun getAnalyticsCredentialProvider(): CredentialsProvider? {
237+
if (BuildConfig.ANALYTICS_IDENTITY_POOL_ID == "null") return null
235238
val defaultIdentityPoolId = BuildConfig.ANALYTICS_IDENTITY_POOL_ID
236239
val defaultRegion = BuildConfig.ANALYTICS_IDENTITY_POOL_ID.split(":")[0]
237240
return generateUnAuthCredentials(defaultRegion, defaultIdentityPoolId, true)

app/src/main/res/values-ar/string.xml

+5
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,9 @@
254254
<string name="description_tza">تنزانيا منظر في بحيرة مالاوي</string>
255255
<string name="description_ury">الأوروغواي منظر في رينكون دي أرتيجاس</string>
256256
<string name="description_vnm">فيتنام منظر في ال باراسيل الجزر و سبراتلي الجزر</string>
257+
<string name="label_required_fields_missing">مطلوب التكوين مفاتيح يكونوا في عداد المفقودين، و ال تطبيق غير قادر وظيفة بدون هم. ال التالي مفاتيح يكونوا مفقود:\n</string>
258+
<string name="label_some_fields_missing">بعض التكوين مفاتيح يكونوا مفقود. خريطة، ابحث، الأماكن، و المسار يكونوا متاح، لكن محاكاة و تحليلات يكونوا معاق حتى ال التالي مفاتيح يكونوا وأضاف:\n</string>
259+
<string name="label_simulation_fields_missing">بعض التكوين مفاتيح يكونوا مفقود. خريطة، ابحث، الأماكن، و المسار يكونوا متاح، لكن محاكاة هو معاق حتى ال التالي مفاتيح يكونوا وأضاف:\n</string>
260+
<string name="label_analytics_fields_missing">تحليلات تتبع هو معاق بسبب ال التالي التكوين مفاتيح يكونوا مفقود:\n</string>
261+
<string name="title_configuration_incomplete">التكوين غير مكتمل</string>
257262
</resources>

0 commit comments

Comments
 (0)