diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 19c61a06b..7f1663f4d 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -10,7 +10,6 @@ on: - '**' paths-ignore: - '**.md' - - '**.yml' pull_request: branches: - master @@ -42,22 +41,18 @@ jobs: xcode-version: latest-stable - name: Install iOS run: xcodebuild -downloadPlatform iOS - - name: Set Default Scheme - working-directory: ./iosApp - run: | - scheme_list=$(xcodebuild -list -json | tr -d "\n") - default=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['targets'][0]") - echo $default | cat >default - echo Using default scheme: $default + - name: Install XcodeGen + run: brew install xcodegen + - name: Generate Xcode project + run: xcodegen generate --spec iosApp/project.yml - name: Build working-directory: ./iosApp env: - scheme: ${{ 'default' }} + scheme: Flare platform: ${{ 'iOS Simulator' }} run: | # xcrun xctrace returns via stderr, not the expected stdout (see https://developer.apple.com/forums/thread/663959) device=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}' | sed -e "s/ Simulator$//"` - if [ $scheme = default ]; then scheme=$(cat default); fi if [ "`ls -A | grep -i \\.xcworkspace\$`" ]; then filetype_parameter="workspace" && file_to_build="`ls -A | grep -i \\.xcworkspace\$`"; else filetype_parameter="project" && file_to_build="`ls -A | grep -i \\.xcodeproj\$`"; fi file_to_build=`echo $file_to_build | awk '{$1=$1;print}'` xcodebuild build-for-testing -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -destination "platform=$platform,name=iPhone 17" -skipPackagePluginValidation -skipMacroValidation diff --git a/.gitignore b/.gitignore index 1bfe5201c..7be4b923a 100644 --- a/.gitignore +++ b/.gitignore @@ -22,7 +22,6 @@ iosApp/Podfile.lock iosApp/Pods/* iosApp/Flare.xcworkspace/* iosApp/Flare.xcodeproj/* -!iosApp/Flare.xcodeproj/project.pbxproj shared/shared.podspec .kotlin .history diff --git a/README.md b/README.md index f2c85bb6e..5a69af0db 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ Here're some features we're planning to implement in the future. ### iOS - Make sure you have JDK 25 installed - Make sure you have a Mac with Xcode 26 installed + - Install XcodeGen with `brew install xcodegen` + - Run `xcodegen generate --spec iosApp/project.yml` - open `iosApp/Flare.xcodeproj` in Xcode - Build and run the app diff --git a/app/src/main/java/dev/dimension/flare/ui/component/ThemedIcon.kt b/app/src/main/java/dev/dimension/flare/ui/component/ThemedIcon.kt index 310eab015..9862440f0 100644 --- a/app/src/main/java/dev/dimension/flare/ui/component/ThemedIcon.kt +++ b/app/src/main/java/dev/dimension/flare/ui/component/ThemedIcon.kt @@ -26,6 +26,7 @@ private data class ThemedIconTheme( val light: ThemedIconColors, ) +@ConsistentCopyVisibility internal data class ThemeIconData private constructor( private val theme: ThemedIconTheme, ) { diff --git a/desktopApp/build.gradle.kts b/desktopApp/build.gradle.kts index f4e915485..295cd1f04 100644 --- a/desktopApp/build.gradle.kts +++ b/desktopApp/build.gradle.kts @@ -11,7 +11,7 @@ plugins { alias(libs.plugins.kotlin.serialization) alias(libs.plugins.koin.compiler) alias(libs.plugins.nucleus) - id("com.github.gmazzo.buildconfig") version "6.0.9" + id("com.github.gmazzo.buildconfig") version "6.0.10" } dependencies { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1b047faad..01ad59382 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,9 +15,9 @@ core-ktx = "1.19.0" junit = "4.13.2" androidx-test-ext-junit = "1.3.0" espresso-core = "3.7.0" -lifecycle-runtime-ktx = "2.10.0" +lifecycle-runtime-ktx = "2.11.0" activity-compose = "1.13.0" -compose-bom = "2026.05.01" +compose-bom = "2026.06.00" ksp = "2.3.9" koog = "1.0.0" nucleus = "1.15.7" @@ -35,7 +35,7 @@ prettytime = "5.0.9.Final" readability = "1.0.0" reorderable = "3.1.0" richtextUiMaterial3 = "1.0.0-alpha05" -sentry = "8.43.2" +sentry = "8.44.0" twitter-parser = "0.5.9" molecule = "2.2.0" accompanist = "0.37.3" @@ -49,18 +49,18 @@ ksoup = "0.2.6" versionUpdate = "0.54.0" bluesky = "0.3.4-SNAPSHOT" kotlinx-coroutines = "1.11.0" -koin = "4.2.1" +koin = "4.2.2" koin-plugin = "1.0.1" composeIcons = "1.3.0" media3 = "1.10.1" desugar_jdk_libs = "2.1.5" datastore = "1.3.0-alpha09" -firebase-bom = "34.14.1" -google-services = "4.4.4" +firebase-bom = "34.15.0" +google-services = "4.5.0" firebase-crashlytics = "3.0.7" materialKolor = "4.1.1" -room = "3.0.0-alpha06" -sqlite = "2.7.0-alpha06" +room = "3.0.0-rc01" +sqlite = "2.7.0-rc01" compose-multiplatform = "1.11.1" navigation3 = "1.2.0-alpha04" zoomable = "0.19.0" @@ -112,7 +112,7 @@ ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -material3 = { group = "androidx.compose.material3", name = "material3", version = "1.5.0-alpha21" } +material3 = { group = "androidx.compose.material3", name = "material3", version = "1.5.0-alpha22" } material3WindowSizeClass = { group = "androidx.compose.material3", name = "material3-window-size-class" } material3-adaptive-navigation-suite = { group = "androidx.compose.material3", name = "material3-adaptive-navigation-suite" } material3-adaptive = { group = "androidx.compose.material3.adaptive", name = "adaptive" } @@ -230,8 +230,8 @@ qrose = { module = "io.github.alexzhirkevich:qrose", version.ref = "qrose" } androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "navigation3" } androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "navigation3" } -androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version = "1.3.0-beta02" } -androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version = "2.10.0" } +androidx-material3-adaptive-navigation3 = { group = "androidx.compose.material3.adaptive", name = "adaptive-navigation3", version = "1.3.0-rc01" } +androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version = "2.11.0" } cupertino = { group = "io.github.schott12521", name = "cupertino", version.ref = "cupertino" } robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } diff --git a/iosApp/Flare.xcodeproj/project.pbxproj b/iosApp/Flare.xcodeproj/project.pbxproj deleted file mode 100644 index 1e836c9fd..000000000 --- a/iosApp/Flare.xcodeproj/project.pbxproj +++ /dev/null @@ -1,593 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXBuildFile section */ - 06310D712E96120700B6E081 /* VideoPlayer in Frameworks */ = {isa = PBXBuildFile; productRef = 06310D702E96120700B6E081 /* VideoPlayer */; }; - 0646B2622E7151A700535A3E /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 0646B2612E7151A700535A3E /* Kingfisher */; }; - 0672EE122E8689C70092AD1F /* Drops in Frameworks */ = {isa = PBXBuildFile; productRef = 0672EE112E8689C70092AD1F /* Drops */; }; - 068923482E82A80700981D8E /* Flow in Frameworks */ = {isa = PBXBuildFile; productRef = 068923472E82A80700981D8E /* Flow */; }; - 069DA28C2F96716700720BE0 /* CHTCollectionViewWaterfallLayout in Frameworks */ = {isa = PBXBuildFile; productRef = 069DA28B2F96716700720BE0 /* CHTCollectionViewWaterfallLayout */; }; - 069DA4CF2F969C9A00720BE0 /* GSPlayer in Frameworks */ = {isa = PBXBuildFile; productRef = 069DA4CE2F969C9A00720BE0 /* GSPlayer */; }; - 06AB10002FA1000000000001 /* ChatLayout in Frameworks */ = {isa = PBXBuildFile; productRef = 06AB10022FA1000000000001 /* ChatLayout */; }; - 06C6B5482E853AAF00CCD388 /* SwiftUIIntrospect in Frameworks */ = {isa = PBXBuildFile; productRef = 06C6B5472E853AAF00CCD388 /* SwiftUIIntrospect */; }; - 06C7FC172E7D474900A0D01A /* LazyPager in Frameworks */ = {isa = PBXBuildFile; productRef = 06C7FC162E7D474900A0D01A /* LazyPager */; }; - 06F36AAD2E8F7BEC00F5905F /* SwiftUIBackports in Frameworks */ = {isa = PBXBuildFile; productRef = 06F36AAC2E8F7BEC00F5905F /* SwiftUIBackports */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 06E433FE2E6A9A2600CD0826 /* Flare.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flare.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 06E434172E6A9DE000CD0826 /* Exceptions for "Flare" folder in "Flare" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Info.plist, - AppIcon_black.icon, - AppIcon_blue.icon, - AppIcon_cyan.icon, - AppIcon_light_blue.icon, - AppIcon_orange.icon, - AppIcon_red.icon, - AppIcon_teal.icon, - AppIcon_white.icon, - AppIcon_yellow.icon, - ); - target = 06E433FD2E6A9A2600CD0826 /* Flare */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - 06E434002E6A9A2600CD0826 /* Flare */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - 06E434172E6A9DE000CD0826 /* Exceptions for "Flare" folder in "Flare" target */, - ); - path = Flare; - sourceTree = ""; - }; -/* End PBXFileSystemSynchronizedRootGroup section */ - -/* Begin PBXFrameworksBuildPhase section */ - 06E433FB2E6A9A2600CD0826 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 068923482E82A80700981D8E /* Flow in Frameworks */, - 06C7FC172E7D474900A0D01A /* LazyPager in Frameworks */, - 0672EE122E8689C70092AD1F /* Drops in Frameworks */, - 06C6B5482E853AAF00CCD388 /* SwiftUIIntrospect in Frameworks */, - 0646B2622E7151A700535A3E /* Kingfisher in Frameworks */, - 06AB10002FA1000000000001 /* ChatLayout in Frameworks */, - 069DA28C2F96716700720BE0 /* CHTCollectionViewWaterfallLayout in Frameworks */, - 06F36AAD2E8F7BEC00F5905F /* SwiftUIBackports in Frameworks */, - 069DA4CF2F969C9A00720BE0 /* GSPlayer in Frameworks */, - 06310D712E96120700B6E081 /* VideoPlayer in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 06E433F52E6A9A2600CD0826 = { - isa = PBXGroup; - children = ( - 06E434002E6A9A2600CD0826 /* Flare */, - 06E433FF2E6A9A2600CD0826 /* Products */, - ); - sourceTree = ""; - }; - 06E433FF2E6A9A2600CD0826 /* Products */ = { - isa = PBXGroup; - children = ( - 06E433FE2E6A9A2600CD0826 /* Flare.app */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 06E433FD2E6A9A2600CD0826 /* Flare */ = { - isa = PBXNativeTarget; - buildConfigurationList = 06E434092E6A9A2700CD0826 /* Build configuration list for PBXNativeTarget "Flare" */; - buildPhases = ( - 06E434182E6AA19200CD0826 /* Compile Kotlin */, - 06E433FA2E6A9A2600CD0826 /* Sources */, - 06E433FB2E6A9A2600CD0826 /* Frameworks */, - 06E433FC2E6A9A2600CD0826 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 06E434002E6A9A2600CD0826 /* Flare */, - ); - name = Flare; - packageProductDependencies = ( - 0646B2612E7151A700535A3E /* Kingfisher */, - 06C7FC162E7D474900A0D01A /* LazyPager */, - 068923472E82A80700981D8E /* Flow */, - 06C6B5472E853AAF00CCD388 /* SwiftUIIntrospect */, - 0672EE112E8689C70092AD1F /* Drops */, - 06F36AAC2E8F7BEC00F5905F /* SwiftUIBackports */, - 06310D702E96120700B6E081 /* VideoPlayer */, - 069DA28B2F96716700720BE0 /* CHTCollectionViewWaterfallLayout */, - 069DA4CE2F969C9A00720BE0 /* GSPlayer */, - 06AB10022FA1000000000001 /* ChatLayout */, - ); - productName = flare; - productReference = 06E433FE2E6A9A2600CD0826 /* Flare.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 06E433F62E6A9A2600CD0826 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 2600; - LastUpgradeCheck = 2600; - TargetAttributes = { - 06E433FD2E6A9A2600CD0826 = { - CreatedOnToolsVersion = 26.0; - }; - }; - }; - buildConfigurationList = 06E433F92E6A9A2600CD0826 /* Build configuration list for PBXProject "Flare" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 06E433F52E6A9A2600CD0826; - minimizedProjectReferenceProxies = 1; - packageReferences = ( - 0646B2602E7151A700535A3E /* XCRemoteSwiftPackageReference "Kingfisher" */, - 06791BD42E7AA40000FF2050 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, - 06C7FC152E7D474900A0D01A /* XCRemoteSwiftPackageReference "LazyPager" */, - 068923462E82A80700981D8E /* XCRemoteSwiftPackageReference "SwiftUI-Flow" */, - 06C6B5462E853AAF00CCD388 /* XCRemoteSwiftPackageReference "swiftui-introspect" */, - 0672EE102E8689C70092AD1F /* XCRemoteSwiftPackageReference "Drops" */, - 06F36AAB2E8F7BEC00F5905F /* XCRemoteSwiftPackageReference "iOS-Backports" */, - 06310D6F2E96120700B6E081 /* XCRemoteSwiftPackageReference "VideoPlayer" */, - 069DA28A2F96716700720BE0 /* XCRemoteSwiftPackageReference "CHTCollectionViewWaterfallLayout" */, - 069DA4CD2F969C9A00720BE0 /* XCRemoteSwiftPackageReference "GSPlayer" */, - 06AB10012FA1000000000001 /* XCRemoteSwiftPackageReference "ChatLayout" */, - ); - preferredProjectObjectVersion = 77; - productRefGroup = 06E433FF2E6A9A2600CD0826 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 06E433FD2E6A9A2600CD0826 /* Flare */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 06E433FC2E6A9A2600CD0826 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 06E434182E6AA19200CD0826 /* Compile Kotlin */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Compile Kotlin"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\ncd \"$SRCROOT/..\"\n./gradlew :ios-shared:embedAndSignAppleFrameworkForXcode\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 06E433FA2E6A9A2600CD0826 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 06E434072E6A9A2700CD0826 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 7LFDZ96332; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 06E434082E6A9A2700CD0826 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 7LFDZ96332; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 26.0; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_EMIT_LOC_STRINGS = YES; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 06E4340A2E6A9A2700CD0826 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon_black AppIcon_blue AppIcon_cyan AppIcon_light_blue AppIcon_orange AppIcon_red AppIcon_teal AppIcon_white AppIcon_yellow"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1600; - DEVELOPMENT_TEAM = 7LFDZ96332; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = flare/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Flare; - INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; - INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Flare requesting the ability to add to the photo library"; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = SplashScreen; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.6.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.dimension.flare; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 06E4340B2E6A9A2700CD0826 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon_black AppIcon_blue AppIcon_cyan AppIcon_light_blue AppIcon_orange AppIcon_red AppIcon_teal AppIcon_white AppIcon_yellow"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1600; - DEVELOPMENT_TEAM = 7LFDZ96332; - ENABLE_PREVIEWS = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = flare/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Flare; - INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; - INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Flare requesting the ability to add to the photo library"; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = SplashScreen; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.6.0; - PRODUCT_BUNDLE_IDENTIFIER = dev.dimension.flare; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRING_CATALOG_GENERATE_SYMBOLS = YES; - SWIFT_APPROACHABLE_CONCURRENCY = YES; - SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; - SWIFT_VERSION = 6.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 06E433F92E6A9A2600CD0826 /* Build configuration list for PBXProject "Flare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 06E434072E6A9A2700CD0826 /* Debug */, - 06E434082E6A9A2700CD0826 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 06E434092E6A9A2700CD0826 /* Build configuration list for PBXNativeTarget "Flare" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 06E4340A2E6A9A2700CD0826 /* Debug */, - 06E4340B2E6A9A2700CD0826 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 06310D6F2E96120700B6E081 /* XCRemoteSwiftPackageReference "VideoPlayer" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/wxxsw/VideoPlayer"; - requirement = { - kind = exactVersion; - version = 1.2.5; - }; - }; - 0646B2602E7151A700535A3E /* XCRemoteSwiftPackageReference "Kingfisher" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/onevcat/Kingfisher.git"; - requirement = { - kind = exactVersion; - version = 8.8.1; - }; - }; - 0672EE102E8689C70092AD1F /* XCRemoteSwiftPackageReference "Drops" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/omaralbeik/Drops.git"; - requirement = { - kind = exactVersion; - version = 1.7.0; - }; - }; - 06791BD42E7AA40000FF2050 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins"; - requirement = { - kind = exactVersion; - version = 0.62.2; - }; - }; - 068923462E82A80700981D8E /* XCRemoteSwiftPackageReference "SwiftUI-Flow" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/tevelee/SwiftUI-Flow"; - requirement = { - kind = exactVersion; - version = 3.1.1; - }; - }; - 069DA28A2F96716700720BE0 /* XCRemoteSwiftPackageReference "CHTCollectionViewWaterfallLayout" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/chiahsien/CHTCollectionViewWaterfallLayout"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.0.1; - }; - }; - 069DA4CD2F969C9A00720BE0 /* XCRemoteSwiftPackageReference "GSPlayer" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/wxxsw/GSPlayer"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.2.30; - }; - }; - 06AB10012FA1000000000001 /* XCRemoteSwiftPackageReference "ChatLayout" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/ekazaev/ChatLayout"; - requirement = { - kind = exactVersion; - version = 2.4.2; - }; - }; - 06C6B5462E853AAF00CCD388 /* XCRemoteSwiftPackageReference "swiftui-introspect" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/siteline/swiftui-introspect"; - requirement = { - kind = exactVersion; - version = 26.0.1; - }; - }; - 06C7FC152E7D474900A0D01A /* XCRemoteSwiftPackageReference "LazyPager" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/gh123man/LazyPager"; - requirement = { - kind = exactVersion; - version = 1.2.1; - }; - }; - 06F36AAB2E8F7BEC00F5905F /* XCRemoteSwiftPackageReference "iOS-Backports" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/superwall/iOS-Backports"; - requirement = { - kind = exactVersion; - version = 1.0.5; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 06310D702E96120700B6E081 /* VideoPlayer */ = { - isa = XCSwiftPackageProductDependency; - package = 06310D6F2E96120700B6E081 /* XCRemoteSwiftPackageReference "VideoPlayer" */; - productName = VideoPlayer; - }; - 0646B2612E7151A700535A3E /* Kingfisher */ = { - isa = XCSwiftPackageProductDependency; - package = 0646B2602E7151A700535A3E /* XCRemoteSwiftPackageReference "Kingfisher" */; - productName = Kingfisher; - }; - 0672EE112E8689C70092AD1F /* Drops */ = { - isa = XCSwiftPackageProductDependency; - package = 0672EE102E8689C70092AD1F /* XCRemoteSwiftPackageReference "Drops" */; - productName = Drops; - }; - 068923472E82A80700981D8E /* Flow */ = { - isa = XCSwiftPackageProductDependency; - package = 068923462E82A80700981D8E /* XCRemoteSwiftPackageReference "SwiftUI-Flow" */; - productName = Flow; - }; - 069DA28B2F96716700720BE0 /* CHTCollectionViewWaterfallLayout */ = { - isa = XCSwiftPackageProductDependency; - package = 069DA28A2F96716700720BE0 /* XCRemoteSwiftPackageReference "CHTCollectionViewWaterfallLayout" */; - productName = CHTCollectionViewWaterfallLayout; - }; - 069DA4CE2F969C9A00720BE0 /* GSPlayer */ = { - isa = XCSwiftPackageProductDependency; - package = 069DA4CD2F969C9A00720BE0 /* XCRemoteSwiftPackageReference "GSPlayer" */; - productName = GSPlayer; - }; - 06AB10022FA1000000000001 /* ChatLayout */ = { - isa = XCSwiftPackageProductDependency; - package = 06AB10012FA1000000000001 /* XCRemoteSwiftPackageReference "ChatLayout" */; - productName = ChatLayout; - }; - 06C6B5472E853AAF00CCD388 /* SwiftUIIntrospect */ = { - isa = XCSwiftPackageProductDependency; - package = 06C6B5462E853AAF00CCD388 /* XCRemoteSwiftPackageReference "swiftui-introspect" */; - productName = SwiftUIIntrospect; - }; - 06C7FC162E7D474900A0D01A /* LazyPager */ = { - isa = XCSwiftPackageProductDependency; - package = 06C7FC152E7D474900A0D01A /* XCRemoteSwiftPackageReference "LazyPager" */; - productName = LazyPager; - }; - 06F36AAC2E8F7BEC00F5905F /* SwiftUIBackports */ = { - isa = XCSwiftPackageProductDependency; - package = 06F36AAB2E8F7BEC00F5905F /* XCRemoteSwiftPackageReference "iOS-Backports" */; - productName = SwiftUIBackports; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 06E433F62E6A9A2600CD0826 /* Project object */; -} diff --git a/iosApp/flare/Info.plist b/iosApp/flare/Info.plist index 82204da09..10532e9ce 100644 --- a/iosApp/flare/Info.plist +++ b/iosApp/flare/Info.plist @@ -4,6 +4,10 @@ CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Flare CFBundleURLTypes @@ -18,8 +22,30 @@ + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + ITSAppUsesNonExemptEncryption + + LSApplicationCategoryType + public.app-category.social-networking + LSRequiresIPhoneOS + LSSupportsOpeningDocumentsInPlace + NSPhotoLibraryAddUsageDescription + Flare requesting the ability to add to the photo library CFBundleDocumentTypes @@ -61,6 +87,30 @@ + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + SplashScreen + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~iphone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + diff --git a/iosApp/flare/UI/Screen/HomeTimelineScreen.swift b/iosApp/flare/UI/Screen/HomeTimelineScreen.swift index b7871a418..138523ffb 100644 --- a/iosApp/flare/UI/Screen/HomeTimelineScreen.swift +++ b/iosApp/flare/UI/Screen/HomeTimelineScreen.swift @@ -13,6 +13,7 @@ struct HomeTimelineScreen: View { @Environment(\.timelineAppearance) private var timelineAppearance @Environment(\.openURL) private var openURL @State private var selectedTabIndex = 0 + @Namespace private var selectedTabIndicatorNamespace @StateObject private var presenter: KotlinPresenter @StateObject private var activeAccountPresenter = KotlinPresenter(presenter: ActiveAccountPresenter()) @StateObject private var loggedInPresenter = KotlinPresenter(presenter: LoggedInPresenter()) @@ -88,8 +89,16 @@ struct HomeTimelineScreen: View { }) .toolbar { leadingToolbarContent - ToolbarItem(placement: horizontalSizeClass == .regular ? .automatic : .title) { - Menu { + if horizontalSizeClass == .compact { + ToolbarItem(placement: .title) { + Label { + TimelineTabTitle(title: tab.title) + } icon: { + TabIcon(tabItem: tab) + } + .labelStyle(.titleAndIcon) + } + ToolbarTitleMenu { ForEach(0.. Directory containing AppIcon*.icon bundles. Default: iosApp/flare --asset-catalog Output .xcassets directory. Default: iosApp/flare/Assets.xcassets --swift-output Output AppIconOption.swift path. Default: iosApp/flare/Common/AppIconOption.swift - --project-file Xcode project.pbxproj to update. Default: iosApp/Flare.xcodeproj/project.pbxproj + --project-file XcodeGen project spec to update. Default: iosApp/project.yml --prefix Output image asset prefix. Default: app_icon_preview --size PNG width/height. Default: 256 --platform ictool platform. Default: iOS @@ -37,7 +37,7 @@ Options: --skip-appiconsets Do not generate alternate .appiconset assets. --skip-previews Only generate the Swift icon list. --skip-swift Only generate preview image assets. - --skip-project Do not update alternate app icon names in the Xcode project. + --skip-project Do not update alternate app icon names in the XcodeGen spec. -h, --help Show this help. EOF } @@ -249,7 +249,7 @@ fi if [[ "$update_project" == "true" ]]; then if [[ ! -f "$project_file" ]]; then - echo "error: Xcode project file does not exist: $project_file" >&2 + echo "error: Xcode project spec does not exist: $project_file" >&2 exit 1 fi @@ -262,26 +262,32 @@ if [[ "$update_project" == "true" ]]; then done alternate_names_string="${alternate_names[*]}" - if ! grep -q "ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES" "$project_file"; then - echo "warning: ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES was not found in $project_file" >&2 - else + if grep -q "ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES:" "$project_file"; then + perl -0pi -e "s/ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES: \"[^\"]*\"/ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES: \"$alternate_names_string\"/g" "$project_file" + echo "Updated alternate app icon names in $project_file" + elif grep -q "ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES" "$project_file"; then perl -0pi -e "s/ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = \"[^\"]*\";/ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = \"$alternate_names_string\";/g" "$project_file" echo "Updated alternate app icon names in $project_file" + else + echo "warning: ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES was not found in $project_file" >&2 fi + perl -0pi -e 's/ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS: YES/ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS: NO/g' "$project_file" perl -0pi -e 's/ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;/ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;/g' "$project_file" echo "Disabled include-all app icon assets in $project_file" - exception_lines=$'\t\t\t\tInfo.plist,\n' - for icon_name in "${alternate_names[@]}"; do - exception_lines+=$'\t\t\t\t'"$icon_name.icon"$',\n' - done + if grep -q "membershipExceptions = (" "$project_file"; then + exception_lines=$'\t\t\t\tInfo.plist,\n' + for icon_name in "${alternate_names[@]}"; do + exception_lines+=$'\t\t\t\t'"$icon_name.icon"$',\n' + done - EXCEPTION_LINES="$exception_lines" perl -0pi -e ' - my $lines = $ENV{"EXCEPTION_LINES"}; - s/membershipExceptions = \(\n.*?\t\t\t\);/membershipExceptions = (\n$lines\t\t\t);/s; - ' "$project_file" - echo "Excluded alternate .icon sources from the Flare target in $project_file" + EXCEPTION_LINES="$exception_lines" perl -0pi -e ' + my $lines = $ENV{"EXCEPTION_LINES"}; + s/membershipExceptions = \(\n.*?\t\t\t\);/membershipExceptions = (\n$lines\t\t\t);/s; + ' "$project_file" + echo "Excluded alternate .icon sources from the Flare target in $project_file" + fi fi if [[ "$generate_previews" != "true" && "$generate_appiconsets" != "true" ]]; then diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/AccountTypeConverter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/AccountTypeConverter.kt index 6c7ea92ad..2700be247 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/AccountTypeConverter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/AccountTypeConverter.kt @@ -1,6 +1,6 @@ package dev.dimension.flare.data.database.adapter -import androidx.room3.TypeConverter +import androidx.room3.ColumnTypeConverter import dev.dimension.flare.common.decodeJson import dev.dimension.flare.common.decodeProtobuf import dev.dimension.flare.common.encodeJson @@ -13,39 +13,39 @@ import dev.dimension.flare.ui.model.UiRelation import dev.dimension.flare.ui.model.UiTimelineV2 internal class AccountTypeConverter { - @TypeConverter + @ColumnTypeConverter fun fromString(value: String): DbAccountType = value.decodeJson() - @TypeConverter + @ColumnTypeConverter fun fromEnum(value: DbAccountType): String = value.encodeJson() - @TypeConverter + @ColumnTypeConverter fun fromUiProfile(value: UiProfile): ByteArray = value.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toUiProfile(value: ByteArray): UiProfile = value.decodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun fromUiTimelineV2(value: UiTimelineV2): ByteArray = value.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toUiTimelineV2(value: ByteArray): UiTimelineV2 = value.decodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun fromUiDMRoom(value: UiDMRoom): ByteArray = value.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toUiDMRoom(value: ByteArray): UiDMRoom = value.decodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun fromUiDMItem(value: UiDMItem): ByteArray = value.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toUiDMItem(value: ByteArray): UiDMItem = value.decodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun fromUiRelation(value: UiRelation): ByteArray = value.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toUiRelation(value: ByteArray): UiRelation = value.decodeProtobuf() } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/MicroBlogKeyConverter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/MicroBlogKeyConverter.kt index f1c6bc659..99c7d898e 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/MicroBlogKeyConverter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/MicroBlogKeyConverter.kt @@ -3,9 +3,9 @@ package dev.dimension.flare.data.database.adapter import dev.dimension.flare.model.MicroBlogKey internal class MicroBlogKeyConverter { - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromString(value: String): MicroBlogKey = MicroBlogKey.valueOf(value) - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromEnum(value: MicroBlogKey): String = value.toString() } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/PlatformTypeConverter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/PlatformTypeConverter.kt index 31ddc3a7f..a04f4199a 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/PlatformTypeConverter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/PlatformTypeConverter.kt @@ -3,9 +3,9 @@ package dev.dimension.flare.data.database.adapter import dev.dimension.flare.model.PlatformType internal class PlatformTypeConverter { - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromString(value: String): PlatformType = PlatformType.valueOf(value) - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromEnum(value: PlatformType): String = value.name } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/SubscriptionTypeConverter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/SubscriptionTypeConverter.kt index f76b83ed5..c342df840 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/SubscriptionTypeConverter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/adapter/SubscriptionTypeConverter.kt @@ -4,17 +4,17 @@ import dev.dimension.flare.data.database.app.model.RssDisplayMode import dev.dimension.flare.data.database.app.model.SubscriptionType internal class SubscriptionTypeConverter { - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromString(value: String): SubscriptionType = SubscriptionType.valueOf(value) - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromEnum(value: SubscriptionType): String = value.name } internal class RssDisplayModeConverter { - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromString(value: String): RssDisplayMode = RssDisplayMode.valueOf(value) - @androidx.room3.TypeConverter + @androidx.room3.ColumnTypeConverter fun fromEnum(value: RssDisplayMode): String = value.name } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/AppDatabase.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/AppDatabase.kt index 2e44e2b81..9a19671d0 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/AppDatabase.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/AppDatabase.kt @@ -1,11 +1,11 @@ package dev.dimension.flare.data.database.app import androidx.room3.AutoMigration +import androidx.room3.ColumnTypeConverters import androidx.room3.ConstructedBy import androidx.room3.Database import androidx.room3.RoomDatabase import androidx.room3.RoomDatabaseConstructor -import androidx.room3.TypeConverters import androidx.room3.migration.Migration import androidx.sqlite.SQLiteConnection import androidx.sqlite.async.executeSQL @@ -50,7 +50,7 @@ import dev.dimension.flare.data.database.app.dao.SearchHistoryDao ], exportSchema = true, ) -@TypeConverters( +@ColumnTypeConverters( dev.dimension.flare.data.database.adapter.MicroBlogKeyConverter::class, dev.dimension.flare.data.database.adapter.PlatformTypeConverter::class, dev.dimension.flare.data.database.app.model.DraftConverters::class, diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/model/DbDraft.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/model/DbDraft.kt index c5da0ec46..589efc9e3 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/model/DbDraft.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/app/model/DbDraft.kt @@ -1,12 +1,12 @@ package dev.dimension.flare.data.database.app.model +import androidx.room3.ColumnTypeConverter import androidx.room3.Embedded import androidx.room3.Entity import androidx.room3.ForeignKey import androidx.room3.Index import androidx.room3.PrimaryKey import androidx.room3.Relation -import androidx.room3.TypeConverter import dev.dimension.flare.common.decodeJson import dev.dimension.flare.common.encodeJson import dev.dimension.flare.model.MicroBlogKey @@ -166,21 +166,21 @@ internal data class DbDraftGroupWithRelations( ) internal class DraftConverters { - @TypeConverter + @ColumnTypeConverter fun fromDraftContent(value: DraftContent): String = value.encodeJson() - @TypeConverter + @ColumnTypeConverter fun toDraftContent(value: String): DraftContent = value.decodeJson() - @TypeConverter + @ColumnTypeConverter fun fromDraftTargetStatus(value: DraftTargetStatus): String = value.name - @TypeConverter + @ColumnTypeConverter fun toDraftTargetStatus(value: String): DraftTargetStatus = DraftTargetStatus.valueOf(value) - @TypeConverter + @ColumnTypeConverter fun fromDraftMediaType(value: DraftMediaType): String = value.name - @TypeConverter + @ColumnTypeConverter fun toDraftMediaType(value: String): DraftMediaType = DraftMediaType.valueOf(value) } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/CacaheDatabase.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/CacaheDatabase.kt index 49d61112e..43c8dc351 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/CacaheDatabase.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/CacaheDatabase.kt @@ -1,10 +1,10 @@ package dev.dimension.flare.data.database.cache +import androidx.room3.ColumnTypeConverters import androidx.room3.ConstructedBy import androidx.room3.Database import androidx.room3.RoomDatabase import androidx.room3.RoomDatabaseConstructor -import androidx.room3.TypeConverters import androidx.room3.immediateTransaction import androidx.room3.useWriterConnection @@ -33,7 +33,7 @@ internal const val CACHE_DATABASE_VERSION = 40 version = CACHE_DATABASE_VERSION, exportSchema = false, ) -@TypeConverters( +@ColumnTypeConverters( dev.dimension.flare.data.database.adapter.MicroBlogKeyConverter::class, dev.dimension.flare.data.database.adapter.PlatformTypeConverter::class, dev.dimension.flare.data.database.adapter.AccountTypeConverter::class, diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbEmoji.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbEmoji.kt index 36e12084e..23f9be21e 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbEmoji.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbEmoji.kt @@ -1,9 +1,9 @@ package dev.dimension.flare.data.database.cache.model import androidx.room3.ColumnInfo +import androidx.room3.ColumnTypeConverter import androidx.room3.Entity import androidx.room3.PrimaryKey -import androidx.room3.TypeConverter import dev.dimension.flare.common.decodeProtobuf import dev.dimension.flare.common.encodeProtobuf import dev.dimension.flare.model.DbAccountType @@ -18,10 +18,10 @@ internal data class DbEmoji( ) internal class EmojiContentConverter { - @TypeConverter + @ColumnTypeConverter fun fromEmojiContent(emojiContent: EmojiContent): ByteArray = emojiContent.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toEmojiContent(data: ByteArray): EmojiContent = if (data.isEmpty()) { EmojiContent() diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbList.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbList.kt index 5ca10ee9b..f71f191c8 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbList.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbList.kt @@ -1,12 +1,12 @@ package dev.dimension.flare.data.database.cache.model import androidx.room3.ColumnInfo +import androidx.room3.ColumnTypeConverter import androidx.room3.Embedded import androidx.room3.Entity import androidx.room3.Index import androidx.room3.PrimaryKey import androidx.room3.Relation -import androidx.room3.TypeConverter import dev.dimension.flare.common.decodeProtobuf import dev.dimension.flare.common.encodeProtobuf import dev.dimension.flare.data.database.cache.model.DbList.ListContent @@ -34,10 +34,10 @@ internal data class DbList( } internal class ListContentConverters { - @TypeConverter + @ColumnTypeConverter fun fromMessageContent(content: ListContent): ByteArray = content.encodeProtobuf() - @TypeConverter + @ColumnTypeConverter fun toMessageContent(value: ByteArray): ListContent = value.decodeProtobuf() } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbPagingTimeline.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbPagingTimeline.kt index 605417e3f..48294c119 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbPagingTimeline.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbPagingTimeline.kt @@ -1,11 +1,11 @@ package dev.dimension.flare.data.database.cache.model +import androidx.room3.ColumnTypeConverter import androidx.room3.Embedded import androidx.room3.Entity import androidx.room3.Index import androidx.room3.PrimaryKey import androidx.room3.Relation -import androidx.room3.TypeConverter import dev.dimension.flare.model.ReferenceType import kotlin.time.Instant import kotlin.uuid.Uuid @@ -82,15 +82,15 @@ internal data class DbStatusWithReference( ) internal class StatusConverter { - @TypeConverter + @ColumnTypeConverter fun fromReferenceType(value: ReferenceType): String = value.name - @TypeConverter + @ColumnTypeConverter fun toReferenceType(value: String): ReferenceType = ReferenceType.valueOf(value) - @TypeConverter + @ColumnTypeConverter fun fromTimestamp(value: Instant): Long = value.toEpochMilliseconds() - @TypeConverter + @ColumnTypeConverter fun toTimestamp(value: Long): Instant = Instant.fromEpochMilliseconds(value) } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbTranslation.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbTranslation.kt index 973132fc8..71d37d6ab 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbTranslation.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/model/DbTranslation.kt @@ -1,10 +1,10 @@ package dev.dimension.flare.data.database.cache.model import androidx.room3.ColumnInfo +import androidx.room3.ColumnTypeConverter import androidx.room3.Entity import androidx.room3.Index import androidx.room3.PrimaryKey -import androidx.room3.TypeConverter import dev.dimension.flare.common.decodeJson import dev.dimension.flare.common.encodeJson import dev.dimension.flare.model.AccountType @@ -68,28 +68,28 @@ internal data class TranslationPayload( ) internal class TranslationConverters { - @TypeConverter + @ColumnTypeConverter fun fromEntityType(value: TranslationEntityType): String = value.name - @TypeConverter + @ColumnTypeConverter fun toEntityType(value: String): TranslationEntityType = TranslationEntityType.valueOf(value) - @TypeConverter + @ColumnTypeConverter fun fromStatus(value: TranslationStatus): String = value.name - @TypeConverter + @ColumnTypeConverter fun toStatus(value: String): TranslationStatus = TranslationStatus.valueOf(value) - @TypeConverter + @ColumnTypeConverter fun fromDisplayMode(value: TranslationDisplayMode): String = value.name - @TypeConverter + @ColumnTypeConverter fun toDisplayMode(value: String): TranslationDisplayMode = TranslationDisplayMode.valueOf(value) - @TypeConverter + @ColumnTypeConverter fun fromPayload(value: TranslationPayload?): String? = value?.encodeJson(TranslationPayload.serializer()) - @TypeConverter + @ColumnTypeConverter fun toPayload(value: String?): TranslationPayload? = value?.decodeJson(TranslationPayload.serializer()) }