diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1aeb78aa..47322639 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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" ) } diff --git a/app/src/main/java/eu/darken/capod/common/compression/Zipper.kt b/app/src/main/java/eu/darken/capod/common/compression/Zipper.kt index cc5e3ee8..ea282e8d 100644 --- a/app/src/main/java/eu/darken/capod/common/compression/Zipper.kt +++ b/app/src/main/java/eu/darken/capod/common/compression/Zipper.kt @@ -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, zipFile: String) { + fun zip(files: List, 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 } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/darken/capod/common/debug/recording/core/DebugLogZipper.kt b/app/src/main/java/eu/darken/capod/common/debug/recording/core/DebugLogZipper.kt index ea5b2eb1..f8fe69aa 100644 --- a/app/src/main/java/eu/darken/capod/common/debug/recording/core/DebugLogZipper.kt +++ b/app/src/main/java/eu/darken/capod/common/debug/recording/core/DebugLogZipper.kt @@ -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(), diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt index 7596bd79..9d4d28d5 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/SettingsScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/SettingsScreen.kt index 477044ba..a87d2acb 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/SettingsScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/acks/AcknowledgementsScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/acks/AcknowledgementsScreen.kt index 92d29645..8e80285e 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/acks/AcknowledgementsScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/acks/AcknowledgementsScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsScreen.kt index 3c280373..d6fb0e77 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/general/GeneralSettingsScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/general/debug/DebugSettingsScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/general/debug/DebugSettingsScreen.kt index 1491ced6..1a34f653 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/general/debug/DebugSettingsScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/general/debug/DebugSettingsScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/support/SupportScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/support/SupportScreen.kt index ad85dcc4..61e28677 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/support/SupportScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/support/SupportScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/settings/support/contactform/ContactFormScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/settings/support/contactform/ContactFormScreen.kt index 0fd9fded..ea25e312 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/settings/support/contactform/ContactFormScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/settings/support/contactform/ContactFormScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/main/ui/widget/WidgetConfigurationScreen.kt b/app/src/main/java/eu/darken/capod/main/ui/widget/WidgetConfigurationScreen.kt index 4f8562f8..91e27a7c 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/widget/WidgetConfigurationScreen.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/widget/WidgetConfigurationScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/profiles/ui/DeviceManagerScreen.kt b/app/src/main/java/eu/darken/capod/profiles/ui/DeviceManagerScreen.kt index 1079439c..7cb1aa39 100644 --- a/app/src/main/java/eu/darken/capod/profiles/ui/DeviceManagerScreen.kt +++ b/app/src/main/java/eu/darken/capod/profiles/ui/DeviceManagerScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/profiles/ui/creation/DeviceProfileCreationScreen.kt b/app/src/main/java/eu/darken/capod/profiles/ui/creation/DeviceProfileCreationScreen.kt index e88a3fc9..d752c456 100644 --- a/app/src/main/java/eu/darken/capod/profiles/ui/creation/DeviceProfileCreationScreen.kt +++ b/app/src/main/java/eu/darken/capod/profiles/ui/creation/DeviceProfileCreationScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/reaction/ui/ReactionSettingsScreen.kt b/app/src/main/java/eu/darken/capod/reaction/ui/ReactionSettingsScreen.kt index fd497720..4b095863 100644 --- a/app/src/main/java/eu/darken/capod/reaction/ui/ReactionSettingsScreen.kt +++ b/app/src/main/java/eu/darken/capod/reaction/ui/ReactionSettingsScreen.kt @@ -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, diff --git a/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterScreen.kt b/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterScreen.kt index 614687d9..a8f08909 100644 --- a/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterScreen.kt +++ b/app/src/main/java/eu/darken/capod/troubleshooter/ui/TroubleShooterScreen.kt @@ -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, diff --git a/app/src/test/java/eu/darken/capod/common/compression/ZipperTest.kt b/app/src/test/java/eu/darken/capod/common/compression/ZipperTest.kt index 08b66e70..892253e8 100644 --- a/app/src/test/java/eu/darken/capod/common/compression/ZipperTest.kt +++ b/app/src/test/java/eu/darken/capod/common/compression/ZipperTest.kt @@ -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 { - Zipper().zip(arrayOf(missing), zipPath) + Zipper().zip(listOf(missing), zipPath) } } }