MainViewModel.kt
/*
* This file is part of GNU Taler
* (C) 2020 Taler Systems S.A.
*
* GNU Taler is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3, or (at your option) any later version.
*
* GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
package net.taler.merchantpos
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import net.taler.common.createDefaultHttpClient
import net.taler.merchantlib.MerchantApi
import net.taler.merchantpos.checkout.CheckoutManager
import net.taler.merchantpos.checkout.CheckoutStore
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.config.LocalNetworkAccess
import net.taler.merchantpos.devices.TalerBluetoothDevice
import net.taler.merchantpos.devices.TalerUsbDevices
import net.taler.merchantpos.history.HistoryManager
import net.taler.merchantpos.order.OrderManager
import net.taler.merchantpos.payment.PaymentManager
import net.taler.merchantpos.paymentoptions.PaymentOptionsManager
import net.taler.merchantpos.paymentoptions.PaymentOptionsRegistry
import net.taler.merchantpos.refund.RefundManager
import java.io.File
import io.ktor.client.statement.HttpResponsePipeline
import io.ktor.http.HttpHeaders
import io.ktor.http.HttpStatusCode
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
class MainViewModel(
app: Application,
) : AndroidViewModel(app)
{
// This client owns callbacks into this ViewModel and is closed in onCleared().
private val httpClient = createDefaultHttpClient(followRedirect = true)
private val api = MerchantApi(httpClient)
val orderManager = OrderManager(app)
val talerUsb = TalerUsbDevices(app)
val talerBluetooth = TalerBluetoothDevice(app)
val paymentOptions = PaymentOptionsManager(app, PaymentOptionsRegistry.create(app, talerUsb, talerBluetooth))
val localNetworkAccess = LocalNetworkAccess(app)
val configManager =
ConfigManager(app, viewModelScope, httpClient, beforeConnection = localNetworkAccess::ensureAccess).apply {
addConfigurationReceiver(orderManager)
}
val paymentManager = PaymentManager(app, configManager, viewModelScope, api)
val historyManager = HistoryManager(configManager, viewModelScope, api)
val refundManager = RefundManager(configManager, viewModelScope, api)
val checkoutManager =
CheckoutManager(
store = CheckoutStore(File(app.filesDir, "checkouts.json")),
api = api,
configManager = configManager,
paymentOptions = paymentOptions,
orderManager = orderManager,
)
init
{
httpClient.responsePipeline.intercept(HttpResponsePipeline.Transform) { _ ->
if (context.response.status == HttpStatusCode.Unauthorized)
{
withContext(Dispatchers.Main.immediate) {
configManager.handleUnauthorized(
context.request.url.toString(),
context.request.headers[HttpHeaders.Authorization],
)
}
}
proceedWith(subject)
}
}
override fun onCleared()
{
talerUsb.close()
talerBluetooth.close()
httpClient.close()
}
}