From 968a694df91b072cb74d682eff2c828459e702b0 Mon Sep 17 00:00:00 2001 From: Laurent Date: Tue, 26 May 2020 17:25:30 +0200 Subject: [PATCH] Removed retrofit/gson use + fix lint issues --- app/build.gradle | 10 +-- .../android/api/CurrencyConverterApi.kt | 80 ------------------- .../android/api/FreeConverterApi.kt | 51 ++++++++++++ .../ui/fragment/data/BankrollDataFragment.kt | 60 +++++++------- .../ui/fragment/data/EditableDataFragment.kt | 15 +++- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-zh/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- .../pokeranalytics/android/BasicUnitTest.kt | 15 +++- app/standard/release/output.json | 5 -- 17 files changed, 120 insertions(+), 136 deletions(-) delete mode 100644 app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt create mode 100644 app/src/main/java/net/pokeranalytics/android/api/FreeConverterApi.kt delete mode 100644 app/standard/release/output.json diff --git a/app/build.gradle b/app/build.gradle index 58e9e710..eab593d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,7 @@ apply plugin: 'com.google.gms.google-services' // Crashlytics repositories { maven { url 'https://maven.fabric.io/public' } maven { url 'https://jitpack.io' } // required for MPAndroidChart + jcenter() // for kotlin serialization } android { @@ -34,7 +35,7 @@ android { minSdkVersion 23 targetSdkVersion 28 versionCode 85 - versionName "3.0(b1)" + versionName "3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -95,6 +96,7 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1' implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0") // JVM dependency // Android implementation 'androidx.appcompat:appcompat:1.0.2' @@ -103,12 +105,6 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' - // Retrofit - implementation 'com.squareup.retrofit2:retrofit:2.5.0' - implementation 'com.squareup.retrofit2:converter-gson:2.5.0' - implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1' - implementation 'com.google.code.gson:gson:2.8.6' - // Places implementation 'com.google.android.libraries.places:places:1.1.0' diff --git a/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt b/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt deleted file mode 100644 index c7ed6aa8..00000000 --- a/app/src/main/java/net/pokeranalytics/android/api/CurrencyConverterApi.kt +++ /dev/null @@ -1,80 +0,0 @@ -package net.pokeranalytics.android.api - -import android.content.Context -import net.pokeranalytics.android.BuildConfig -import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.retrofit.CurrencyConverterValue -import net.pokeranalytics.android.util.URL -import okhttp3.Interceptor -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Call -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory -import retrofit2.http.GET -import retrofit2.http.Query -import java.util.concurrent.TimeUnit - -/** - * CurrencyCode Converter API - */ -interface CurrencyConverterApi { - - companion object { - - private var currencyConverterApi: CurrencyConverterApi? = null - - fun getApi(context: Context): CurrencyConverterApi? { - - if (currencyConverterApi == null) { - - val serviceEndpoint = URL.API_CURRENCY_CONVERTER - - val httpClient = OkHttpClient.Builder() - - // Logging interceptor - if (BuildConfig.DEBUG) { - val interceptor = HttpLoggingInterceptor() - interceptor.level = HttpLoggingInterceptor.Level.BASIC - httpClient.addInterceptor(interceptor) - } - - // Add headers - val interceptor = Interceptor { chain -> - val original = chain.request() - val originalHttpUrl = original.url() - - val url = originalHttpUrl.newBuilder() - .addQueryParameter("apiKey", context.getString(R.string.currency_converter_api)) - .build() - - val requestBuilder = original.newBuilder() - .url(url) - - chain.proceed(requestBuilder.build()) - } - httpClient.addInterceptor(interceptor) - - val client = httpClient - .readTimeout(60, TimeUnit.SECONDS) - .connectTimeout(60, TimeUnit.SECONDS) - .build() - - val retrofit = Retrofit.Builder() - .addConverterFactory(GsonConverterFactory.create()) - .baseUrl(serviceEndpoint.value) - .client(client) - .build() - - currencyConverterApi = retrofit.create(CurrencyConverterApi::class.java) - } - - return currencyConverterApi - } - - } - - @GET("convert") - fun convert(@Query("q") currencies: String, @Query("compact") compact: String = "ultra"): Call> - -} diff --git a/app/src/main/java/net/pokeranalytics/android/api/FreeConverterApi.kt b/app/src/main/java/net/pokeranalytics/android/api/FreeConverterApi.kt new file mode 100644 index 00000000..430ac621 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/api/FreeConverterApi.kt @@ -0,0 +1,51 @@ +package net.pokeranalytics.android.api + +import android.content.Context +import android.util.JsonReader +import com.android.volley.Request +import com.android.volley.Response +import com.android.volley.VolleyError +import com.android.volley.toolbox.StringRequest +import com.android.volley.toolbox.Volley +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonConfiguration +import timber.log.Timber + + +class FreeConverterApi { + + companion object { + + fun currencyRate(pair: String, context: Context, callback: (Double) -> (Unit)) { + + val queue = Volley.newRequestQueue(context) + val url = "https://free.currconv.com/api/v7/convert?q=${pair}&compact=ultra&apiKey=5ba8d38995282fe8b1c8" + + // https://free.currconv.com/api/v7/convert?q=GBP_USD&compact=ultra&apiKey=5ba8d38995282fe8b1c8 + // { "USD_PHP": 44.1105, "PHP_USD": 0.0227 } + + val stringRequest = StringRequest( + Request.Method.GET, url, + Response.Listener { response -> + + val json = Json(JsonConfiguration.Stable) + val f = json.parseJson(response) + f.jsonObject[pair]?.primitive?.double?.let { rate -> + callback(rate) + } ?: run { + Timber.d("no rate: $response") + } + + }, + Response.ErrorListener { + Timber.d("Api call failed: ${it.message}") + }) + + queue.add(stringRequest) + + } + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt index c0991b3d..e9bc806c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/BankrollDataFragment.kt @@ -6,9 +6,8 @@ import android.content.Intent import android.os.Bundle import android.view.View import net.pokeranalytics.android.R -import net.pokeranalytics.android.api.CurrencyConverterApi +import net.pokeranalytics.android.api.FreeConverterApi import net.pokeranalytics.android.model.realm.Bankroll -import net.pokeranalytics.android.model.retrofit.CurrencyConverterValue import net.pokeranalytics.android.ui.activity.CurrenciesActivity import net.pokeranalytics.android.ui.activity.components.RequestCode import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource @@ -24,13 +23,9 @@ import net.pokeranalytics.android.util.NULL_TEXT import net.pokeranalytics.android.util.UserDefaults import net.pokeranalytics.android.util.extensions.toCurrency import net.pokeranalytics.android.util.extensions.toRate -import retrofit2.Call -import retrofit2.Response -import timber.log.Timber import java.util.* - /** * Custom EditableDataFragment to manage the Bankroll data */ @@ -219,31 +214,38 @@ class BankrollDataFragment : EditableDataFragment(), StaticRowRepresentableDataS this.lastRefreshRateCall = System.currentTimeMillis() val currenciesConverterValue = "${bankroll.currency?.code}_${defaultCurrency.currencyCode}" - val call = CurrencyConverterApi.getApi(requireContext())?.convert(currenciesConverterValue) - call?.enqueue(object : retrofit2.Callback> { - - override fun onResponse(call: Call>, response: Response>) { - response.body()?.let { - it[currenciesConverterValue]?.value?.let { rate -> - Timber.d("rate found = $rate") - onRowValueChanged(rate, BankrollRow.RATE) - } ?: run { - Timber.d("no rate for $currenciesConverterValue") - } - } ?: run { - Timber.d("onResponse> no body in ${response}") - } - isRefreshingRate = false - rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) - } + FreeConverterApi.currencyRate(currenciesConverterValue, requireContext()) { rate -> + onRowValueChanged(rate, BankrollRow.RATE) + isRefreshingRate = false + rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) + } - override fun onFailure(call: Call>, t: Throwable) { - Timber.d("api call failed: ${t.message}") - isRefreshingRate = false - rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) - } - }) +// val call = CurrencyConverterApi.getApi(requireContext())?.convert(currenciesConverterValue) +// call?.enqueue(object : retrofit2.Callback> { +// +// override fun onResponse(call: Call>, response: Response>) { +// response.body()?.let { +// it[currenciesConverterValue]?.value?.let { rate -> +// Timber.d("rate found = $rate") +// onRowValueChanged(rate, BankrollRow.RATE) +// } ?: run { +// Timber.d("no rate for $currenciesConverterValue") +// } +// } ?: run { +// Timber.d("onResponse> no body in ${response}") +// } +// +// isRefreshingRate = false +// rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) +// } +// +// override fun onFailure(call: Call>, t: Throwable) { +// Timber.d("api call failed: ${t.message}") +// isRefreshingRate = false +// rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) +// } +// }) this.isRefreshingRate = true this.rowRepresentableAdapter.refreshRow(BankrollRow.REFRESH_RATE) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt index 5bcc18dc..5577c1f9 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/EditableDataFragment.kt @@ -11,6 +11,7 @@ import kotlinx.android.synthetic.main.fragment_editable_data.* import kotlinx.android.synthetic.main.fragment_editable_data.view.* import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Editable +import net.pokeranalytics.android.model.interfaces.NameManageable import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -87,10 +88,16 @@ open class EditableDataFragment : DataManagerFragment(), RowRepresentableDelegat val liveDataType = this.model.liveDataType - val proxyItem: RealmModel? = - liveDataType.getData(this.getRealm(), this.model.primaryKey) - proxyItem?.let { - this.appBar.toolbar.title = liveDataType.updateEntityLocalizedTitle(requireContext()) + val data: RealmModel? = liveDataType.getData(this.getRealm(), this.model.primaryKey) + data?.let { + + val title = if (it is NameManageable) { + it.name + } else { + liveDataType.updateEntityLocalizedTitle(requireContext()) + } + + this.appBar.toolbar.title = title deleteButtonShouldAppear = true isUpdating = true } ?: run { diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 319569f9..f5ad22d1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -37,7 +37,7 @@ Fortschritt Bericht speichern Wollen Sie mit dem Import der Datei fortfahren? - %s aktualisieren + %s aktualisieren Vergleichsübersicht Der Filter kann nicht gelöscht werden, weil er derzeit ausgewählt ist. Benutzerdefiniertes Feld diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ebeb7ded..c0a43809 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -25,7 +25,7 @@ Progreso Guardar reporte ¿Deseas continuar con la importación del archivo? - Actualizar %s + Actualizar %s Gráfica comparativa El filtro no puede ser eliminado porque está seleccionado actualmente. Campo personalizado diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5c941500..15d52c7d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -54,7 +54,7 @@ Nouveau nom de tournoi Nouvelle propriété de tournoi Nouveau filtre - Mise-à-jour %s + Mise-à-jour %s diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 3b0eb55e..4818fc9a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -25,7 +25,7 @@ प्रगति रिपोर्ट सहेजें क्या आप फाइल इम्पोर्ट करने के साथ आगे बढ़ना चाहते हैं? - अपडेट %s + अपडेट %s तुलना चार्ट फिल्टर हटाया नहीं जा सकता क्योंकि वर्तमान में इसे चुना हुआ है. कस्टम फील्ड diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index af9d9b0f..3af2da9c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -25,7 +25,7 @@ Storico Salva report Procedere con l\'importazione del file? - Aggiorna %s + Aggiorna %s Grafica comparativa Il filtro non può essere eliminato, perché è al momento selezionato. Campo personalizzato diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3afb44b9..8ce15b65 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -25,7 +25,7 @@ 進捗 レポートを保存する ファイルのインポートを続行しますか? - %sを更新する + %sを更新する 比較チャート フィルターは現在選択中のため削除できません。 カスタムフィールド diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index cd20e32d..8ecdb344 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -25,7 +25,7 @@ Progresso Salvar relatório Deseja continuar com a importação do arquivo? - Atualizar %s + Atualizar %s Tabela de comparação O filtro não pode ser excluído porque está selecionado no momento. Campo personalizado diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dac794d9..f66ea55a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -25,7 +25,7 @@ Исполнение Сохранить отчет Хотите продолжить импорт файла? - Обновление %s + Обновление %s Сравнительная диаграмма Фильтр не может быть удален, так как он выбран в данный момент. Пользовательское поле diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 692b3b7a..dac5ee6b 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -25,7 +25,7 @@ 进度 保存报告 要继续导入文件吗? - 更新%s + 更新%s 比较图表 无法删除该筛选条件,因为它目前已被选取。 自定义字段 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 062d6e62..26cc4172 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,7 +37,7 @@ Progress Save Report Do you want to proceed with the file import? - Update %s + Update %s Comparison chart The filter cannot be deleted because it is currently selected. Custom field diff --git a/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt b/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt index 04f2d1fe..c3ffa6c9 100644 --- a/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt +++ b/app/src/test/java/net/pokeranalytics/android/BasicUnitTest.kt @@ -1,8 +1,9 @@ package net.pokeranalytics.android +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonConfiguration import net.pokeranalytics.android.util.CSVNumberFormat import net.pokeranalytics.android.util.Parser -import net.pokeranalytics.android.util.extensions.formatted import net.pokeranalytics.android.util.extensions.kmbFormatted import org.junit.Assert import org.junit.Test @@ -66,4 +67,16 @@ class BasicUnitTest : RealmUnitTest() { Assert.assertEquals("1000", str2) } + @Test + fun testDeserialization() { + val json = Json(JsonConfiguration.Stable) + val f = json.parseJson("""{"a":42}""") + + val v = f.jsonObject["a"]?.primitive?.int + + Assert.assertEquals(true, f.contains("a")) + Assert.assertEquals(false, f.contains("b")) + Assert.assertEquals(42, v) + } + } diff --git a/app/standard/release/output.json b/app/standard/release/output.json deleted file mode 100644 index c113850d..00000000 --- a/app/standard/release/output.json +++ /dev/null @@ -1,5 +0,0 @@ -<<<<<<< HEAD -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":79,"versionName":"3.0","enabled":true,"outputFile":"PokerAnalytics_3.0(79)_200428_1456_release.apk","fullName":"standardRelease","baseName":"standard-release","dirName":""},"path":"PokerAnalytics_3.0(79)_200428_1456_release.apk","properties":{}}] -======= -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":84,"versionName":"2.4.3","enabled":true,"outputFile":"PokerAnalytics_2.4.3(84)_200526_1106_release.apk","fullName":"standardRelease","baseName":"standard-release","dirName":""},"path":"PokerAnalytics_2.4.3(84)_200526_1106_release.apk","properties":{}}] ->>>>>>> master