guess-It-SDP/guessIt

View on GitHub
app/src/main/java/com/github/freeman/bootcamp/games/guessit/DisplayRecapsActivity.kt

Summary

Maintainability
C
7 hrs
Test Coverage
A
93%
package com.github.freeman.bootcamp.games.guessit

import android.app.Activity
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import android.os.Bundle
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.VerticalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Surface
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.github.freeman.bootcamp.MainMenuButton
import com.github.freeman.bootcamp.R
import com.github.freeman.bootcamp.ui.theme.BootcampComposeTheme
import java.io.File

/**
 * Creates an activity where a user can see the game recaps stored in the device
 */
class DisplayRecapsActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            val context = LocalContext.current
            val videoDir = File(context.getExternalFilesDir(null), context.getString(R.string.game_recaps_local_path))
            val videos = videoDir.listFiles()

            BootcampComposeTheme {
                Surface (modifier = Modifier
                    .background(color = MaterialTheme.colorScheme.background)
                    .fillMaxSize()) {
                    Column(modifier = Modifier.background(color = MaterialTheme.colorScheme.background)) {
                        TopAppbarDisplayRecaps()
                        VideoGallery(videos = videos)
                    }
                }
            }
        }
    }
}

@Composable
fun TopAppbarDisplayRecaps(context: Context = LocalContext.current) {

    TopAppBar(
        modifier = Modifier.testTag("topAppbarDisplayRecaps"),
        title = {
            Text(
                text = "Recaps",
                maxLines = 1,
                overflow = TextOverflow.Ellipsis,
                style = MaterialTheme.typography.titleMedium,
                color = MaterialTheme.colorScheme.primary,
                fontSize = 20.sp
            )
        },
        backgroundColor = MaterialTheme.colorScheme.background,
        elevation = 4.dp,
        navigationIcon = {
            IconButton(onClick = {
                val activity = (context as? Activity)
                activity?.finish()
            }) {
                Icon(
                    Icons.Filled.ArrowBack,
                    contentDescription = "Go back",
                    tint = MaterialTheme.colorScheme.primary
                )
            }
        }
    )
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun VideoGallery(videos: Array<File>?) {
    val pagerState = rememberPagerState()
    val context = LocalContext.current

    if (videos != null) {
        Box(
            modifier = Modifier
                .padding(5.dp)
                .background(color = MaterialTheme.colorScheme.background)
                .testTag("videoGallery")
        ) {
            Column {
                VerticalPager(
                    modifier = Modifier
                        .background(color = MaterialTheme.colorScheme.background),
                    pageCount = videos.size,
                    state = pagerState
                ) { page ->
                    if (page < videos.size) {
                        val videoFile = videos[page]
                        val videoUri = videoFile.absolutePath
                        Box(
                            modifier = Modifier
                                .padding(16.dp)
                                .fillMaxWidth()
                                .background(
                                    MaterialTheme.colorScheme.primaryContainer,
                                    shape = RoundedCornerShape(16.dp)
                                )
                                .padding(16.dp)
                        ) {
                            Column {
                                RecapPreview(
                                    videoUrl = videoUri
                                )
                                MainMenuButton(
                                    testTag = "shareRecap",
                                    onClick = { shareVideo(context, videoFile) },
                                    text = context.getString(R.string.share_recap),
                                    icon = Icons.Filled.Share
                                )
                            }
                        }
                    }
                }
            }
        }
    }
}