sample/src/commonMain/kotlin/CustomViewer.kt
author Da Risk <da_risk@geekorum.com>
Wed, 29 Oct 2025 14:07:32 -0400
changeset 109 f845a7194993
parent 99 d2a4e0ffd8e9
permissions -rw-r--r--
build: update to kotlin-2.2.21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     1
/*
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     2
 * AboutOss is an utility library to retrieve and display
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     3
 * opensource licenses in Android applications.
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     4
 *
34
ce299aacc068 build: update license headers
Da Risk <da_risk@geekorum.com>
parents: 18
diff changeset
     5
 * Copyright (C) 2023-2025 by Frederic-Charles Barthelery.
18
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     6
 *
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     7
 * This file is part of AboutOss.
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     8
 *
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     9
 * AboutOss is free software: you can redistribute it and/or modify
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    10
 * it under the terms of the GNU General Public License as published by
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    11
 * the Free Software Foundation, either version 3 of the License, or
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    12
 * (at your option) any later version.
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    13
 *
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    14
 * AboutOss is distributed in the hope that it will be useful,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    17
 * GNU General Public License for more details.
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    18
 *
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    19
 * You should have received a copy of the GNU General Public License
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    20
 * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    21
 */
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    22
package com.geekorum.aboutoss.sampleapp
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    23
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    24
import androidx.compose.foundation.layout.*
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    25
import androidx.compose.foundation.lazy.grid.GridCells
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    26
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    27
import androidx.compose.foundation.lazy.grid.itemsIndexed
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    28
import androidx.compose.material3.*
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    29
import androidx.compose.runtime.*
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    30
import androidx.compose.ui.Alignment
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    31
import androidx.compose.ui.Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    32
import androidx.compose.ui.unit.dp
99
d2a4e0ffd8e9 sample: use collectAsStateWithLifecycle()
Da Risk <da_risk@geekorum.com>
parents: 47
diff changeset
    33
import androidx.lifecycle.compose.collectAsStateWithLifecycle
18
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    34
import androidx.lifecycle.viewmodel.compose.viewModel
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
import com.geekorum.aboutoss.ui.common.OpenSourceLicensesViewModel
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    37
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    38
fun CustomViewer(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    39
    viewModel: OpenSourceLicensesViewModel = viewModel(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
        initializer = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    41
            createPrebuildOpenSourceLicensesViewModel()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    42
        }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    43
    ),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    44
    modifier: Modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    45
) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    46
    Column(modifier = modifier) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    47
        Text("This section shows our you can use a custom ui to display licenses")
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    48
        DependenciesGrid(viewModel, Modifier.padding(top = 16.dp))
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    49
    }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    50
}
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    51
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    52
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    53
private fun DependenciesGrid(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    54
    viewModel: OpenSourceLicensesViewModel,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    55
    modifier: Modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    56
) {
99
d2a4e0ffd8e9 sample: use collectAsStateWithLifecycle()
Da Risk <da_risk@geekorum.com>
parents: 47
diff changeset
    57
    val dependencies by viewModel.dependenciesList.collectAsStateWithLifecycle(emptyList())
18
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    58
    var selected by remember { mutableStateOf(-1) }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    59
    LazyVerticalGrid(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    60
        GridCells.Adaptive(150.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    61
        horizontalArrangement = Arrangement.spacedBy(16.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    62
        verticalArrangement = Arrangement.spacedBy(16.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    63
        modifier = modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    64
    ) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    65
        itemsIndexed(dependencies) { idx, dependency ->
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    66
            if (idx == selected) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    67
                val license by viewModel.getLicenseDependency(dependency)
99
d2a4e0ffd8e9 sample: use collectAsStateWithLifecycle()
Da Risk <da_risk@geekorum.com>
parents: 47
diff changeset
    68
                    .collectAsStateWithLifecycle("")
18
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    69
                LicenseCard(license, onClick = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    70
                    selected = -1
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    71
                })
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    72
            } else {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    73
                DependencyCard(dependency, onClick = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    74
                    selected = idx
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    75
                })
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    76
            }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    77
        }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    78
    }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    79
}
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    80
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    81
@OptIn(ExperimentalMaterial3Api::class)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    82
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    83
private fun LicenseCard(license: String, onClick: () -> Unit) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    84
    Card(modifier = Modifier.size(150.dp), onClick = onClick,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    85
        colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primary)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    86
    ) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    87
        Text(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    88
            license, style = MaterialTheme.typography.bodyMedium,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    89
            modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    90
                .padding(16.dp)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    91
                .fillMaxSize()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    92
                .wrapContentSize(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    93
                    Alignment.Center
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    94
                )
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    95
        )
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    96
    }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    97
}
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    98
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    99
@OptIn(ExperimentalMaterial3Api::class)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   100
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   101
private fun DependencyCard(dependency: String, onClick: () -> Unit) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   102
    Card(modifier = Modifier.size(150.dp), onClick = onClick) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   103
        Text(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   104
            dependency,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   105
            style = MaterialTheme.typography.titleLarge,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   106
            modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   107
                .padding(16.dp)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   108
                .fillMaxSize()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   109
                .wrapContentSize(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   110
                    Alignment.Center
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   111
                )
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   112
        )
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   113
    }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   114
}