taler-android

Android apps for GNU Taler (wallet, PoS, cashier)
Log | Files | Refs | README | LICENSE

ConfigFetcherFragment.kt (3883B)


      1 /*
      2  * This file is part of GNU Taler
      3  * (C) 2020 Taler Systems S.A.
      4  *
      5  * GNU Taler is free software; you can redistribute it and/or modify it under the
      6  * terms of the GNU General Public License as published by the Free Software
      7  * Foundation; either version 3, or (at your option) any later version.
      8  *
      9  * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
     10  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11  * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License along with
     14  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15  */
     16 
     17 package net.taler.merchantpos.config
     18 
     19 import android.os.Bundle
     20 import androidx.compose.foundation.layout.Arrangement
     21 import androidx.compose.foundation.layout.Column
     22 import androidx.compose.foundation.layout.fillMaxSize
     23 import androidx.compose.foundation.layout.padding
     24 import androidx.compose.material3.CircularProgressIndicator
     25 import androidx.compose.material3.MaterialTheme
     26 import androidx.compose.material3.Text
     27 import androidx.compose.runtime.Composable
     28 import androidx.compose.ui.Alignment
     29 import androidx.compose.ui.Modifier
     30 import androidx.compose.ui.platform.ComposeView
     31 import androidx.compose.ui.platform.ViewCompositionStrategy
     32 import androidx.compose.ui.res.stringResource
     33 import androidx.compose.ui.unit.dp
     34 import androidx.fragment.app.Fragment
     35 import androidx.fragment.app.activityViewModels
     36 import net.taler.merchantpos.MainViewModel
     37 import net.taler.merchantpos.MainActivity
     38 import net.taler.merchantpos.PosDestination
     39 import net.taler.merchantpos.R
     40 import net.taler.merchantpos.compose.PosTheme
     41 import net.taler.merchantpos.showPosError
     42 
     43 class ConfigFetcherFragment : Fragment() {
     44 
     45     private val model: MainViewModel by activityViewModels()
     46     private val configManager by lazy { model.configManager }
     47 
     48     private var navigating = false
     49 
     50     override fun onCreateView(
     51         inflater: android.view.LayoutInflater,
     52         container: android.view.ViewGroup?,
     53         savedInstanceState: Bundle?,
     54     ) = ComposeView(requireContext()).apply {
     55         setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
     56         setContent {
     57             ConfigFetcherScreen()
     58         }
     59     }
     60 
     61     override fun onViewCreated(view: android.view.View, savedInstanceState: Bundle?) {
     62         if (configManager.config.savePassword()) {
     63             configManager.fetchConfig(configManager.config, true)
     64         } else if (!navigating) {
     65             navigating = true
     66             (requireActivity() as MainActivity).navigateTo(PosDestination.Config, clearBackStack = true)
     67         }
     68 
     69         configManager.configUpdateResult.observe(viewLifecycleOwner) { result ->
     70             when (result) {
     71                 null -> return@observe
     72                 is ConfigUpdateResult.Error -> {
     73                     requireActivity().showPosError(result.msg)
     74                 }
     75 
     76                 is ConfigUpdateResult.Success -> {
     77                     if (!navigating) {
     78                         navigating = true
     79                         (requireActivity() as MainActivity).navigateToInitialOrderScreen()
     80                     }
     81                 }
     82             }
     83         }
     84     }
     85 }
     86 
     87 @Composable
     88 private fun ConfigFetcherScreen() {
     89     PosTheme {
     90         Column(
     91             modifier = Modifier
     92                 .fillMaxSize()
     93                 .padding(24.dp),
     94             horizontalAlignment = Alignment.CenterHorizontally,
     95             verticalArrangement = Arrangement.Top,
     96         ) {
     97             CircularProgressIndicator()
     98             Text(
     99                 text = stringResource(R.string.config_fetching),
    100                 modifier = Modifier.padding(top = 16.dp),
    101                 style = MaterialTheme.typography.titleMedium,
    102             )
    103         }
    104     }
    105 }