sample/src/main/java/com/geekorum/aboutoss/sampleapp/CustomViewer.kt
author Da Risk <da_risk@geekorum.com>
Tue, 22 Apr 2025 14:19:23 -0400
changeset 34 ce299aacc068
parent 18 ac393491d2eb
permissions -rw-r--r--
build: update license headers
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
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    33
import androidx.lifecycle.viewmodel.compose.viewModel
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    34
import com.geekorum.aboutoss.ui.common.OpenSourceLicensesViewModel
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    37
fun CustomViewer(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    38
    viewModel: OpenSourceLicensesViewModel = viewModel(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    39
        initializer = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
            createPrebuildOpenSourceLicensesViewModel()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    41
        }
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
    modifier: Modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    44
) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    45
    Column(modifier = modifier) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    46
        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
    47
        DependenciesGrid(viewModel, Modifier.padding(top = 16.dp))
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    48
    }
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
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    52
private fun DependenciesGrid(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    53
    viewModel: OpenSourceLicensesViewModel,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    54
    modifier: Modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    55
) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    56
    val dependencies by viewModel.dependenciesList.collectAsState(initial = emptyList())
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    57
    var selected by remember { mutableStateOf(-1) }
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    58
    LazyVerticalGrid(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    59
        GridCells.Adaptive(150.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    60
        horizontalArrangement = Arrangement.spacedBy(16.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    61
        verticalArrangement = Arrangement.spacedBy(16.dp),
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    62
        modifier = modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    63
    ) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    64
        itemsIndexed(dependencies) { idx, dependency ->
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    65
            if (idx == selected) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    66
                val license by viewModel.getLicenseDependency(dependency)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    67
                    .collectAsState(initial = "")
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    68
                LicenseCard(license, onClick = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    69
                    selected = -1
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    70
                })
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    71
            } else {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    72
                DependencyCard(dependency, onClick = {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    73
                    selected = idx
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    74
                })
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
@OptIn(ExperimentalMaterial3Api::class)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    81
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    82
private fun LicenseCard(license: String, onClick: () -> Unit) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    83
    Card(modifier = Modifier.size(150.dp), onClick = onClick,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    84
        colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primary)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    85
    ) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    86
        Text(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    87
            license, style = MaterialTheme.typography.bodyMedium,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    88
            modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    89
                .padding(16.dp)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    90
                .fillMaxSize()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    91
                .wrapContentSize(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    92
                    Alignment.Center
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    93
                )
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
@OptIn(ExperimentalMaterial3Api::class)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    99
@Composable
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   100
private fun DependencyCard(dependency: String, onClick: () -> Unit) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   101
    Card(modifier = Modifier.size(150.dp), onClick = onClick) {
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   102
        Text(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   103
            dependency,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   104
            style = MaterialTheme.typography.titleLarge,
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   105
            modifier = Modifier
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   106
                .padding(16.dp)
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   107
                .fillMaxSize()
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   108
                .wrapContentSize(
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   109
                    Alignment.Center
ac393491d2eb sample: complete sample application
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
   110
                )
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
}