|
| 1 | +package ai.elimu.analytics.receiver |
| 2 | + |
| 3 | +import ai.elimu.analytics.db.RoomDb |
| 4 | +import ai.elimu.analytics.entity.NumberAssessmentEvent |
| 5 | +import ai.elimu.analytics.utils.BundleKeys |
| 6 | +import ai.elimu.analytics.utils.research.ExperimentAssignmentHelper |
| 7 | +import android.content.BroadcastReceiver |
| 8 | +import android.content.Context |
| 9 | +import android.content.Intent |
| 10 | +import android.provider.Settings |
| 11 | +import android.text.TextUtils |
| 12 | +import timber.log.Timber |
| 13 | +import java.util.Calendar |
| 14 | + |
| 15 | +class NumberAssessmentEventReceiver : BroadcastReceiver() { |
| 16 | + |
| 17 | + override fun onReceive(context: Context, intent: Intent) { |
| 18 | + Timber.i("onReceive") |
| 19 | + |
| 20 | + val bundle = intent.extras |
| 21 | + bundle?.let { |
| 22 | + for (key in bundle.keySet()) { |
| 23 | + val value = bundle.get(key) |
| 24 | + Timber.i("${key}: ${value}") |
| 25 | + } |
| 26 | + } |
| 27 | + |
| 28 | + val event = NumberAssessmentEvent() |
| 29 | + |
| 30 | + val androidId: String = Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) |
| 31 | + Timber.i("androidId: \"${androidId}\"") |
| 32 | + event.androidId = androidId |
| 33 | + |
| 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 |
| 40 | + |
| 41 | + val timestamp: Calendar = Calendar.getInstance() |
| 42 | + Timber.i("timestamp.time: ${timestamp.time}") |
| 43 | + event.time = timestamp |
| 44 | + |
| 45 | + val additionalData: String? = intent.getStringExtra(BundleKeys.KEY_ADDITIONAL_DATA) |
| 46 | + Timber.i("additionalData: ${additionalData}") |
| 47 | + event.additionalData = additionalData |
| 48 | + |
| 49 | + val researchExperiment = ExperimentAssignmentHelper.CURRENT_EXPERIMENT |
| 50 | + Timber.i("researchExperiment: ${researchExperiment}") |
| 51 | + event.researchExperiment = researchExperiment |
| 52 | + |
| 53 | + val experimentGroup = ExperimentAssignmentHelper.getExperimentGroup(context) |
| 54 | + Timber.i("experimentGroup: ${experimentGroup}") |
| 55 | + event.experimentGroup = experimentGroup |
| 56 | + |
| 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 |
| 63 | + |
| 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 |
| 70 | + |
| 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 |
| 77 | + |
| 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 | + } |
| 83 | + |
| 84 | + // Store the event in the database |
| 85 | + val roomDb = RoomDb.getDatabase(context) |
| 86 | + RoomDb.databaseWriteExecutor.execute { |
| 87 | + roomDb.numberAssessmentEventDao().insert(event) |
| 88 | + } |
| 89 | + } |
| 90 | +} |
0 commit comments