1package com.peachpasswords.feedback23import com.peachpasswords.BuildConfig4import kotlinx.coroutines.Dispatchers5import kotlinx.coroutines.withContext6import okhttp3.MediaType.Companion.toMediaType7import okhttp3.OkHttpClient8import okhttp3.Request9import okhttp3.RequestBody.Companion.toRequestBody10import org.json.JSONObject11import javax.inject.Inject12import javax.inject.Singleton131415161718192021222324252627class FeedbackUnavailableException : Exception("feedback_endpoint_not_configured")2829@Singleton30class FeedbackRepository @Inject constructor() {3132 private val client: OkHttpClient by lazy { OkHttpClient() }3334 suspend fun submit(type: String, message: String) {35 if (message.isBlank()) throw IllegalArgumentException("message_empty")3637 38 if (FEEDBACK_ENDPOINT.isBlank()) throw FeedbackUnavailableException()3940 withContext(Dispatchers.IO) {41 val payload = JSONObject().apply {42 put("category", type)43 put("message", message)44 put("version", BuildConfig.VERSION_NAME)45 put("browser", "android")46 put("source", "peach-android")47 }48 val body = payload.toString().toRequestBody(JSON)49 val request = Request.Builder()50 .url(FEEDBACK_ENDPOINT)51 .post(body)52 .build()53 client.newCall(request).execute().use { res ->54 if (!res.isSuccessful) throw java.io.IOException("HTTP ${res.code}")55 }56 }57 }5859 companion object {60 61 62 63 const val FEEDBACK_ENDPOINT: String = ""6465 private val JSON = "application/json; charset=utf-8".toMediaType()66 }67}