diff --git a/app/src/main/java/ai/elimu/analytics/entity/LearningEventUploadType.kt b/app/src/main/java/ai/elimu/analytics/entity/LearningEventUploadType.kt new file mode 100644 index 00000000..5ee4e716 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/entity/LearningEventUploadType.kt @@ -0,0 +1,29 @@ +package ai.elimu.analytics.entity + +import ai.elimu.analytics.rest.LetterAssessmentEventService +import ai.elimu.analytics.rest.LetterLearningEventService +import ai.elimu.analytics.rest.LetterSoundLearningEventService +import ai.elimu.analytics.rest.StoryBookLearningEventService +import ai.elimu.analytics.rest.UploadService +import ai.elimu.analytics.rest.WordAssessmentEventService +import ai.elimu.analytics.rest.WordLearningEventService + +enum class LearningEventUploadType(val type: String) { + LETTER_LEARNING("letter-learning-events"), + LETTER_ASSESSMENT("letter-assessment-events"), + LETTER_SOUND_LEARNING("letter-sound-learning-events"), + STORY_BOOK_LEARNING("storybook-learning-events"), + WORD_ASSESSMENT("word-assessment-events"), + WORD_LEARNING("word-learning-events") +} + +fun LearningEventUploadType.toServiceClass(): Class { + return when (this) { + LearningEventUploadType.LETTER_LEARNING -> LetterLearningEventService::class.java + LearningEventUploadType.LETTER_ASSESSMENT -> LetterAssessmentEventService::class.java + LearningEventUploadType.LETTER_SOUND_LEARNING -> LetterSoundLearningEventService::class.java + LearningEventUploadType.STORY_BOOK_LEARNING -> StoryBookLearningEventService::class.java + LearningEventUploadType.WORD_ASSESSMENT -> WordAssessmentEventService::class.java + LearningEventUploadType.WORD_LEARNING -> WordLearningEventService::class.java + } +} \ No newline at end of file diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.java b/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.java deleted file mode 100644 index f836a23e..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface LetterAssessmentEventService { - - @Multipart - @POST("analytics/letter-assessment-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.kt new file mode 100644 index 00000000..63f1b192 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/LetterAssessmentEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface LetterAssessmentEventService: UploadService { + @Multipart + @POST("analytics/letter-assessment-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.java b/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.java deleted file mode 100644 index 8968dc26..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface LetterLearningEventService { - - @Multipart - @POST("analytics/letter-learning-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.kt new file mode 100644 index 00000000..91e3e2ab --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/LetterLearningEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface LetterLearningEventService: UploadService { + @Multipart + @POST("analytics/letter-learning-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.java b/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.java deleted file mode 100644 index b44ced07..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface LetterSoundLearningEventService { - - @Multipart - @POST("analytics/letter-sound-learning-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.kt new file mode 100644 index 00000000..6bed17a5 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/LetterSoundLearningEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface LetterSoundLearningEventService: UploadService { + @Multipart + @POST("analytics/letter-sound-learning-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.java b/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.java deleted file mode 100644 index 28d2e032..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface StoryBookLearningEventService { - - @Multipart - @POST("analytics/storybook-learning-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.kt new file mode 100644 index 00000000..6ca09cc3 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/StoryBookLearningEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface StoryBookLearningEventService: UploadService { + @Multipart + @POST("analytics/storybook-learning-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/rest/UploadService.kt b/app/src/main/java/ai/elimu/analytics/rest/UploadService.kt new file mode 100644 index 00000000..f4235b65 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/UploadService.kt @@ -0,0 +1,10 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Part + +interface UploadService { + fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} \ No newline at end of file diff --git a/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.java b/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.java deleted file mode 100644 index 997b66e8..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface WordAssessmentEventService { - - @Multipart - @POST("analytics/word-assessment-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.kt new file mode 100644 index 00000000..df3f57f3 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/WordAssessmentEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface WordAssessmentEventService: UploadService { + @Multipart + @POST("analytics/word-assessment-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.java b/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.java deleted file mode 100644 index c8118171..00000000 --- a/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.java +++ /dev/null @@ -1,15 +0,0 @@ -package ai.elimu.analytics.rest; - -import okhttp3.MultipartBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.Multipart; -import retrofit2.http.POST; -import retrofit2.http.Part; - -public interface WordLearningEventService { - - @Multipart - @POST("analytics/word-learning-events/csv") - Call uploadCsvFile(@Part MultipartBody.Part part); -} diff --git a/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.kt b/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.kt new file mode 100644 index 00000000..3411d275 --- /dev/null +++ b/app/src/main/java/ai/elimu/analytics/rest/WordLearningEventService.kt @@ -0,0 +1,14 @@ +package ai.elimu.analytics.rest + +import okhttp3.MultipartBody +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface WordLearningEventService: UploadService { + @Multipart + @POST("analytics/word-learning-events/csv") + override fun uploadCsvFile(@Part part: MultipartBody.Part?): Call +} diff --git a/app/src/main/java/ai/elimu/analytics/task/UploadEventsWorker.kt b/app/src/main/java/ai/elimu/analytics/task/UploadEventsWorker.kt index 8248524b..b56de027 100644 --- a/app/src/main/java/ai/elimu/analytics/task/UploadEventsWorker.kt +++ b/app/src/main/java/ai/elimu/analytics/task/UploadEventsWorker.kt @@ -1,12 +1,8 @@ package ai.elimu.analytics.task import ai.elimu.analytics.BaseApplication -import ai.elimu.analytics.rest.LetterAssessmentEventService -import ai.elimu.analytics.rest.LetterLearningEventService -import ai.elimu.analytics.rest.LetterSoundLearningEventService -import ai.elimu.analytics.rest.StoryBookLearningEventService -import ai.elimu.analytics.rest.WordAssessmentEventService -import ai.elimu.analytics.rest.WordLearningEventService +import ai.elimu.analytics.entity.LearningEventUploadType +import ai.elimu.analytics.entity.toServiceClass import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters @@ -26,70 +22,18 @@ class UploadEventsWorker(context: Context, workerParams: WorkerParameters) : override fun doWork(): Result { Timber.i("doWork") - uploadLetterLearningEvents() - uploadLetterAssessmentEvents() - uploadLetterSoundLearningEvents() - uploadWordLearningEvents() - uploadWordAssessmentEvents() - uploadStoryBookLearningEvents() + uploadLearningEvents(eventType = LearningEventUploadType.LETTER_LEARNING) + uploadLearningEvents(eventType = LearningEventUploadType.LETTER_ASSESSMENT) + uploadLearningEvents(eventType = LearningEventUploadType.LETTER_SOUND_LEARNING) + uploadLearningEvents(eventType = LearningEventUploadType.WORD_LEARNING) + uploadLearningEvents(eventType = LearningEventUploadType.WORD_ASSESSMENT) + uploadLearningEvents(eventType = LearningEventUploadType.STORY_BOOK_LEARNING) return Result.success() } - private fun uploadLetterLearningEvents() { - Timber.i("uploadLetterLearningEvents") - - // Upload CSV files to the server - // Example format: - // files/version-code-3001012/letter-learning-events/7161a85a0e4751cd_3001012_letter-learning-events_2020-03-21.csv - val filesDir = applicationContext.filesDir - for (versionCodeDir in (filesDir.listFiles() ?: emptyArray())) { - Timber.i("versionCodeDir: $versionCodeDir") - if (versionCodeDir.name.startsWith("version-code-")) { - val letterLearningEventsDir = File(versionCodeDir, "letter-learning-events") - Timber.i("Uploading CSV files from $letterLearningEventsDir") - val files = letterLearningEventsDir.listFiles() - if (files != null) { - Timber.i("files.length: " + files.size) - Arrays.sort(files) - for (i in files.indices) { - val file = files[i] - Timber.i("file.getAbsoluteFile(): " + file.absoluteFile) - Timber.i("file.getName(): " + file.name) - - val baseApplication = applicationContext as BaseApplication - val retrofit = baseApplication.retrofit - val letterLearningEventService = retrofit.create( - LetterLearningEventService::class.java - ) - val requestBody = - RequestBody.create(MediaType.parse("multipart/form-data"), file) - val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = letterLearningEventService.uploadCsvFile(part) - Timber.i("call.request(): " + call.request()) - try { - val response = call.execute() - Timber.i("response: $response") - Timber.i("response.isSuccessful(): " + response.isSuccessful) - if (response.isSuccessful) { - val bodyString = response.body()!!.string() - Timber.i("bodyString: $bodyString") - } else { - val errorBodyString = response.errorBody()!!.string() - Timber.e("errorBodyString: $errorBodyString") - // TODO: Handle error - } - } catch (e: IOException) { - Timber.e(e) - } - } - } - } - } - } - - private fun uploadLetterAssessmentEvents() { - Timber.i("uploadLetterAssessmentEvents") + private fun uploadLearningEvents(eventType: LearningEventUploadType) { + Timber.i("uploadLearningEvents: $eventType") // Upload CSV files to the server // Example format: @@ -98,112 +42,7 @@ class UploadEventsWorker(context: Context, workerParams: WorkerParameters) : for (versionCodeDir in filesDir.listFiles() ?: emptyArray()) { Timber.i("versionCodeDir: $versionCodeDir") if (versionCodeDir.name.startsWith("version-code-")) { - val letterAssessmentEventsDir = File(versionCodeDir, "letter-assessment-events") - Timber.i("Uploading CSV files from $letterAssessmentEventsDir") - val files = letterAssessmentEventsDir.listFiles() - if (files != null) { - Timber.i("files.length: " + files.size) - Arrays.sort(files) - for (i in files.indices) { - val file = files[i] - Timber.i("file.getAbsoluteFile(): " + file.absoluteFile) - Timber.i("file.getName(): " + file.name) - - val baseApplication = applicationContext as BaseApplication - val retrofit = baseApplication.retrofit - val letterAssessmentEventService = retrofit.create( - LetterAssessmentEventService::class.java - ) - val requestBody = - RequestBody.create(MediaType.parse("multipart/form-data"), file) - val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = letterAssessmentEventService.uploadCsvFile(part) - Timber.i("call.request(): " + call.request()) - try { - val response = call.execute() - Timber.i("response: $response") - Timber.i("response.isSuccessful(): " + response.isSuccessful) - if (response.isSuccessful) { - val bodyString = response.body()!!.string() - Timber.i("bodyString: $bodyString") - } else { - val errorBodyString = response.errorBody()!!.string() - Timber.e("errorBodyString: $errorBodyString") - // TODO: Handle error - } - } catch (e: IOException) { - Timber.e(e) - } - } - } - } - } - } - - private fun uploadLetterSoundLearningEvents() { - Timber.i("uploadLetterSoundLearningEvents") - - // Upload CSV files to the server - // Example format: - // files/version-code-3001017/letter-sound-learning-events/7161a85a0e4751cd_3001017_letter-sound-learning-events_2023-10-25.csv - val filesDir = applicationContext.filesDir - for (versionCodeDir in filesDir.listFiles() ?: emptyArray()) { - Timber.i("versionCodeDir: $versionCodeDir") - if (versionCodeDir.name.startsWith("version-code-")) { - val letterSoundLearningEventsDir = - File(versionCodeDir, "letter-sound-learning-events") - Timber.i("Uploading CSV files from $letterSoundLearningEventsDir") - val files = letterSoundLearningEventsDir.listFiles() - if (files != null) { - Timber.i("files.length: " + files.size) - Arrays.sort(files) - for (i in files.indices) { - val file = files[i] - Timber.i("file.getAbsoluteFile(): " + file.absoluteFile) - Timber.i("file.getName(): " + file.name) - - val baseApplication = applicationContext as BaseApplication - val retrofit = baseApplication.retrofit - val letterSoundLearningEventService = retrofit.create( - LetterSoundLearningEventService::class.java - ) - val requestBody = - RequestBody.create(MediaType.parse("multipart/form-data"), file) - val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = letterSoundLearningEventService.uploadCsvFile(part) - Timber.i("call.request(): " + call.request()) - try { - val response = call.execute() - Timber.i("response: $response") - Timber.i("response.isSuccessful(): " + response.isSuccessful) - if (response.isSuccessful) { - val bodyString = response.body()!!.string() - Timber.i("bodyString: $bodyString") - } else { - val errorBodyString = response.errorBody()!!.string() - Timber.e("errorBodyString: $errorBodyString") - // TODO: Handle error - } - } catch (e: IOException) { - Timber.e(e) - } - } - } - } - } - } - - private fun uploadWordLearningEvents() { - Timber.i("uploadWordLearningEvents") - - // Upload CSV files to the server - // Example format: - // files/version-code-3001012/word-learning-events/7161a85a0e4751cd_3001012_word-learning-events_2020-03-21.csv - val filesDir = applicationContext.filesDir - for (versionCodeDir in filesDir.listFiles() ?: emptyArray()) { - Timber.i("versionCodeDir: $versionCodeDir") - if (versionCodeDir.name.startsWith("version-code-")) { - val wordLearningEventsDir = File(versionCodeDir, "word-learning-events") + val wordLearningEventsDir = File(versionCodeDir, eventType.type) Timber.i("Uploading CSV files from $wordLearningEventsDir") val files = wordLearningEventsDir.listFiles() if (files != null) { @@ -216,127 +55,22 @@ class UploadEventsWorker(context: Context, workerParams: WorkerParameters) : val baseApplication = applicationContext as BaseApplication val retrofit = baseApplication.retrofit - val wordLearningEventService = retrofit.create( - WordLearningEventService::class.java - ) + val uploadService = retrofit.create(eventType.toServiceClass()) val requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file) val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = wordLearningEventService.uploadCsvFile(part) - Timber.i("call.request(): " + call.request()) - try { - val response = call.execute() - Timber.i("response: $response") - Timber.i("response.isSuccessful(): " + response.isSuccessful) - if (response.isSuccessful) { - val bodyString = response.body()!!.string() - Timber.i("bodyString: $bodyString") - } else { - val errorBodyString = response.errorBody()!!.string() - Timber.e("errorBodyString: $errorBodyString") - // TODO: Handle error - } - } catch (e: IOException) { - Timber.e(e) - } - } - } - } - } - } - - private fun uploadWordAssessmentEvents() { - Timber.i("uploadWordAssessmentEvents") + val call = uploadService.uploadCsvFile(part) - // Upload CSV files to the server - // Example format: - // files/version-code-3001012/word-assessment-events/7161a85a0e4751cd_3001012_word-assessment-events_2020-03-21.csv - val filesDir = applicationContext.filesDir - for (versionCodeDir in filesDir.listFiles() ?: emptyArray()) { - Timber.i("versionCodeDir: $versionCodeDir") - if (versionCodeDir.name.startsWith("version-code-")) { - val wordAssessmentEventsDir = File(versionCodeDir, "word-assessment-events") - Timber.i("Uploading CSV files from $wordAssessmentEventsDir") - val files = wordAssessmentEventsDir.listFiles() - if (files != null) { - Timber.i("files.length: " + files.size) - Arrays.sort(files) - for (i in files.indices) { - val file = files[i] - Timber.i("file.getAbsoluteFile(): " + file.absoluteFile) - Timber.i("file.getName(): " + file.name) - - val baseApplication = applicationContext as BaseApplication - val retrofit = baseApplication.retrofit - val wordAssessmentEventService = retrofit.create( - WordAssessmentEventService::class.java - ) - val requestBody = - RequestBody.create(MediaType.parse("multipart/form-data"), file) - val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = wordAssessmentEventService.uploadCsvFile(part) - Timber.i("call.request(): " + call.request()) - try { - val response = call.execute() - Timber.i("response: $response") - Timber.i("response.isSuccessful(): " + response.isSuccessful) - if (response.isSuccessful) { - val bodyString = response.body()!!.string() - Timber.i("bodyString: $bodyString") - } else { - val errorBodyString = response.errorBody()!!.string() - Timber.e("errorBodyString: $errorBodyString") - // TODO: Handle error - } - } catch (e: IOException) { - Timber.e(e) - } - } - } - } - } - } - - private fun uploadStoryBookLearningEvents() { - Timber.i("uploadStoryBookLearningEvents") - - // Upload CSV files to the server - // Example format: - // files/version-code-3001012/storybook-learning-events/7161a85a0e4751cd_3001012_storybook-learning-events_2020-03-21.csv - val filesDir = applicationContext.filesDir - for (versionCodeDir in filesDir.listFiles() ?: emptyArray()) { - Timber.i("versionCodeDir: $versionCodeDir") - if (versionCodeDir.name.startsWith("version-code-")) { - val storyBookLearningEventsDir = File(versionCodeDir, "storybook-learning-events") - Timber.i("Uploading CSV files from $storyBookLearningEventsDir") - val files = storyBookLearningEventsDir.listFiles() - if (files != null) { - Timber.i("files.length: " + files.size) - Arrays.sort(files) - for (i in files.indices) { - val file = files[i] - Timber.i("file.getAbsoluteFile(): " + file.absoluteFile) - Timber.i("file.getName(): " + file.name) - - val baseApplication = applicationContext as BaseApplication - val retrofit = baseApplication.retrofit - val storyBookLearningEventService = retrofit.create( - StoryBookLearningEventService::class.java - ) - val requestBody = - RequestBody.create(MediaType.parse("multipart/form-data"), file) - val part = MultipartBody.Part.createFormData("file", file.name, requestBody) - val call = storyBookLearningEventService.uploadCsvFile(part) Timber.i("call.request(): " + call.request()) try { val response = call.execute() Timber.i("response: $response") Timber.i("response.isSuccessful(): " + response.isSuccessful) if (response.isSuccessful) { - val bodyString = response.body()!!.string() + val bodyString = response.body()?.string() Timber.i("bodyString: $bodyString") } else { - val errorBodyString = response.errorBody()!!.string() + val errorBodyString = response.errorBody()?.string() Timber.e("errorBodyString: $errorBodyString") // TODO: Handle error }