chore: Use List in Zipper and add global ExperimentalMaterial3Api opt-in

Replace Array<String> with List<String> in Zipper.zip().

Add global -opt-in flag for ExperimentalMaterial3Api in build.gradle.kts

and remove per-file @OptIn annotations from 12 Compose screens.
This commit is contained in:
darken
2026-03-09 04:53:01 +00:00
committed by Matthias Urhahn
parent fd0dc49396
commit a76e43ac04
16 changed files with 16 additions and 40 deletions
+1
View File
@@ -118,6 +118,7 @@ android {
"-opt-in=kotlin.time.ExperimentalTime",
"-opt-in=kotlin.RequiresOptIn",
"-opt-in=kotlin.ExperimentalUnsignedTypes",
"-opt-in=androidx.compose.material3.ExperimentalMaterial3Api",
"-Xannotation-default-target=param-property"
)
}
@@ -10,17 +10,16 @@ import java.io.FileOutputStream
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
// https://stackoverflow.com/a/48598099/1251958
class Zipper {
@Throws(Exception::class)
fun zip(files: Array<String>, zipFile: String) {
fun zip(files: List<String>, zipFile: String) {
ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use { out ->
for (i in files.indices) {
log(TAG, VERBOSE) { "Compressing ${files[i]} into $zipFile" }
val origin = BufferedInputStream(FileInputStream(files[i]), BUFFER)
for (file in files) {
log(TAG, VERBOSE) { "Compressing $file into $zipFile" }
val origin = BufferedInputStream(FileInputStream(file), BUFFER)
val entry = ZipEntry(files[i].substring(files[i].lastIndexOf("/") + 1))
val entry = ZipEntry(file.substring(file.lastIndexOf("/") + 1))
out.putNextEntry(entry)
origin.use { input -> input.copyTo(out) }
@@ -33,4 +32,4 @@ class Zipper {
internal val TAG = logTag("Zipper")
const val BUFFER = 2048
}
}
}
@@ -24,7 +24,7 @@ class DebugLogZipper @Inject constructor(
val zipFile = File(logDir.parentFile, "${logDir.name}.zip")
val tempFile = File(logDir.parentFile, "${logDir.name}.zip.tmp")
try {
Zipper().zip(logFiles.map { it.path }.toTypedArray(), tempFile.path)
Zipper().zip(logFiles.map { it.path }, tempFile.path)
try {
Files.move(
tempFile.toPath(),
@@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -133,7 +132,6 @@ fun OverviewScreenHost(vm: OverviewViewModel = hiltViewModel()) {
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun OverviewScreen(
state: OverviewViewModel.State,
@@ -12,7 +12,6 @@ import androidx.compose.material.icons.twotone.Settings
import androidx.compose.material.icons.twotone.SupportAgent
import androidx.compose.material.icons.twotone.Translate
import androidx.compose.material.icons.twotone.Widgets
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
@@ -60,7 +59,6 @@ fun SettingsScreenHost(vm: SettingsViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(
state: SettingsViewModel.State,
@@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.twotone.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
@@ -33,7 +32,6 @@ fun AcknowledgementsScreenHost(vm: AcknowledgementsViewModel = hiltViewModel())
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AcknowledgementsScreen(
onNavigateUp: () -> Unit,
@@ -23,7 +23,6 @@ import androidx.compose.material.icons.twotone.Palette
import androidx.compose.material.icons.twotone.SettingsBluetooth
import androidx.compose.material.icons.automirrored.twotone.ViewList
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -87,7 +86,6 @@ fun GeneralSettingsScreenHost(vm: GeneralSettingsViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun GeneralSettingsScreen(
state: GeneralSettingsViewModel.State,
@@ -7,7 +7,6 @@ import androidx.compose.material.icons.automirrored.twotone.ArrowBack
import androidx.compose.material.icons.twotone.BugReport
import androidx.compose.material.icons.twotone.DataArray
import androidx.compose.material.icons.twotone.DevicesOther
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
@@ -45,7 +44,6 @@ fun DebugSettingsScreenHost(vm: DebugSettingsViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DebugSettingsScreen(
state: DebugSettingsViewModel.State,
@@ -26,7 +26,6 @@ import androidx.compose.material.icons.twotone.FiberManualRecord
import androidx.compose.material.icons.twotone.Settings
import androidx.compose.material.icons.twotone.Warning
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -170,7 +169,6 @@ private fun ShortRecordingWarningDialog(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SupportScreen(
state: SupportViewModel.State,
@@ -312,7 +310,6 @@ fun SupportScreen(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DebugSessionsBottomSheet(
sessions: List<DebugSession>,
@@ -26,7 +26,6 @@ import androidx.compose.material.icons.twotone.Email
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilterChip
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -154,7 +153,7 @@ fun ContactFormScreenHost(vm: ContactFormViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun ContactFormScreen(
state: ContactFormViewModel.State,
@@ -44,7 +44,6 @@ import androidx.compose.material.icons.twotone.Tune
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.Icon
@@ -81,7 +80,7 @@ import eu.darken.capod.common.compose.preview.MockPodDataProvider
import eu.darken.capod.pods.core.PodDevice
import eu.darken.capod.profiles.core.DeviceProfile
@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class)
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun WidgetConfigurationScreen(
state: WidgetConfigurationViewModel.State,
@@ -18,7 +18,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.twotone.ArrowBack
import androidx.compose.material.icons.twotone.Add
import androidx.compose.material3.Card
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -61,7 +60,6 @@ fun DeviceManagerScreenHost(vm: DeviceManagerViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DeviceManagerScreen(
state: DeviceManagerViewModel.State,
@@ -24,7 +24,6 @@ import androidx.compose.material.icons.twotone.SettingsInputAntenna
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.HorizontalDivider
@@ -138,7 +137,6 @@ fun DeviceProfileCreationScreenHost(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun DeviceProfileCreationScreen(
state: DeviceProfileCreationViewModel.State,
@@ -292,7 +290,6 @@ private fun ProfileSectionCard(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun DeviceInfoCard(
name: String,
@@ -19,7 +19,6 @@ import androidx.compose.material.icons.twotone.Stars
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.twotone.Workspaces
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -72,7 +71,6 @@ fun ReactionSettingsScreenHost(vm: ReactionSettingsViewModel = hiltViewModel())
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ReactionSettingsScreen(
state: ReactionSettingsViewModel.State,
@@ -15,7 +15,6 @@ import androidx.compose.material.icons.automirrored.twotone.ArrowBack
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -52,7 +51,6 @@ fun TroubleShooterScreenHost(vm: TroubleShooterViewModel = hiltViewModel()) {
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TroubleShooterScreen(
state: TroubleShooterViewModel.State,
@@ -29,7 +29,7 @@ class ZipperTest : BaseTest() {
val file2 = createFile("b.txt", "world")
val zipPath = File(tempDir, "out.zip").path
Zipper().zip(arrayOf(file1.path, file2.path), zipPath)
Zipper().zip(listOf(file1.path, file2.path), zipPath)
val zipFile = File(zipPath)
zipFile.exists() shouldBe true
@@ -42,7 +42,7 @@ class ZipperTest : BaseTest() {
val file2 = createFile("extra.log", "extra content")
val zipPath = File(tempDir, "out.zip").path
Zipper().zip(arrayOf(file1.path, file2.path), zipPath)
Zipper().zip(listOf(file1.path, file2.path), zipPath)
ZipFile(zipPath).use { zf ->
zf.entries().toList().map { it.name } shouldContainExactlyInAnyOrder listOf("core.log", "extra.log")
@@ -57,7 +57,7 @@ class ZipperTest : BaseTest() {
val file2 = createFile("b.txt", content2)
val zipPath = File(tempDir, "out.zip").path
Zipper().zip(arrayOf(file1.path, file2.path), zipPath)
Zipper().zip(listOf(file1.path, file2.path), zipPath)
ZipFile(zipPath).use { zf ->
zf.getInputStream(zf.getEntry("a.txt")).bufferedReader().readText() shouldBe content1
@@ -70,7 +70,7 @@ class ZipperTest : BaseTest() {
val file = createFile("only.txt", "solo")
val zipPath = File(tempDir, "out.zip").path
Zipper().zip(arrayOf(file.path), zipPath)
Zipper().zip(listOf(file.path), zipPath)
ZipFile(zipPath).use { zf ->
zf.entries().toList().map { it.name } shouldBe listOf("only.txt")
@@ -82,7 +82,7 @@ class ZipperTest : BaseTest() {
val file = createFile("empty.txt", "")
val zipPath = File(tempDir, "out.zip").path
Zipper().zip(arrayOf(file.path), zipPath)
Zipper().zip(listOf(file.path), zipPath)
ZipFile(zipPath).use { zf ->
val entry = zf.getEntry("empty.txt")
@@ -96,7 +96,7 @@ class ZipperTest : BaseTest() {
val zipPath = File(tempDir, "out.zip").path
shouldThrow<FileNotFoundException> {
Zipper().zip(arrayOf(missing), zipPath)
Zipper().zip(listOf(missing), zipPath)
}
}
}