DonauStatementFragment.kt (4186B)
1 /* 2 * This file is part of GNU Taler 3 * (C) 2025 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.wallet.donau 18 19 import android.os.Bundle 20 import android.view.LayoutInflater 21 import android.view.View 22 import android.view.ViewGroup 23 import androidx.appcompat.app.AppCompatActivity 24 import androidx.compose.foundation.layout.fillMaxSize 25 import androidx.compose.foundation.rememberScrollState 26 import androidx.compose.foundation.verticalScroll 27 import androidx.compose.runtime.LaunchedEffect 28 import androidx.compose.runtime.getValue 29 import androidx.compose.runtime.livedata.observeAsState 30 import androidx.compose.runtime.mutableIntStateOf 31 import androidx.compose.runtime.saveable.rememberSaveable 32 import androidx.compose.runtime.setValue 33 import androidx.compose.ui.Modifier 34 import androidx.compose.ui.platform.ComposeView 35 import androidx.fragment.app.Fragment 36 import androidx.fragment.app.activityViewModels 37 import net.taler.wallet.main.MainViewModel 38 import net.taler.wallet.R 39 import net.taler.wallet.compose.EmptyComposable 40 import net.taler.wallet.compose.ErrorComposable 41 import net.taler.wallet.compose.LoadingScreen 42 import net.taler.wallet.compose.TalerSurface 43 import net.taler.wallet.compose.collectAsStateLifecycleAware 44 45 class DonauStatementFragment: Fragment() { 46 private val model: MainViewModel by activityViewModels() 47 48 private lateinit var host: String 49 50 override fun onCreateView( 51 inflater: LayoutInflater, 52 container: ViewGroup?, 53 savedInstanceState: Bundle? 54 ): View? = ComposeView(requireContext()).apply { 55 host = arguments?.getString("host") 56 ?: error("no host provided") 57 58 val supportActionBar = (requireActivity() as? AppCompatActivity) 59 ?.supportActionBar 60 61 setContent { 62 TalerSurface { 63 val status by model.donauManager.donauStatementsStatus.collectAsStateLifecycleAware() 64 val devMode by model.devMode.observeAsState(false) 65 when (val s = status) { 66 is GetDonauStatementsStatus.None, 67 is GetDonauStatementsStatus.Loading -> LoadingScreen() 68 69 is GetDonauStatementsStatus.Error -> ErrorComposable( 70 error = s.error, 71 modifier = Modifier 72 .fillMaxSize() 73 .verticalScroll(rememberScrollState()), 74 devMode = devMode, 75 ) 76 77 is GetDonauStatementsStatus.Success -> if (s.statements.isEmpty()) { 78 EmptyComposable() 79 } else { 80 var selectedIndex by rememberSaveable { mutableIntStateOf(0) } 81 DonauStatementComposable( 82 statements = s.statements, 83 selectedIndex = selectedIndex, 84 ) { index -> 85 selectedIndex = index 86 } 87 88 LaunchedEffect(selectedIndex) { 89 supportActionBar?.title = getString( 90 R.string.donau_statement_title_year, 91 s.statements[selectedIndex].year, 92 ) 93 } 94 } 95 } 96 } 97 } 98 } 99 100 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 101 super.onViewCreated(view, savedInstanceState) 102 model.donauManager.getDonauStatements(host) 103 } 104 }