diff --git a/mobile/app/devtools_options.yaml b/mobile/app/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/mobile/app/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/mobile/app/ios/Podfile.lock b/mobile/app/ios/Podfile.lock new file mode 100644 index 0000000..a494a6c --- /dev/null +++ b/mobile/app/ios/Podfile.lock @@ -0,0 +1,162 @@ +PODS: + - apivideo_live_stream (0.0.1): + - ApiVideoLiveStream (= 1.2.2) + - Flutter + - HaishinKit (= 1.3.0) + - ApiVideoLiveStream (1.2.2): + - HaishinKit (= 1.3.0) + - DKImagePickerController/Core (4.3.9): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.19): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.19): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Flutter (1.0.0) + - flutter_credit_card (0.0.1): + - Flutter + - HaishinKit (1.3.0): + - Logboard (~> 2.3.0) + - Logboard (2.3.1) + - native_device_orientation (0.0.1): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - pointer_interceptor_ios (0.0.1): + - Flutter + - rive_common (0.0.1): + - Flutter + - SDWebImage (5.19.4): + - SDWebImage/Core (= 5.19.4) + - SDWebImage/Core (5.19.4) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - speech_to_text (0.0.1): + - Flutter + - Try + - sqflite (0.0.3): + - Flutter + - FlutterMacOS + - SwiftyGif (5.4.5) + - Try (2.1.1) + - url_launcher_ios (0.0.1): + - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - webview_flutter_wkwebview (0.0.1): + - Flutter + +DEPENDENCIES: + - apivideo_live_stream (from `.symlinks/plugins/apivideo_live_stream/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - Flutter (from `Flutter`) + - flutter_credit_card (from `.symlinks/plugins/flutter_credit_card/ios`) + - native_device_orientation (from `.symlinks/plugins/native_device_orientation/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - pointer_interceptor_ios (from `.symlinks/plugins/pointer_interceptor_ios/ios`) + - rive_common (from `.symlinks/plugins/rive_common/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) + - sqflite (from `.symlinks/plugins/sqflite/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) + +SPEC REPOS: + trunk: + - ApiVideoLiveStream + - DKImagePickerController + - DKPhotoGallery + - HaishinKit + - Logboard + - SDWebImage + - SwiftyGif + - Try + +EXTERNAL SOURCES: + apivideo_live_stream: + :path: ".symlinks/plugins/apivideo_live_stream/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + Flutter: + :path: Flutter + flutter_credit_card: + :path: ".symlinks/plugins/flutter_credit_card/ios" + native_device_orientation: + :path: ".symlinks/plugins/native_device_orientation/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + pointer_interceptor_ios: + :path: ".symlinks/plugins/pointer_interceptor_ios/ios" + rive_common: + :path: ".symlinks/plugins/rive_common/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + speech_to_text: + :path: ".symlinks/plugins/speech_to_text/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/darwin" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" + +SPEC CHECKSUMS: + apivideo_live_stream: 64fa696699cfc531e07f5d5d701c7e3cd5ce5e9d + ApiVideoLiveStream: 5842571806a2ed26671597dadd370ec38d9b9ba4 + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 + file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_credit_card: 48fb35065294868bc6a3e7f18a42f28929b84f48 + HaishinKit: 013229683accc4abe46630b04629da3ff90428b7 + Logboard: 3d98bb85de6a36b255ab637e8178eb5671c5c3a6 + native_device_orientation: 3b4cfc9565a7b879cc4fde282b3e27745e852d0d + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1 + rive_common: 3a4c254c6e4db7e4b9e05daeb3d1f47ae4f7bf76 + SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe + sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 + Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36 + +PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 + +COCOAPODS: 1.15.2 diff --git a/mobile/app/ios/Runner.xcodeproj/project.pbxproj b/mobile/app/ios/Runner.xcodeproj/project.pbxproj index 8aaafb2..5884ae8 100644 --- a/mobile/app/ios/Runner.xcodeproj/project.pbxproj +++ b/mobile/app/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 1A842A08FCF2E60F2DC38967 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72D644A2E498C9BA5622C54F /* Pods_RunnerTests.framework */; }; + 23394E45189304C0C8B7B28E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56C8C7368AE78ACE8607CD9E /* Pods_Runner.framework */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -40,14 +42,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0151E46117D4D747AD6AC5CA /* 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 = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2B088EE7CCB52F9F9F771147 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4A35B625628A126CB966D9D3 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 55D68109A360AC60F8F453F3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 56C8C7368AE78ACE8607CD9E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 72D644A2E498C9BA5622C54F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 85190F9D33FFEE471AA1BBDF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -55,6 +64,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E93E580DD876AE87CAF169F7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,12 +72,34 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 23394E45189304C0C8B7B28E /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F46E2B0305A6E6E475DD5131 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A842A08FCF2E60F2DC38967 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1DADEF4AA78CE7076F315AFE /* Pods */ = { + isa = PBXGroup; + children = ( + 0151E46117D4D747AD6AC5CA /* Pods-Runner.debug.xcconfig */, + 2B088EE7CCB52F9F9F771147 /* Pods-Runner.release.xcconfig */, + 85190F9D33FFEE471AA1BBDF /* Pods-Runner.profile.xcconfig */, + 4A35B625628A126CB966D9D3 /* Pods-RunnerTests.debug.xcconfig */, + E93E580DD876AE87CAF169F7 /* Pods-RunnerTests.release.xcconfig */, + 55D68109A360AC60F8F453F3 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -94,6 +126,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 1DADEF4AA78CE7076F315AFE /* Pods */, + A3D098F5CC733F52B6D01ACB /* Frameworks */, ); sourceTree = ""; }; @@ -121,6 +155,15 @@ path = Runner; sourceTree = ""; }; + A3D098F5CC733F52B6D01ACB /* Frameworks */ = { + isa = PBXGroup; + children = ( + 56C8C7368AE78ACE8607CD9E /* Pods_Runner.framework */, + 72D644A2E498C9BA5622C54F /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -128,8 +171,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + CF8C5EF2CFE445B8DBBA7041 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, + F46E2B0305A6E6E475DD5131 /* Frameworks */, ); buildRules = ( ); @@ -145,12 +190,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 46398C21E369343F3454DAF3 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 86B1E22AB537DC186C27C01C /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -238,6 +285,45 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 46398C21E369343F3454DAF3 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 86B1E22AB537DC186C27C01C /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -253,6 +339,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + CF8C5EF2CFE445B8DBBA7041 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -362,13 +470,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 6G5TWS2YU7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.app; + PRODUCT_BUNDLE_IDENTIFIER = quaxlyqueen.dev.oneai; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -378,6 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4A35B625628A126CB966D9D3 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -395,6 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E93E580DD876AE87CAF169F7 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -410,6 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 55D68109A360AC60F8F453F3 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -541,13 +653,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 6G5TWS2YU7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.app; + PRODUCT_BUNDLE_IDENTIFIER = quaxlyqueen.dev.oneai; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -563,13 +676,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 6G5TWS2YU7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.app; + PRODUCT_BUNDLE_IDENTIFIER = quaxlyqueen.dev.oneai; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/mobile/app/ios/Runner.xcworkspace/contents.xcworkspacedata b/mobile/app/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/mobile/app/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/mobile/app/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/mobile/app/ios/Runner/AppDelegate.swift b/mobile/app/ios/Runner/AppDelegate.swift index 9074fee..6266644 100644 --- a/mobile/app/ios/Runner/AppDelegate.swift +++ b/mobile/app/ios/Runner/AppDelegate.swift @@ -1,7 +1,7 @@ import Flutter import UIKit -@UIApplicationMain +@main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, diff --git a/mobile/app/ios/Runner/Info.plist b/mobile/app/ios/Runner/Info.plist index c2e05c5..624ef01 100644 --- a/mobile/app/ios/Runner/Info.plist +++ b/mobile/app/ios/Runner/Info.plist @@ -2,6 +2,12 @@ + NSMicrophoneUsageDescription + Required for on-device speech recognition. + NSSpeechRecognitionUsageDescription + On-device speech-to-text. + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +30,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -41,9 +49,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/mobile/app/lib/components/conversation_thread/chat_bubble_widget.dart b/mobile/app/lib/components/conversation_thread/chat_bubble_widget.dart index 2477f96..fee84cf 100644 --- a/mobile/app/lib/components/conversation_thread/chat_bubble_widget.dart +++ b/mobile/app/lib/components/conversation_thread/chat_bubble_widget.dart @@ -8,10 +8,13 @@ class ChatBubbleWidget extends StatelessWidget{ @override Widget build(BuildContext context) { + double max_width = MediaQuery.of(context).size.width*0.65; + return Row( mainAxisAlignment: c.role ? MainAxisAlignment.end : MainAxisAlignment.start, children: [ Container( + width: max_width, padding: const EdgeInsets.all(16.0), margin: const EdgeInsets.all(8.0), decoration: BoxDecoration( diff --git a/mobile/app/lib/components/conversation_thread/conversation_thread_model.dart b/mobile/app/lib/components/conversation_thread/conversation_thread_model.dart index 6b3197d..6230189 100644 --- a/mobile/app/lib/components/conversation_thread/conversation_thread_model.dart +++ b/mobile/app/lib/components/conversation_thread/conversation_thread_model.dart @@ -14,11 +14,9 @@ import 'package:cached_network_image/cached_network_image.dart'; class ConversationThreadModel extends FlutterFlowModel { final formKey = GlobalKey(); late PromptBoxModel promptBoxModel; - late Conversation conversation; + Conversation conversation; - void updateConversation() { - conversation = Server.getLoadedConversation(); - } + ConversationThreadModel(this.conversation); @override void initState(BuildContext context) { diff --git a/mobile/app/lib/components/conversation_thread/conversation_thread_widget.dart b/mobile/app/lib/components/conversation_thread/conversation_thread_widget.dart index f096d00..8a42f02 100644 --- a/mobile/app/lib/components/conversation_thread/conversation_thread_widget.dart +++ b/mobile/app/lib/components/conversation_thread/conversation_thread_widget.dart @@ -15,15 +15,19 @@ import 'conversation_thread_model.dart'; export 'conversation_thread_model.dart'; class ConversationThreadWidget extends StatefulWidget { - const ConversationThreadWidget({super.key}); + final Conversation conversation; + const ConversationThreadWidget({super.key, required this.conversation}); @override State createState() => - _ConversationThreadWidgetState(); + _ConversationThreadWidgetState(conversation); } class _ConversationThreadWidgetState extends State { late ConversationThreadModel _model; + Conversation conversation; + + _ConversationThreadWidgetState(this.conversation); @override void setState(VoidCallback callback) { @@ -34,7 +38,7 @@ class _ConversationThreadWidgetState extends State { @override void initState() { super.initState(); - _model = createModel(context, () => ConversationThreadModel()); + _model = createModel(context, () => ConversationThreadModel(conversation)); } @override @@ -66,11 +70,7 @@ class _ConversationThreadWidgetState extends State { reverse: false, scrollDirection: Axis.vertical, itemBuilder: (BuildContext context, int index) { - if(Server.getLoadedConversation().chats.last.role) { - return ChatBubbleWidget(c: Server.getLoadedConversation().chats[index]); - } else { - - } + return ChatBubbleWidget(c: Server.getLoadedConversation().chats[index]); }, ); }, diff --git a/mobile/app/lib/components/prompt_box/prompt_box_widget.dart b/mobile/app/lib/components/prompt_box/prompt_box_widget.dart index 3ab8ee1..f80e70e 100644 --- a/mobile/app/lib/components/prompt_box/prompt_box_widget.dart +++ b/mobile/app/lib/components/prompt_box/prompt_box_widget.dart @@ -221,6 +221,7 @@ class _PromptBoxWidgetState extends State { onFieldSubmitted: (text) { // TODO: Clear text box Server.respondWhenReady(text); // TODO: Connect with multimedia + _model.textController?.clear(); // Clear the text field }, ), ), diff --git a/mobile/app/lib/main.dart b/mobile/app/lib/main.dart index ebc8243..f354c5c 100644 --- a/mobile/app/lib/main.dart +++ b/mobile/app/lib/main.dart @@ -31,10 +31,6 @@ BottomNavigationBarItem _buildNavigationItem(int index) { label = 'Home'; iconData = Icons.home; break; - case 2: - label = 'Chat'; - iconData = Icons.bubble_chart; - break; } return BottomNavigationBarItem( icon: Icon(iconData), @@ -56,7 +52,7 @@ class MyApp extends ConsumerWidget { final selectedIndexProvider = StateProvider((_) => 1); // Initial state // This list holds the pages to navigate between - final List _pages = [ + static final List _pages = [ const Center(child: SettingsWidget()), const Center(child: ConversationsListWidget()), ]; diff --git a/mobile/app/lib/pages/conversation_model.dart b/mobile/app/lib/pages/conversation_model.dart index 115bbf0..cd203e0 100644 --- a/mobile/app/lib/pages/conversation_model.dart +++ b/mobile/app/lib/pages/conversation_model.dart @@ -1,3 +1,5 @@ +import 'package:app/components/conversation_thread/conversation.dart'; + import '/components/conversation_thread/conversation_thread_widget.dart'; import '/components/model_item/model_item_widget.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; @@ -13,9 +15,13 @@ class ConversationModel extends FlutterFlowModel { // Model for ModelItem component. late ModelItemModel modelItemModel; + late Conversation conversation; + + ConversationModel(this.conversation); + @override void initState(BuildContext context) { - conversationThreadModel = createModel(context, () => ConversationThreadModel()); // TODO + conversationThreadModel = createModel(context, () => ConversationThreadModel(conversation)); // TODO modelItemModel = createModel(context, () => ModelItemModel()); } diff --git a/mobile/app/lib/pages/conversation_widget.dart b/mobile/app/lib/pages/conversation_widget.dart index 556478b..d1ebce3 100644 --- a/mobile/app/lib/pages/conversation_widget.dart +++ b/mobile/app/lib/pages/conversation_widget.dart @@ -1,3 +1,5 @@ +import 'package:app/components/conversation_thread/conversation.dart'; + import '/components/conversation_details_overlay/conversation_details_overlay_widget.dart'; import '/components/conversation_thread/conversation_thread_widget.dart'; import '/components/model_item/model_item_widget.dart'; @@ -10,22 +12,24 @@ import 'conversation_model.dart'; export 'conversation_model.dart'; class ConversationWidget extends StatefulWidget { - const ConversationWidget({super.key}); + final Conversation conversation; + const ConversationWidget({super.key, required this.conversation}); @override - State createState() => _ConversationWidgetState(); + State createState() => _ConversationWidgetState(conversation); } class _ConversationWidgetState extends State { late ConversationModel _model; + Conversation conversation; - _ConversationWidgetState(); + _ConversationWidgetState(this.conversation); final scaffoldKey = GlobalKey(); @override void initState() { super.initState(); - _model = createModel(context, () => ConversationModel()); + _model = createModel(context, () => ConversationModel(conversation)); } @override @@ -124,7 +128,7 @@ class _ConversationWidgetState extends State { child: wrapWithModel( model: _model.conversationThreadModel, updateCallback: () => setState(() {}), - child: const ConversationThreadWidget(), + child: ConversationThreadWidget(conversation: conversation), ), ), ), diff --git a/mobile/app/lib/pages/conversations_list_widget.dart b/mobile/app/lib/pages/conversations_list_widget.dart index 7df996a..aacf29e 100644 --- a/mobile/app/lib/pages/conversations_list_widget.dart +++ b/mobile/app/lib/pages/conversations_list_widget.dart @@ -2,7 +2,6 @@ import 'package:app/components/conversation_thread/conversation.dart'; import 'package:app/theme.dart'; import 'package:app/pages/conversation_widget.dart'; -import 'package:app/components/conversation_options/conversation_options_widget.dart'; import 'package:app/util/server.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; @@ -22,14 +21,8 @@ class ConversationsListWidget extends StatefulWidget { class _ConversationsListWidgetState extends State { late ConversationsListModel _model; - final selectedIndexProvider = StateProvider((_) => 0); // Initial state - late List conversations = []; - // = [ - // // TODO: Dynamically generate list of pages based upon existing conversations. - // // This requires retrievable conversations from the server side. - // const Center(child: ConversationWidget()), - // ]; + static List conversations = []; final scaffoldKey = GlobalKey(); @@ -37,9 +30,12 @@ class _ConversationsListWidgetState extends State { void initState() { super.initState(); Server().init(); - List convos = Server.conversations; - for(Conversation c in convos) { - conversations.add(const ConversationWidget()); + + if(conversations.isEmpty) { + List convoys = Server.conversations; + for(Conversation c in convoys) { + conversations.add(ConversationWidget(conversation: c,)); + } } _model = createModel(context, () => ConversationsListModel()); @@ -53,7 +49,6 @@ class _ConversationsListWidgetState extends State { @override Widget build(BuildContext context) { - List conversations = Server.getConversationsList(); return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) @@ -133,7 +128,7 @@ class _ConversationsListWidgetState extends State { mainAxisSize: MainAxisSize.max, children: [ Text( - conversations[index].conversationLabel, + conversations[index].conversation.conversationLabel, style: AppTheme.headlineLarge, ), ], @@ -147,7 +142,7 @@ class _ConversationsListWidgetState extends State { children: [ Expanded( child: Text( - conversations[index].conversationSubLabel, + conversations[index].conversation.conversationSubLabel, style: AppTheme.bodyMedium, ), ), @@ -181,7 +176,7 @@ class _ConversationsListWidgetState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => const ConversationWidget(), + builder: (context) => ConversationWidget(conversation: Server.getLoadedConversation(),), ), ) }, diff --git a/mobile/app/lib/util/server.dart b/mobile/app/lib/util/server.dart index 00fcf6e..ff280d0 100644 --- a/mobile/app/lib/util/server.dart +++ b/mobile/app/lib/util/server.dart @@ -12,7 +12,8 @@ class Server { static final Server _single_server = Server._internal(); Server._internal(); // TODO: One-time process to establish server connection is required for easy setup/maintenance. - static final url = "http://10.0.2.2:11434/api/"; + static final url = "http://10.0.2.2:11434/api/"; // For emulated device in testing + //static final url = "http://192.168.1.68:11434/api"; // For local access to home server static String endpoint = ""; static final Map headers = {'Content-Type': 'application/json'}; @@ -55,26 +56,26 @@ class Server { conversations.add( Conversation.completeConversation( 0, - "Test label", - "Test sub-label", + "Test Conversation", + "Testing Functionality", [ - (Chat("This is just a test. Only reply Yes.", true)), - (Chat("Yes.", false)), + (Chat("Hello there! You are part of a prototype and are running locally on my Macbook Air. Please keep your responses brief as every prompt freezes my computer.", true)), + (Chat("Understood! How can I help?", false)), ] ) ); - conversations.add( - Conversation.completeConversation( - 1, - "Label test", - "Sub-label Test", - [ - (Chat("A different test. Only reply No.", true)), - (Chat("No.", false)), - ] - ) - ); + // conversations.add( + // Conversation.completeConversation( + // 1, + // "Label test", + // "Sub-label Test", + // [ + // (Chat("A different test. Only reply No.", true)), + // (Chat("No.", false)), + // ] + // ) + // ); }