Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion android/shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ kotlin {
implementation(project(":pebblekit_android"))
implementation(project(":speex_codec"))
}
iosMain {
kotlin.srcDir("build/generated/ksp/metadata")
}
commonTest.dependencies {
implementation(kotlin("test"))
implementation(libs.ktor.client.mock)
Expand Down Expand Up @@ -112,4 +115,7 @@ dependencies {
implementation(libs.androidx.security.crypto.ktx)
add("kspCommonMainMetadata", libs.androidx.room.compiler)
add("kspAndroid", libs.androidx.room.compiler)
}
add("kspIosSimulatorArm64", libs.androidx.room.compiler)
add("kspIosX64", libs.androidx.room.compiler)
add("kspIosArm64", libs.androidx.room.compiler)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,28 @@
package io.rebble.cobble.shared.database

import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.RoomDatabaseConstructor
import kotlinx.cinterop.ExperimentalForeignApi
import platform.Foundation.NSDocumentDirectory
import platform.Foundation.NSFileManager
import platform.Foundation.NSUserDomainMask

actual fun getDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
TODO("Not yet implemented")
val dbFilePath = documentDirectory() + "/cobble-room.db"
return Room.databaseBuilder<AppDatabase>(
name = dbFilePath
)
}

@OptIn(ExperimentalForeignApi::class)
private fun documentDirectory(): String {
val documentDirectory = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
return requireNotNull(documentDirectory?.path)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.rebble.cobble.shared

import androidx.compose.ui.window.ComposeUIViewController
import androidx.navigation.compose.rememberNavController
import io.rebble.cobble.shared.ui.view.MainView

fun mainViewController() = ComposeUIViewController {
val navHost = rememberNavController()
MainView(navHost)
}
23 changes: 23 additions & 0 deletions ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

/* Begin PBXBuildFile section */
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
5D12BEE72D57FC5500243610 /* KMPApiBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D12BEE62D57FC4F00243610 /* KMPApiBridge.swift */; };
6701505427D1AC4200797B97 /* IntentControlFlutterBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6701505327D1AC4200797B97 /* IntentControlFlutterBridge.swift */; };
6701505627D1B48800797B97 /* OpenWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6701505527D1B48800797B97 /* OpenWith.swift */; };
6701505827D1B96400797B97 /* AppInstallControlFlutterBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6701505727D1B96400797B97 /* AppInstallControlFlutterBridge.swift */; };
Expand Down Expand Up @@ -80,6 +81,7 @@
/* Begin PBXFileReference section */
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
46435D4C3A881E1DFE6583FC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
5D12BEE62D57FC4F00243610 /* KMPApiBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPApiBridge.swift; sourceTree = "<group>"; };
620666896E8FA2E5FECAB423 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6701505327D1AC4200797B97 /* IntentControlFlutterBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentControlFlutterBridge.swift; sourceTree = "<group>"; };
6701505527D1B48800797B97 /* OpenWith.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenWith.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -261,6 +263,7 @@
67B33CD427C464B0007FBA39 /* common */ = {
isa = PBXGroup;
children = (
5D12BEE62D57FC4F00243610 /* KMPApiBridge.swift */,
67B33CD527C464B0007FBA39 /* PermissionCheckFlutterBridge.swift */,
67B33CD627C464B0007FBA39 /* ScanFlutterBridge.swift */,
6701505727D1B96400797B97 /* AppInstallControlFlutterBridge.swift */,
Expand Down Expand Up @@ -370,6 +373,7 @@
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
DB7F622F28ABFEFF1BB24999 /* [CP] Check Pods Manifest.lock */,
5D12BEE52D57ED8100243610 /* Run Script (KMP) */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
Expand Down Expand Up @@ -480,6 +484,24 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
};
5D12BEE52D57ED8100243610 /* Run Script (KMP) */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Run Script (KMP)";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "cd \"$SRCROOT/../android\"\n./gradlew :shared:embedAndSignAppleFrameworkForXcode\n";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
Expand Down Expand Up @@ -562,6 +584,7 @@
67945BB227C81A4D00DE13E8 /* Pigeons.m in Sources */,
67B33CEA27C464B1007FBA39 /* ConnectionFlutterBridge.swift in Sources */,
67442F7127C9B0D900ACED5B /* AppInstallHandler.swift in Sources */,
5D12BEE72D57FC5500243610 /* KMPApiBridge.swift in Sources */,
67B33CF927C464B1007FBA39 /* PebbleDevice.swift in Sources */,
67B33CF427C464B1007FBA39 /* LECentral.swift in Sources */,
67B33CE527C464B1007FBA39 /* PersistentStorage.swift in Sources */,
Expand Down
6 changes: 6 additions & 0 deletions ios/Runner/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Flutter
import CocoaLumberjackSwift
import CocoaLumberjackSwiftLogBackend
import Logging
import shared

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
Expand All @@ -18,6 +19,7 @@ import Logging
LECentral.shared = LECentral()

setupFlutter()
setupKmp()
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

Expand All @@ -30,6 +32,10 @@ import Logging
FlutterBridgeSetup.createCommonBridges(binaryMessenger: binaryMessenger)
}

private func setupKmp() {
Koin_iosKt.doInitKoin()
}

private func setupLogging() {
DDLog.add(DDOSLogger.sharedInstance)
}
Expand Down
1 change: 1 addition & 0 deletions ios/Runner/bridges/FlutterBridgeSetup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class FlutterBridgeSetup {
ConnectionControlSetup(binaryMessenger, ConnectionFlutterBridge(callbackMessenger: binaryMessenger))
PigeonLoggerSetup(binaryMessenger, LoggingFlutterBridge())
AppLifecycleControlSetup(binaryMessenger, AppLifecycleFlutterBridge())
KMPApiSetup(binaryMessenger, KMPApiBridge())
}

static func createUIBridges(binaryMessenger: FlutterBinaryMessenger) {
Expand Down
37 changes: 37 additions & 0 deletions ios/Runner/bridges/common/KMPApiBridge.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// KMPApiBridge.swift
// Runner
//
// Created by Timofei Plotnikov on 08.02.2025.
//

import Foundation
import Flutter
import shared

class KMPApiBridge: NSObject, KMPApi {
func updateTokenToken(
_ token: StringWrapper,
error: AutoreleasingUnsafeMutablePointer<FlutterError?>
) {
//TODO: Implement
}

func openLockerViewWithError(_ error: AutoreleasingUnsafeMutablePointer<FlutterError?>) {
guard
let window = UIApplication.shared.windows.first,
let root = window.rootViewController
else {
print("Failed to get rootViewController")
return
}

// Notes:
// 1. This is not the best places to open up mainViewController. Its here just for
// demonstration purposes
// 2. The screen is presented as a modal, use swipe from top to bottom to return back to
// the flutter app
let mainViewController = Main_iosKt.mainViewController()
root.present(mainViewController, animated: false, completion: nil)
}
}
Loading