Skip to content

Commit ed2f400

Browse files
authored
Merge pull request #385 from elimu-ai/refactor-code-duplication
refactor: prevent code duplication
2 parents 0e9fd7f + deddc68 commit ed2f400

File tree

6 files changed

+136
-95
lines changed

6 files changed

+136
-95
lines changed

app/src/main/java/ai/elimu/analytics/provider/LetterSoundAssessmentEventProvider.kt

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.UriMatcher
1010
import android.database.Cursor
1111
import android.net.Uri
1212
import android.os.Bundle
13+
import android.util.Log
1314
import timber.log.Timber
1415
import androidx.core.net.toUri
1516

@@ -68,20 +69,7 @@ class LetterSoundAssessmentEventProvider : ContentProvider() {
6869
val cursor = letterSoundAssessmentEventDao.loadAllCursor()
6970
Timber.i("cursor: ${cursor}")
7071
cursor.setNotificationUri(context.contentResolver, uri)
71-
val bundle = Bundle().apply {
72-
putInt("version_code", BuildConfig.VERSION_CODE)
73-
putString(BundleKeys.KEY_ID, LetterSoundAssessmentEvent::id.name)
74-
putString(BundleKeys.KEY_ANDROID_ID, LetterSoundAssessmentEvent::androidId.name)
75-
putString(BundleKeys.KEY_PACKAGE_NAME, LetterSoundAssessmentEvent::packageName.name)
76-
putString(BundleKeys.KEY_TIMESTAMP, LetterSoundAssessmentEvent::time.name)
77-
putString(BundleKeys.KEY_MASTERY_SCORE, LetterSoundAssessmentEvent::masteryScore.name)
78-
putString(BundleKeys.KEY_TIME_SPENT_MS, LetterSoundAssessmentEvent::timeSpentMs.name)
79-
putString(BundleKeys.KEY_ADDITIONAL_DATA, LetterSoundAssessmentEvent::additionalData.name)
80-
putString(BundleKeys.KEY_LETTER_SOUND_LETTERS, LetterSoundAssessmentEvent::letterSoundLetters.name)
81-
putString(BundleKeys.KEY_LETTER_SOUND_SOUNDS, LetterSoundAssessmentEvent::letterSoundSounds.name)
82-
putString(BundleKeys.KEY_LETTER_SOUND_ID, LetterSoundAssessmentEvent::letterSoundId.name)
83-
}
84-
cursor.extras = bundle
72+
cursor.extras = prepareBundle()
8573
return cursor
8674
}
8775
CODE_EVENTS_BY_LETTER_SOUND_ID -> {
@@ -98,20 +86,7 @@ class LetterSoundAssessmentEventProvider : ContentProvider() {
9886
val cursor = letterSoundAssessmentEventDao.loadAllCursor(letterSoundId)
9987
Timber.i("cursor: ${cursor}")
10088
cursor.setNotificationUri(context.contentResolver, uri)
101-
val bundle = Bundle().apply {
102-
putInt("version_code", BuildConfig.VERSION_CODE)
103-
putString(BundleKeys.KEY_ID, LetterSoundAssessmentEvent::id.name)
104-
putString(BundleKeys.KEY_ANDROID_ID, LetterSoundAssessmentEvent::androidId.name)
105-
putString(BundleKeys.KEY_PACKAGE_NAME, LetterSoundAssessmentEvent::packageName.name)
106-
putString(BundleKeys.KEY_TIMESTAMP, LetterSoundAssessmentEvent::time.name)
107-
putString(BundleKeys.KEY_MASTERY_SCORE, LetterSoundAssessmentEvent::masteryScore.name)
108-
putString(BundleKeys.KEY_TIME_SPENT_MS, LetterSoundAssessmentEvent::timeSpentMs.name)
109-
putString(BundleKeys.KEY_ADDITIONAL_DATA, LetterSoundAssessmentEvent::additionalData.name)
110-
putString(BundleKeys.KEY_LETTER_SOUND_LETTERS, LetterSoundAssessmentEvent::letterSoundLetters.name)
111-
putString(BundleKeys.KEY_LETTER_SOUND_SOUNDS, LetterSoundAssessmentEvent::letterSoundSounds.name)
112-
putString(BundleKeys.KEY_LETTER_SOUND_ID, LetterSoundAssessmentEvent::letterSoundId.name)
113-
}
114-
cursor.extras = bundle
89+
cursor.extras = prepareBundle()
11590
return cursor
11691
}
11792
else -> {
@@ -120,6 +95,27 @@ class LetterSoundAssessmentEventProvider : ContentProvider() {
12095
}
12196
}
12297

98+
/**
99+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
100+
*/
101+
private fun prepareBundle(): Bundle {
102+
Log.i(this::class.simpleName, "prepareBundle")
103+
val bundle = Bundle().apply {
104+
putInt("version_code", BuildConfig.VERSION_CODE)
105+
putString(BundleKeys.KEY_ID, LetterSoundAssessmentEvent::id.name)
106+
putString(BundleKeys.KEY_ANDROID_ID, LetterSoundAssessmentEvent::androidId.name)
107+
putString(BundleKeys.KEY_PACKAGE_NAME, LetterSoundAssessmentEvent::packageName.name)
108+
putString(BundleKeys.KEY_TIMESTAMP, LetterSoundAssessmentEvent::time.name)
109+
putString(BundleKeys.KEY_MASTERY_SCORE, LetterSoundAssessmentEvent::masteryScore.name)
110+
putString(BundleKeys.KEY_TIME_SPENT_MS, LetterSoundAssessmentEvent::timeSpentMs.name)
111+
putString(BundleKeys.KEY_ADDITIONAL_DATA, LetterSoundAssessmentEvent::additionalData.name)
112+
putString(BundleKeys.KEY_LETTER_SOUND_LETTERS, LetterSoundAssessmentEvent::letterSoundLetters.name)
113+
putString(BundleKeys.KEY_LETTER_SOUND_SOUNDS, LetterSoundAssessmentEvent::letterSoundSounds.name)
114+
putString(BundleKeys.KEY_LETTER_SOUND_ID, LetterSoundAssessmentEvent::letterSoundId.name)
115+
}
116+
return bundle
117+
}
118+
123119
override fun getType(uri: Uri): String? {
124120
Timber.i("getType")
125121

app/src/main/java/ai/elimu/analytics/provider/LetterSoundLearningEventProvider.kt

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ package ai.elimu.analytics.provider
22

33
import ai.elimu.analytics.BuildConfig
44
import ai.elimu.analytics.db.RoomDb
5+
import ai.elimu.analytics.entity.LetterSoundLearningEvent
6+
import ai.elimu.analytics.entity.WordLearningEvent
7+
import ai.elimu.analytics.utils.BundleKeys
58
import android.content.ContentProvider
69
import android.content.ContentValues
710
import android.content.UriMatcher
811
import android.database.Cursor
912
import android.net.Uri
1013
import android.os.Bundle
14+
import android.util.Log
1115
import timber.log.Timber
1216
import androidx.core.net.toUri
1317

@@ -51,16 +55,33 @@ class LetterSoundLearningEventProvider : ContentProvider() {
5155
val cursor = letterSoundLearningEventDao.loadAllOrderedByTimeCursor()
5256
Timber.i("cursor: $cursor")
5357
cursor.setNotificationUri(context.contentResolver, uri)
54-
val bundle = Bundle().apply {
55-
putInt("version_code", BuildConfig.VERSION_CODE)
56-
}
57-
cursor.extras = bundle
58+
cursor.extras = prepareBundle()
5859
return cursor
5960
} else {
6061
throw IllegalArgumentException("Unknown URI: $uri")
6162
}
6263
}
6364

65+
/**
66+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
67+
*/
68+
private fun prepareBundle(): Bundle {
69+
Log.i(this::class.simpleName, "prepareBundle")
70+
val bundle = Bundle().apply {
71+
putInt("version_code", BuildConfig.VERSION_CODE)
72+
putString(BundleKeys.KEY_ID, WordLearningEvent::id.name)
73+
putString(BundleKeys.KEY_ANDROID_ID, WordLearningEvent::androidId.name)
74+
putString(BundleKeys.KEY_PACKAGE_NAME, WordLearningEvent::packageName.name)
75+
putString(BundleKeys.KEY_TIMESTAMP, WordLearningEvent::time.name)
76+
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, WordLearningEvent::learningEventType.name)
77+
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordLearningEvent::additionalData.name)
78+
putString(BundleKeys.KEY_LETTER_SOUND_LETTERS, LetterSoundLearningEvent::letterSoundLetterTexts.name)
79+
putString(BundleKeys.KEY_LETTER_SOUND_SOUNDS, LetterSoundLearningEvent::letterSoundSoundValuesIpa.name)
80+
putString(BundleKeys.KEY_LETTER_SOUND_ID, LetterSoundLearningEvent::letterSoundId.name)
81+
}
82+
return bundle
83+
}
84+
6485
override fun getType(uri: Uri): String? {
6586
Timber.i("getType")
6687

app/src/main/java/ai/elimu/analytics/provider/NumberLearningEventProvider.kt

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.UriMatcher
1010
import android.database.Cursor
1111
import android.net.Uri
1212
import android.os.Bundle
13+
import android.util.Log
1314
import timber.log.Timber
1415
import androidx.core.net.toUri
1516

@@ -53,25 +54,33 @@ class NumberLearningEventProvider : ContentProvider() {
5354
val cursor = numberLearningEventDao.loadAllOrderedByTime()
5455
Timber.i("cursor: $cursor")
5556
cursor.setNotificationUri(context.contentResolver, uri)
56-
val bundle = Bundle().apply {
57-
putInt("version_code", BuildConfig.VERSION_CODE)
58-
putString(BundleKeys.KEY_ID, NumberLearningEvent::id.name)
59-
putString(BundleKeys.KEY_ANDROID_ID, NumberLearningEvent::androidId.name)
60-
putString(BundleKeys.KEY_PACKAGE_NAME, NumberLearningEvent::packageName.name)
61-
putString(BundleKeys.KEY_TIMESTAMP, NumberLearningEvent::time.name)
62-
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, NumberLearningEvent::learningEventType.name)
63-
putString(BundleKeys.KEY_ADDITIONAL_DATA, NumberLearningEvent::additionalData.name)
64-
putString(BundleKeys.KEY_NUMBER_VALUE, NumberLearningEvent::numberValue.name)
65-
putString(BundleKeys.KEY_NUMBER_SYMBOL, NumberLearningEvent::numberSymbol.name)
66-
putString(BundleKeys.KEY_NUMBER_ID, NumberLearningEvent::numberId.name)
67-
}
68-
cursor.extras = bundle
57+
cursor.extras = prepareBundle()
6958
return cursor
7059
} else {
7160
throw IllegalArgumentException("Unknown URI: $uri")
7261
}
7362
}
7463

64+
/**
65+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
66+
*/
67+
private fun prepareBundle(): Bundle {
68+
Log.i(this::class.simpleName, "prepareBundle")
69+
val bundle = Bundle().apply {
70+
putInt("version_code", BuildConfig.VERSION_CODE)
71+
putString(BundleKeys.KEY_ID, NumberLearningEvent::id.name)
72+
putString(BundleKeys.KEY_ANDROID_ID, NumberLearningEvent::androidId.name)
73+
putString(BundleKeys.KEY_PACKAGE_NAME, NumberLearningEvent::packageName.name)
74+
putString(BundleKeys.KEY_TIMESTAMP, NumberLearningEvent::time.name)
75+
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, NumberLearningEvent::learningEventType.name)
76+
putString(BundleKeys.KEY_ADDITIONAL_DATA, NumberLearningEvent::additionalData.name)
77+
putString(BundleKeys.KEY_NUMBER_VALUE, NumberLearningEvent::numberValue.name)
78+
putString(BundleKeys.KEY_NUMBER_SYMBOL, NumberLearningEvent::numberSymbol.name)
79+
putString(BundleKeys.KEY_NUMBER_ID, NumberLearningEvent::numberId.name)
80+
}
81+
return bundle
82+
}
83+
7584
override fun getType(uri: Uri): String? {
7685
Timber.i("getType")
7786

app/src/main/java/ai/elimu/analytics/provider/VideoLearningEventProvider.kt

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.UriMatcher
1010
import android.database.Cursor
1111
import android.net.Uri
1212
import android.os.Bundle
13+
import android.util.Log
1314
import timber.log.Timber
1415
import androidx.core.net.toUri
1516

@@ -53,24 +54,32 @@ class VideoLearningEventProvider : ContentProvider() {
5354
val cursor = videoLearningEventDao.loadAllToCursor()
5455
Timber.i("cursor: $cursor")
5556
cursor.setNotificationUri(context.contentResolver, uri)
56-
val bundle = Bundle().apply {
57-
putInt("version_code", BuildConfig.VERSION_CODE)
58-
putString(BundleKeys.KEY_ID, VideoLearningEvent::id.name)
59-
putString(BundleKeys.KEY_ANDROID_ID, VideoLearningEvent::androidId.name)
60-
putString(BundleKeys.KEY_PACKAGE_NAME, VideoLearningEvent::packageName.name)
61-
putString(BundleKeys.KEY_TIMESTAMP, VideoLearningEvent::time.name)
62-
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, VideoLearningEvent::learningEventType.name)
63-
putString(BundleKeys.KEY_ADDITIONAL_DATA, VideoLearningEvent::additionalData.name)
64-
putString(BundleKeys.KEY_VIDEO_TITLE, VideoLearningEvent::videoTitle.name)
65-
putString(BundleKeys.KEY_VIDEO_ID, VideoLearningEvent::videoId.name)
66-
}
67-
cursor.extras = bundle
57+
cursor.extras = prepareBundle()
6858
return cursor
6959
} else {
7060
throw IllegalArgumentException("Unknown URI: $uri")
7161
}
7262
}
7363

64+
/**
65+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
66+
*/
67+
private fun prepareBundle(): Bundle {
68+
Log.i(this::class.simpleName, "prepareBundle")
69+
val bundle = Bundle().apply {
70+
putInt("version_code", BuildConfig.VERSION_CODE)
71+
putString(BundleKeys.KEY_ID, VideoLearningEvent::id.name)
72+
putString(BundleKeys.KEY_ANDROID_ID, VideoLearningEvent::androidId.name)
73+
putString(BundleKeys.KEY_PACKAGE_NAME, VideoLearningEvent::packageName.name)
74+
putString(BundleKeys.KEY_TIMESTAMP, VideoLearningEvent::time.name)
75+
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, VideoLearningEvent::learningEventType.name)
76+
putString(BundleKeys.KEY_ADDITIONAL_DATA, VideoLearningEvent::additionalData.name)
77+
putString(BundleKeys.KEY_VIDEO_TITLE, VideoLearningEvent::videoTitle.name)
78+
putString(BundleKeys.KEY_VIDEO_ID, VideoLearningEvent::videoId.name)
79+
}
80+
return bundle
81+
}
82+
7483
override fun getType(uri: Uri): String? {
7584
Timber.i("getType")
7685

app/src/main/java/ai/elimu/analytics/provider/WordAssessmentEventProvider.kt

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.UriMatcher
1010
import android.database.Cursor
1111
import android.net.Uri
1212
import android.os.Bundle
13+
import android.util.Log
1314
import timber.log.Timber
1415
import androidx.core.net.toUri
1516

@@ -54,19 +55,7 @@ class WordAssessmentEventProvider : ContentProvider() {
5455
val cursor = wordAssessmentEventDao.loadAllOrderedByTimeDesc()
5556
Timber.i("cursor: $cursor")
5657
cursor.setNotificationUri(context.contentResolver, uri)
57-
val bundle = Bundle().apply {
58-
putInt("version_code", BuildConfig.VERSION_CODE)
59-
putString(BundleKeys.KEY_ID, WordAssessmentEvent::id.name)
60-
putString(BundleKeys.KEY_ANDROID_ID, WordAssessmentEvent::androidId.name)
61-
putString(BundleKeys.KEY_PACKAGE_NAME, WordAssessmentEvent::packageName.name)
62-
putString(BundleKeys.KEY_TIMESTAMP, WordAssessmentEvent::time.name)
63-
putString(BundleKeys.KEY_MASTERY_SCORE, WordAssessmentEvent::masteryScore.name)
64-
putString(BundleKeys.KEY_TIME_SPENT_MS, WordAssessmentEvent::timeSpentMs.name)
65-
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordAssessmentEvent::additionalData.name)
66-
putString(BundleKeys.KEY_WORD_TEXT, WordAssessmentEvent::wordText.name)
67-
putString(BundleKeys.KEY_WORD_ID, WordAssessmentEvent::wordId.name)
68-
}
69-
cursor.extras = bundle
58+
cursor.extras = prepareBundle()
7059
return cursor
7160
}
7261
CODE_EVENTS_BY_WORD_ID -> {
@@ -83,19 +72,7 @@ class WordAssessmentEventProvider : ContentProvider() {
8372
val cursor = wordAssessmentEventDao.loadAllOrderedByTimeDesc(wordId)
8473
Timber.i("cursor: $cursor")
8574
cursor.setNotificationUri(context.contentResolver, uri)
86-
val bundle = Bundle().apply {
87-
putInt("version_code", BuildConfig.VERSION_CODE)
88-
putString(BundleKeys.KEY_ID, WordAssessmentEvent::id.name)
89-
putString(BundleKeys.KEY_ANDROID_ID, WordAssessmentEvent::androidId.name)
90-
putString(BundleKeys.KEY_PACKAGE_NAME, WordAssessmentEvent::packageName.name)
91-
putString(BundleKeys.KEY_TIMESTAMP, WordAssessmentEvent::time.name)
92-
putString(BundleKeys.KEY_MASTERY_SCORE, WordAssessmentEvent::masteryScore.name)
93-
putString(BundleKeys.KEY_TIME_SPENT_MS, WordAssessmentEvent::timeSpentMs.name)
94-
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordAssessmentEvent::additionalData.name)
95-
putString(BundleKeys.KEY_WORD_TEXT, WordAssessmentEvent::wordText.name)
96-
putString(BundleKeys.KEY_WORD_ID, WordAssessmentEvent::wordId.name)
97-
}
98-
cursor.extras = bundle
75+
cursor.extras = prepareBundle()
9976
return cursor
10077
}
10178
else -> {
@@ -104,6 +81,26 @@ class WordAssessmentEventProvider : ContentProvider() {
10481
}
10582
}
10683

84+
/**
85+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
86+
*/
87+
private fun prepareBundle(): Bundle {
88+
Log.i(this::class.simpleName, "prepareBundle")
89+
val bundle = Bundle().apply {
90+
putInt("version_code", BuildConfig.VERSION_CODE)
91+
putString(BundleKeys.KEY_ID, WordAssessmentEvent::id.name)
92+
putString(BundleKeys.KEY_ANDROID_ID, WordAssessmentEvent::androidId.name)
93+
putString(BundleKeys.KEY_PACKAGE_NAME, WordAssessmentEvent::packageName.name)
94+
putString(BundleKeys.KEY_TIMESTAMP, WordAssessmentEvent::time.name)
95+
putString(BundleKeys.KEY_MASTERY_SCORE, WordAssessmentEvent::masteryScore.name)
96+
putString(BundleKeys.KEY_TIME_SPENT_MS, WordAssessmentEvent::timeSpentMs.name)
97+
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordAssessmentEvent::additionalData.name)
98+
putString(BundleKeys.KEY_WORD_TEXT, WordAssessmentEvent::wordText.name)
99+
putString(BundleKeys.KEY_WORD_ID, WordAssessmentEvent::wordId.name)
100+
}
101+
return bundle
102+
}
103+
107104
override fun getType(uri: Uri): String? {
108105
Timber.i("getType")
109106

app/src/main/java/ai/elimu/analytics/provider/WordLearningEventProvider.kt

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import android.content.UriMatcher
1010
import android.database.Cursor
1111
import android.net.Uri
1212
import android.os.Bundle
13+
import android.util.Log
1314
import timber.log.Timber
1415
import androidx.core.net.toUri
1516

@@ -53,24 +54,32 @@ class WordLearningEventProvider : ContentProvider() {
5354
val cursor = wordLearningEventDao.loadAllOrderedByTime()
5455
Timber.i("cursor: $cursor")
5556
cursor.setNotificationUri(context.contentResolver, uri)
56-
val bundle = Bundle().apply {
57-
putInt("version_code", BuildConfig.VERSION_CODE)
58-
putString(BundleKeys.KEY_ID, WordLearningEvent::id.name)
59-
putString(BundleKeys.KEY_ANDROID_ID, WordLearningEvent::androidId.name)
60-
putString(BundleKeys.KEY_PACKAGE_NAME, WordLearningEvent::packageName.name)
61-
putString(BundleKeys.KEY_TIMESTAMP, WordLearningEvent::time.name)
62-
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, WordLearningEvent::learningEventType.name)
63-
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordLearningEvent::additionalData.name)
64-
putString(BundleKeys.KEY_WORD_TEXT, WordLearningEvent::wordText.name)
65-
putString(BundleKeys.KEY_WORD_ID, WordLearningEvent::wordId.name)
66-
}
67-
cursor.extras = bundle
57+
cursor.extras = prepareBundle()
6858
return cursor
6959
} else {
7060
throw IllegalArgumentException("Unknown URI: $uri")
7161
}
7262
}
7363

64+
/**
65+
* Prepare database column names needed by the Cursor-to-Gson converter in the `:utils` module.
66+
*/
67+
private fun prepareBundle(): Bundle {
68+
Log.i(this::class.simpleName, "prepareBundle")
69+
val bundle = Bundle().apply {
70+
putInt("version_code", BuildConfig.VERSION_CODE)
71+
putString(BundleKeys.KEY_ID, WordLearningEvent::id.name)
72+
putString(BundleKeys.KEY_ANDROID_ID, WordLearningEvent::androidId.name)
73+
putString(BundleKeys.KEY_PACKAGE_NAME, WordLearningEvent::packageName.name)
74+
putString(BundleKeys.KEY_TIMESTAMP, WordLearningEvent::time.name)
75+
putString(BundleKeys.KEY_LEARNING_EVENT_TYPE, WordLearningEvent::learningEventType.name)
76+
putString(BundleKeys.KEY_ADDITIONAL_DATA, WordLearningEvent::additionalData.name)
77+
putString(BundleKeys.KEY_WORD_TEXT, WordLearningEvent::wordText.name)
78+
putString(BundleKeys.KEY_WORD_ID, WordLearningEvent::wordId.name)
79+
}
80+
return bundle
81+
}
82+
7483
override fun getType(uri: Uri): String? {
7584
Timber.i("getType")
7685

0 commit comments

Comments
 (0)