Skip to content

Commit d48c8f2

Browse files
authored
Merge pull request #367 from elimu-ai/340-display-toast-when-invalid-data
feat: display toast when invalid data
2 parents 52515ff + 8834195 commit d48c8f2

File tree

5 files changed

+276
-185
lines changed

5 files changed

+276
-185
lines changed

app/src/main/java/ai/elimu/analytics/receiver/AnalyticsEventReceiver.kt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import ai.elimu.analytics.utils.IntentAction
77
import android.content.BroadcastReceiver
88
import android.content.Context
99
import android.content.Intent
10+
import android.os.Bundle
1011
import timber.log.Timber
1112

1213
class AnalyticsEventReceiver : BroadcastReceiver() {
1314
override fun onReceive(context: Context, intent: Intent) {
1415
Timber.i("onReceive")
1516

1617
Timber.i("intent.action: ${intent.action}")
17-
1818
val bundle = intent.extras
1919
bundle?.let {
2020
for (key in bundle.keySet()) {
@@ -23,17 +23,24 @@ class AnalyticsEventReceiver : BroadcastReceiver() {
2323
}
2424
}
2525

26-
intent.getStringExtra("intent_action")?.let { action ->
27-
IntentAction.entries.firstOrNull { it.action == action }?.let { intentAction ->
28-
val event = intentAction.toEventType()
29-
.createEventFromIntent(context, intent)
26+
try {
27+
intent.getStringExtra("intent_action")?.let { action ->
28+
IntentAction.entries.firstOrNull { it.action == action }?.let { intentAction ->
29+
val event = intentAction.toEventType()
30+
.createEventFromIntent(context, intent)
3031

31-
// Store in database
32-
event.persistEvent(context)
33-
} ?: run {
34-
Timber.w("Unrecognized intent action: $action")
35-
}
32+
// Store in database
33+
event.persistEvent(context)
34+
} ?: run {
35+
Timber.w("Unrecognized intent action: $action")
36+
}
3637

38+
}
39+
} catch (e: Exception) {
40+
Timber.e(e)
41+
val results: Bundle = getResultExtras(true)
42+
val errorMessage = e.message ?: e::class.simpleName
43+
results.putString("errorMessage", errorMessage)
3744
}
3845
}
3946
}

app/src/main/java/ai/elimu/analytics/receiver/NumberAssessmentEventReceiver.kt

Lines changed: 47 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import ai.elimu.analytics.utils.research.ExperimentAssignmentHelper
77
import android.content.BroadcastReceiver
88
import android.content.Context
99
import android.content.Intent
10+
import android.os.Bundle
1011
import android.provider.Settings
1112
import android.text.TextUtils
1213
import timber.log.Timber
@@ -25,66 +26,63 @@ class NumberAssessmentEventReceiver : BroadcastReceiver() {
2526
}
2627
}
2728

28-
val event = NumberAssessmentEvent()
29+
try {
30+
val event = NumberAssessmentEvent()
2931

30-
val androidId: String = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
31-
Timber.i("androidId: \"${androidId}\"")
32-
event.androidId = androidId
32+
val androidId: String = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID)
33+
event.androidId = androidId
3334

34-
val packageName: String = intent.getStringExtra(BundleKeys.KEY_PACKAGE_NAME) ?: ""
35-
Timber.i("packageName: \"${packageName}\"")
36-
if (TextUtils.isEmpty(packageName)) {
37-
throw IllegalArgumentException("Missing packageName")
38-
}
39-
event.packageName = packageName
35+
val packageName: String = intent.getStringExtra(BundleKeys.KEY_PACKAGE_NAME) ?: ""
36+
if (TextUtils.isEmpty(packageName)) {
37+
throw IllegalArgumentException("Missing packageName")
38+
}
39+
event.packageName = packageName
4040

41-
val timestamp: Calendar = Calendar.getInstance()
42-
Timber.i("timestamp.time: ${timestamp.time}")
43-
event.time = timestamp
41+
val timestamp: Calendar = Calendar.getInstance()
42+
event.time = timestamp
4443

45-
val additionalData: String? = intent.getStringExtra(BundleKeys.KEY_ADDITIONAL_DATA)
46-
Timber.i("additionalData: ${additionalData}")
47-
event.additionalData = additionalData
44+
val researchExperiment = ExperimentAssignmentHelper.CURRENT_EXPERIMENT
45+
event.researchExperiment = researchExperiment
4846

49-
val researchExperiment = ExperimentAssignmentHelper.CURRENT_EXPERIMENT
50-
Timber.i("researchExperiment: ${researchExperiment}")
51-
event.researchExperiment = researchExperiment
47+
val experimentGroup = ExperimentAssignmentHelper.getExperimentGroup(context)
48+
event.experimentGroup = experimentGroup
5249

53-
val experimentGroup = ExperimentAssignmentHelper.getExperimentGroup(context)
54-
Timber.i("experimentGroup: ${experimentGroup}")
55-
event.experimentGroup = experimentGroup
50+
val additionalData: String? = intent.getStringExtra(BundleKeys.KEY_ADDITIONAL_DATA)
51+
event.additionalData = additionalData
5652

57-
val masteryScore: Float = intent.getFloatExtra(BundleKeys.KEY_MASTERY_SCORE, -1f)
58-
Timber.i("masteryScore: ${masteryScore}")
59-
if ((masteryScore < 0) || (masteryScore > 1)) {
60-
throw IllegalArgumentException("Invalid masteryScore. Must be in the range [0.0, 1.0]")
61-
}
62-
event.masteryScore = masteryScore
53+
val masteryScore: Float = intent.getFloatExtra(BundleKeys.KEY_MASTERY_SCORE, -1f)
54+
if ((masteryScore < 0) || (masteryScore > 1)) {
55+
throw IllegalArgumentException("Invalid masteryScore. Must be in the range [0.0, 1.0]")
56+
}
57+
event.masteryScore = masteryScore
6358

64-
val timeSpentMs: Long = intent.getLongExtra(BundleKeys.KEY_TIME_SPENT_MS, 0)
65-
Timber.i("timeSpentMs: ${timeSpentMs}")
66-
if (timeSpentMs <= 0) {
67-
throw IllegalArgumentException("Invalid timeSpentMs. Must be larger than 0")
68-
}
69-
event.timeSpentMs = timeSpentMs
59+
val timeSpentMs: Long = intent.getLongExtra(BundleKeys.KEY_TIME_SPENT_MS, 0)
60+
if (timeSpentMs <= 0) {
61+
throw IllegalArgumentException("Invalid timeSpentMs. Must be larger than 0")
62+
}
63+
event.timeSpentMs = timeSpentMs
7064

71-
val numberValue: Int = intent.getIntExtra(BundleKeys.KEY_NUMBER_VALUE, Int.MIN_VALUE)
72-
Timber.i("numberValue: ${numberValue}")
73-
if (numberValue == Int.MIN_VALUE) {
74-
throw IllegalArgumentException("Missing numberValue")
75-
}
76-
event.numberValue = numberValue
65+
val numberValue: Int = intent.getIntExtra(BundleKeys.KEY_NUMBER_VALUE, Int.MIN_VALUE)
66+
if (numberValue == Int.MIN_VALUE) {
67+
throw IllegalArgumentException("Missing numberValue")
68+
}
69+
event.numberValue = numberValue
7770

78-
val numberId: Long = intent.getLongExtra(BundleKeys.KEY_NUMBER_ID, 0)
79-
Timber.i("numberId: ${numberId}")
80-
if (numberId > 0) {
81-
event.numberId = numberId
82-
}
71+
val numberId: Long = intent.getLongExtra(BundleKeys.KEY_NUMBER_ID, 0)
72+
if (numberId > 0) {
73+
event.numberId = numberId
74+
}
8375

84-
// Store the event in the database
85-
val roomDb = RoomDb.getDatabase(context)
86-
RoomDb.databaseWriteExecutor.execute {
87-
roomDb.numberAssessmentEventDao().insert(event)
76+
// Store the event in the database
77+
val roomDb = RoomDb.getDatabase(context)
78+
RoomDb.databaseWriteExecutor.execute {
79+
roomDb.numberAssessmentEventDao().insert(event)
80+
}
81+
} catch (e: Exception) {
82+
Timber.e(e)
83+
val results: Bundle = getResultExtras(true)
84+
val errorMessage = e.message ?: e::class.simpleName
85+
results.putString("errorMessage", errorMessage)
8886
}
8987
}
9088
}
Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package ai.elimu.analytics.utils
22

3+
import ai.elimu.analytics.utils.receiver.ErrorResultReceiver
34
import ai.elimu.model.v2.gson.content.LetterGson
45
import ai.elimu.model.v2.gson.content.LetterSoundGson
56
import ai.elimu.model.v2.gson.content.NumberGson
67
import ai.elimu.model.v2.gson.content.SoundGson
78
import ai.elimu.model.v2.gson.content.WordGson
9+
import android.app.Activity
810
import android.content.Context
911
import android.content.Intent
12+
import android.os.Bundle
1013
import android.util.Log
14+
import android.widget.Toast
1115
import org.json.JSONObject
1216
import java.util.stream.Collectors
1317

@@ -17,8 +21,6 @@ import java.util.stream.Collectors
1721
*/
1822
object AssessmentEventUtil {
1923

20-
private const val TAG = "AssessmentEventUtil"
21-
2224
/**
2325
* @param letterSoundGson The letter-sound correspondence that the student is being assessed for.
2426
* @param masteryScore A value in the range [0.0, 1.0].
@@ -35,24 +37,32 @@ object AssessmentEventUtil {
3537
context: Context,
3638
analyticsApplicationId: String
3739
) {
38-
Log.i(TAG,"reportLetterSoundAssessmentEvent")
40+
Log.i(this::class.simpleName,"reportLetterSoundAssessmentEvent")
41+
42+
try {
43+
val broadcastIntent = Intent()
44+
broadcastIntent.setPackage(analyticsApplicationId)
45+
broadcastIntent.setAction(LearningEventUtil.BROADCAST_INTENT_ACTION_ANALYTICS)
46+
broadcastIntent.putExtra("intent_action", IntentAction.LETTER_SOUND_ASSESSMENT.action)
47+
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
48+
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
49+
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
50+
additionalData?.let {
51+
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
52+
}
53+
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_LETTERS,
54+
letterSoundGson.letters.stream().map(LetterGson::getText).collect(Collectors.joining()))
55+
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_SOUNDS,
56+
letterSoundGson.sounds.stream().map(SoundGson::getValueIpa).collect(Collectors.joining()))
57+
letterSoundGson.id?.let {
58+
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_ID, letterSoundGson.id)
59+
}
3960

40-
val broadcastIntent = Intent()
41-
broadcastIntent.setAction(LearningEventUtil.BROADCAST_INTENT_ACTION_ANALYTICS)
42-
broadcastIntent.putExtra("intent_action", IntentAction.LETTER_SOUND_ASSESSMENT.action)
43-
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
44-
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_LETTERS,
45-
letterSoundGson.letters.stream().map(LetterGson::getText).collect(Collectors.joining()))
46-
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_SOUNDS,
47-
letterSoundGson.sounds.stream().map(SoundGson::getValueIpa).collect(Collectors.joining()))
48-
broadcastIntent.putExtra(BundleKeys.KEY_LETTER_SOUND_ID, letterSoundGson.id)
49-
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
50-
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
51-
additionalData?.let {
52-
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
61+
context.sendOrderedBroadcast(broadcastIntent, null, ErrorResultReceiver(), null, Activity.RESULT_OK, null, null)
62+
} catch (e: Exception) {
63+
Log.e(this::class.simpleName, "Error during Intent preparation", e)
64+
Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
5365
}
54-
broadcastIntent.setPackage(analyticsApplicationId)
55-
context.sendBroadcast(broadcastIntent)
5666
}
5767

5868
/**
@@ -71,21 +81,29 @@ object AssessmentEventUtil {
7181
context: Context,
7282
analyticsApplicationId: String
7383
) {
74-
Log.i(TAG, "reportWordAssessmentEvent")
84+
Log.i(this::class.simpleName, "reportWordAssessmentEvent")
85+
86+
try {
87+
val broadcastIntent = Intent()
88+
broadcastIntent.setPackage(analyticsApplicationId)
89+
broadcastIntent.setAction(LearningEventUtil.BROADCAST_INTENT_ACTION_ANALYTICS)
90+
broadcastIntent.putExtra("intent_action", IntentAction.WORD_ASSESSMENT.action)
91+
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
92+
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
93+
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
94+
additionalData?.let {
95+
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
96+
}
97+
broadcastIntent.putExtra(BundleKeys.KEY_WORD_TEXT, wordGson.text)
98+
wordGson.id?.let {
99+
broadcastIntent.putExtra(BundleKeys.KEY_WORD_ID, wordGson.id)
100+
}
75101

76-
val broadcastIntent = Intent()
77-
broadcastIntent.setAction(LearningEventUtil.BROADCAST_INTENT_ACTION_ANALYTICS)
78-
broadcastIntent.putExtra("intent_action", IntentAction.WORD_ASSESSMENT.action)
79-
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
80-
broadcastIntent.putExtra(BundleKeys.KEY_WORD_ID, wordGson.id)
81-
broadcastIntent.putExtra(BundleKeys.KEY_WORD_TEXT, wordGson.text)
82-
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
83-
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
84-
additionalData?.let {
85-
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
102+
context.sendOrderedBroadcast(broadcastIntent, null, ErrorResultReceiver(), null, Activity.RESULT_OK, null, null)
103+
} catch (e: Exception) {
104+
Log.e(this::class.simpleName, "Error during Intent preparation", e)
105+
Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
86106
}
87-
broadcastIntent.setPackage(analyticsApplicationId)
88-
context.sendBroadcast(broadcastIntent)
89107
}
90108

91109
/**
@@ -104,20 +122,27 @@ object AssessmentEventUtil {
104122
context: Context,
105123
analyticsApplicationId: String
106124
) {
107-
Log.i(TAG, "reportNumberAssessmentEvent")
125+
Log.i(this::class.simpleName, "reportNumberAssessmentEvent")
108126

109-
val broadcastIntent = Intent()
110-
broadcastIntent.setPackage(analyticsApplicationId)
111-
broadcastIntent.setAction("ai.elimu.intent.action.NUMBER_ASSESSMENT_EVENT")
112-
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
113-
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
114-
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
115-
additionalData?.let {
116-
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
117-
}
118-
broadcastIntent.putExtra(BundleKeys.KEY_NUMBER_VALUE, numberGson.value)
119-
broadcastIntent.putExtra(BundleKeys.KEY_NUMBER_ID, numberGson.id)
127+
try {
128+
val broadcastIntent = Intent()
129+
broadcastIntent.setPackage(analyticsApplicationId)
130+
broadcastIntent.setAction("ai.elimu.intent.action.NUMBER_ASSESSMENT_EVENT")
131+
broadcastIntent.putExtra(BundleKeys.KEY_PACKAGE_NAME, context.packageName)
132+
broadcastIntent.putExtra(BundleKeys.KEY_MASTERY_SCORE, masteryScore)
133+
broadcastIntent.putExtra(BundleKeys.KEY_TIME_SPENT_MS, timeSpentMs)
134+
additionalData?.let {
135+
broadcastIntent.putExtra(BundleKeys.KEY_ADDITIONAL_DATA, additionalData.toString())
136+
}
137+
broadcastIntent.putExtra(BundleKeys.KEY_NUMBER_VALUE, numberGson.value)
138+
numberGson.id?.let {
139+
broadcastIntent.putExtra(BundleKeys.KEY_NUMBER_ID, numberGson.id)
140+
}
120141

121-
context.sendBroadcast(broadcastIntent)
142+
context.sendOrderedBroadcast(broadcastIntent, null, ErrorResultReceiver(), null, Activity.RESULT_OK, null, null)
143+
} catch (e: Exception) {
144+
Log.e(this::class.simpleName, "Error during Intent preparation", e)
145+
Toast.makeText(context, e.message, Toast.LENGTH_SHORT).show()
146+
}
122147
}
123148
}

0 commit comments

Comments
 (0)