Compare commits

..

18 commits

Author SHA1 Message Date
Nutcake
ae20d5e869 Fix file move not waiting for download finish 2023-11-14 20:23:03 +01:00
Nutcake
763a426b65
Merge pull request #17 from isovel/main
feat: iOS/macOS support + related internal changes
2023-11-13 22:49:18 +01:00
Garrett Watson
c3c294efcb chore: update app icons for macOS & iOS 2023-11-13 16:43:31 -05:00
Garrett Watson
595ddf8035 chore: address use of then method on awaited future 2023-11-13 12:39:30 -05:00
Garrett Watson
96d95f528d chore: update formatting to use 120 char line length 2023-11-13 12:14:17 -05:00
Garrett Watson
0cf8bde724 chore: remove generated ic_launcher png files 2023-11-13 12:03:06 -05:00
Garrett Watson
976780f72a chore: update build.gradle to reflect correct minSdkVersion 2023-11-13 11:59:35 -05:00
Garrett Watson
673438cbbf chore: update readme 2023-11-13 11:59:17 -05:00
Garrett Watson
2b8eae9050 chore: remove ide-specific files 2023-11-13 11:41:40 -05:00
Garrett Watson
adb1778710 chore: update packages + update build config + add audio playback on iOS/macOS + swap downloader library 2023-11-10 18:40:58 -05:00
Garrett Watson
b998e59c9f Merge branch 'main' of https://github.com/isovel/ReCon 2023-11-06 08:46:06 -05:00
Garrett Watson
71dd14b2f6 chore: update macos podfile 2023-11-06 08:46:05 -05:00
Garrett Watson
958044fd68
Merge pull request #2 from Nutcake/main
[v0.10.3] Merge upstream
2023-11-05 17:23:14 -05:00
Garrett Watson
1ac24c25b8 Merge branch 'main' of https://github.com/isovel/ReCon 2023-10-28 17:12:48 -04:00
Garrett Watson
d4fc7813a0 feat: setup project for xcode builds + add other tabs back 2023-10-28 17:12:09 -04:00
Garrett
32b3875bc5
Update README.md 2023-10-28 14:15:39 -04:00
Garrett
022ade9ea0
Merge pull request #1 from Nutcake/main
chore: merge upstream changes
2023-10-28 12:01:26 -04:00
lumey
07df550681 add web support and remove all tabs except chat 2023-10-19 22:29:46 -04:00
140 changed files with 698 additions and 1063 deletions

2
.gitignore vendored
View file

@ -43,5 +43,3 @@ app.*.map.json
/android/app/profile /android/app/profile
/android/app/release /android/app/release
/android/key.properties /android/key.properties
# NEVER STORE ANY KEY OR API KEYS WHEN COMMITING CODE!!

View file

@ -1,15 +0,0 @@
when:
- event: push
branch: dev
steps:
- name: build
image: instrumentisto/flutter
commands:
- cd OpenContacts
- echo "Starting to build..."
- flutter build --debug
- name: Deploy
image: debian
commands:
- echo "Hello World"

View file

@ -1,15 +1,10 @@
<img src="https://raw.githubusercontent.com/Mrdabup/OpenContacts/refs/heads/dev/assets/images/logo512.png" width="200"/> <img src="https://github.com/Nutcake/ReCon/raw/main/assets/images/logo512.png" width="200"/>
# OpenContacts # ReCon
A Resonite Contacts App, based on Nutcake's Recon. A Resonite Contacts App
[Get the latest version of OpenContacts here](https://git.mrdab.vore.media/ThatOneJackalGuy/OpenContacts/releases)
[Available on github too!](https://github.com/Mrdabup/OpenContacts/releases)
[Get ReCon here](https://github.com/Nutcake/ReCon)
[Get it here](https://github.com/Nutcake/ReCon/releases/latest)
## Building ## Building
@ -20,7 +15,6 @@ Currently only Android is fully supported.
The app works on other platforms, though not every feature will be functional. The app works on other platforms, though not every feature will be functional.
For example, notifications are currently not supported on non-android builds. For example, notifications are currently not supported on non-android builds.
### Screenshots ## Screenshots
TODO: Screenshots!
<!--<img src="https://github.com/Nutcake/ReCon/assets/10452593/a46ccf8a-0a9f-4518-98e6-84fad2d7bf26" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/5d158f58-cd27-4a68-abf3-9068e92b6a82" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/f2ce95ef-e513-46cb-9654-31e74cdc7c09" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/58ef5e5e-1b53-4a47-92f8-bcbcba7a1e86" width=198/>--> <img src="https://github.com/Nutcake/ReCon/assets/10452593/a46ccf8a-0a9f-4518-98e6-84fad2d7bf26" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/5d158f58-cd27-4a68-abf3-9068e92b6a82" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/f2ce95ef-e513-46cb-9654-31e74cdc7c09" width=198/> <img src="https://github.com/Nutcake/ReCon/assets/10452593/58ef5e5e-1b53-4a47-92f8-bcbcba7a1e86" width=198/>

View file

@ -49,7 +49,7 @@ android {
} }
defaultConfig { defaultConfig {
applicationId "de.tojcklguy.opencontacts" applicationId "me.voidspace.recon"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion flutter.targetSdkVersion targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()

View file

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.tojcklguy.opencontacts"> package="de.voidspace.recon">
<!-- The INTERNET permission is required for development. Specifically, <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.

View file

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.tojcklguy.opencontacts"> package="de.voidspace.recon">
<!-- Required to fetch data from the internet. --> <!-- Required to fetch data from the internet. -->
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
@ -7,9 +7,9 @@
<!-- Optional, you'll have to check this permission by yourself. --> <!-- Optional, you'll have to check this permission by yourself. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:label="OpenContacts" android:label="ReCon"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/launcher_icon"> android:icon="@mipmap/ic_launcher">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"

View file

@ -1,6 +1,6 @@
package de.tojcklguy.opencontacts package de.voidspace.recon
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() { class MainActivity: FlutterActivity() {
} }

View file

@ -3,4 +3,4 @@ package me.voidspace.recon
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() { class MainActivity: FlutterActivity() {
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View file

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.tojcklguy.opencontacts"> package="de.voidspace.recon">
<!-- The INTERNET permission is required for development. Specifically, <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

View file

@ -51,9 +51,9 @@ PODS:
- Flutter - Flutter
- flutter_secure_storage (6.0.0): - flutter_secure_storage (6.0.0):
- Flutter - Flutter
- FMDB (2.7.9): - FMDB (2.7.5):
- FMDB/standard (= 2.7.9) - FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.9) - FMDB/standard (2.7.5)
- image_picker_ios (0.0.1): - image_picker_ios (0.0.1):
- Flutter - Flutter
- just_audio (0.0.1): - just_audio (0.0.1):
@ -68,9 +68,9 @@ PODS:
- record_darwin (1.0.0): - record_darwin (1.0.0):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- SDWebImage (5.19.0): - SDWebImage (5.13.2):
- SDWebImage/Core (= 5.19.0) - SDWebImage/Core (= 5.13.2)
- SDWebImage/Core (5.19.0) - SDWebImage/Core (5.13.2)
- share_plus (0.0.1): - share_plus (0.0.1):
- Flutter - Flutter
- sqflite (0.0.3): - sqflite (0.0.3):
@ -161,14 +161,14 @@ SPEC CHECKSUMS:
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
FMDB: aa44149f6fb634b1ac54f64f47064bb0d0c5a032 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
record_darwin: 1f6619f2abac4d1ca91d3eeab038c980d76f1517 record_darwin: 1f6619f2abac4d1ca91d3eeab038c980d76f1517
SDWebImage: 981fd7e860af070920f249fd092420006014c3eb SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866
share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
@ -177,4 +177,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 0a7d5b7d0e53420cb0284f7b2f171f93843b94d2 PODFILE CHECKSUM: 0a7d5b7d0e53420cb0284f7b2f171f93843b94d2
COCOAPODS: 1.14.3 COCOAPODS: 1.12.1

View file

@ -7,15 +7,15 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
0C919EFF59BB245CE33C1729 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD8D55317A9F9C1E8BDC309E /* Pods_RunnerTests.framework */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
3EE80C682BA655DB0086A0C6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D3DE141E94870D9CA578104 /* Pods_Runner.framework */; }; 3EACF4502AF94B2E0009EB00 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3BAB80CE2FD566CD74754C6 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
A04538A4FD002863EA8D7E2E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B83C597EDF1CEFE95FFFB1B /* Pods_RunnerTests.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -31,29 +31,29 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
2A38106953F973A4A4D2889C /* 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 = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
35345364120A3EBED9C200D8 /* 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 = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3D3DE141E94870D9CA578104 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3EACF44C2AF946870009EB00 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; }; 3EACF44C2AF946870009EB00 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
3EACF44D2AF94B1B0009EB00 /* sqflite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = sqflite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3EACF44D2AF94B1B0009EB00 /* sqflite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = sqflite.framework; sourceTree = BUILT_PRODUCTS_DIR; };
4013FCB2867BE8C285FCE973 /* 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 = "<group>"; }; 6357E70700B420135CF38106 /* 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 = "<group>"; };
73E6CA98A4DD47389AC0DD2C /* 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 = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
8B83C597EDF1CEFE95FFFB1B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
947052A3147FEB296CDB1CF8 /* 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 = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* recon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = recon.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* ReCon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReCon.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AD8D55317A9F9C1E8BDC309E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 98689629DBCBD9B9079D4BCB /* 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>"; };
CA3447F4857A0510F7FFE6B7 /* 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 = "<group>"; }; 9B70C4D26DEBAB78C4541963 /* 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 = "<group>"; };
D99312EB7B07F458E04BFDD3 /* 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>"; }; ACF34F80AF1EDFE1E02822A3 /* 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 = "<group>"; };
DB366C7024A03BCB71242FB5 /* 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 = "<group>"; }; C3BAB80CE2FD566CD74754C6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -61,7 +61,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
0C919EFF59BB245CE33C1729 /* Pods_RunnerTests.framework in Frameworks */, A04538A4FD002863EA8D7E2E /* Pods_RunnerTests.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -69,7 +69,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3EE80C682BA655DB0086A0C6 /* Pods_Runner.framework in Frameworks */, 3EACF4502AF94B2E0009EB00 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -110,7 +110,7 @@
97C146EF1CF9000F007C117D /* Products */ = { 97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
97C146EE1CF9000F007C117D /* recon.app */, 97C146EE1CF9000F007C117D /* ReCon.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */, 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
); );
name = Products; name = Products;
@ -135,12 +135,12 @@
EB365C9671FE77D43024480F /* Pods */ = { EB365C9671FE77D43024480F /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
D99312EB7B07F458E04BFDD3 /* Pods-Runner.debug.xcconfig */, 98689629DBCBD9B9079D4BCB /* Pods-Runner.debug.xcconfig */,
4013FCB2867BE8C285FCE973 /* Pods-Runner.release.xcconfig */, ACF34F80AF1EDFE1E02822A3 /* Pods-Runner.release.xcconfig */,
CA3447F4857A0510F7FFE6B7 /* Pods-Runner.profile.xcconfig */, 9B70C4D26DEBAB78C4541963 /* Pods-Runner.profile.xcconfig */,
2A38106953F973A4A4D2889C /* Pods-RunnerTests.debug.xcconfig */, 35345364120A3EBED9C200D8 /* Pods-RunnerTests.debug.xcconfig */,
73E6CA98A4DD47389AC0DD2C /* Pods-RunnerTests.release.xcconfig */, 6357E70700B420135CF38106 /* Pods-RunnerTests.release.xcconfig */,
DB366C7024A03BCB71242FB5 /* Pods-RunnerTests.profile.xcconfig */, 947052A3147FEB296CDB1CF8 /* Pods-RunnerTests.profile.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
@ -149,8 +149,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3EACF44D2AF94B1B0009EB00 /* sqflite.framework */, 3EACF44D2AF94B1B0009EB00 /* sqflite.framework */,
3D3DE141E94870D9CA578104 /* Pods_Runner.framework */, C3BAB80CE2FD566CD74754C6 /* Pods_Runner.framework */,
AD8D55317A9F9C1E8BDC309E /* Pods_RunnerTests.framework */, 8B83C597EDF1CEFE95FFFB1B /* Pods_RunnerTests.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -162,7 +162,7 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = ( buildPhases = (
690A3B0A6C07C9F2F97916FF /* [CP] Check Pods Manifest.lock */, 19ED0D0FE3A6C2191496F46B /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */, 331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */, 331C807F294A63A400263BE5 /* Resources */,
2597599605DD2CD4DB799735 /* Frameworks */, 2597599605DD2CD4DB799735 /* Frameworks */,
@ -181,13 +181,13 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
8BF7047545265288073F8A43 /* [CP] Check Pods Manifest.lock */, 197307D9FE00A90F03801302 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
3E67E7F8ECF942FF5AF50545 /* [CP] Embed Pods Frameworks */, BDF85620D00D0FE7A8BAEF7B /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@ -195,7 +195,7 @@
); );
name = Runner; name = Runner;
productName = Runner; productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* recon.app */; productReference = 97C146EE1CF9000F007C117D /* ReCon.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
@ -205,7 +205,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
BuildIndependentTargetsInParallel = YES; BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1530; LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
331C8080294A63A400263BE5 = { 331C8080294A63A400263BE5 = {
@ -259,62 +259,7 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 197307D9FE00A90F03801302 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
3E67E7F8ECF942FF5AF50545 /* [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;
};
690A3B0A6C07C9F2F97916FF /* [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;
};
8BF7047545265288073F8A43 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -336,6 +281,44 @@
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"; 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; showEnvVarsInLog = 0;
}; };
19ED0D0FE3A6C2191496F46B /* [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;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1; alwaysOutOfDate = 1;
@ -351,6 +334,23 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
}; };
BDF85620D00D0FE7A8BAEF7B /* [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;
};
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
@ -405,7 +405,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_HEADERS = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@ -425,7 +424,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -437,7 +435,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -446,13 +443,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "Downloading assets from your inventory";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Recording voice messages";
INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "";
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -472,9 +464,9 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = P9AV4LPNLL; DEVELOPMENT_TEAM = P9AV4LPNLL;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 0.11.2; FLUTTER_BUILD_NAME = 0.10.3;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -482,9 +474,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 0.11.2; MARKETING_VERSION = 0.10.3;
PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; PRODUCT_BUNDLE_IDENTIFIER = me.voidspace.recon;
PRODUCT_NAME = recon; PRODUCT_NAME = ReCon;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -493,7 +485,7 @@
}; };
331C8088294A63A400263BE5 /* Debug */ = { 331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 2A38106953F973A4A4D2889C /* Pods-RunnerTests.debug.xcconfig */; baseConfigurationReference = 35345364120A3EBED9C200D8 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -511,7 +503,7 @@
}; };
331C8089294A63A400263BE5 /* Release */ = { 331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 73E6CA98A4DD47389AC0DD2C /* Pods-RunnerTests.release.xcconfig */; baseConfigurationReference = 6357E70700B420135CF38106 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -527,7 +519,7 @@
}; };
331C808A294A63A400263BE5 /* Profile */ = { 331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = DB366C7024A03BCB71242FB5 /* Pods-RunnerTests.profile.xcconfig */; baseConfigurationReference = 947052A3147FEB296CDB1CF8 /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@ -545,7 +537,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_HEADERS = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@ -565,7 +556,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -577,7 +567,6 @@
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
@ -592,13 +581,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "Downloading assets from your inventory";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Recording voice messages";
INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "";
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
@ -611,7 +595,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO; ALWAYS_SEARCH_USER_PATHS = NO;
APPLY_RULES_IN_COPY_HEADERS = YES;
CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++"; CLANG_CXX_LIBRARY = "libc++";
@ -631,7 +614,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -643,7 +625,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -652,13 +633,8 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
INFOPLIST_KEY_NSDownloadsFolderUsageDescription = "Downloading assets from your inventory";
INFOPLIST_KEY_NSMicrophoneUsageDescription = "Recording voice messages";
INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "";
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -680,9 +656,9 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = P9AV4LPNLL; DEVELOPMENT_TEAM = P9AV4LPNLL;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 0.11.2; FLUTTER_BUILD_NAME = 0.10.3;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -690,9 +666,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 0.11.2; MARKETING_VERSION = 0.10.3;
PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; PRODUCT_BUNDLE_IDENTIFIER = me.voidspace.recon;
PRODUCT_NAME = recon; PRODUCT_NAME = ReCon;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -710,9 +686,9 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = P9AV4LPNLL; DEVELOPMENT_TEAM = P9AV4LPNLL;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FLUTTER_BUILD_NAME = 0.11.2; FLUTTER_BUILD_NAME = 0.10.3;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = recon; INFOPLIST_KEY_CFBundleDisplayName = ReCon;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
IPHONEOS_DEPLOYMENT_TARGET = 13.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -720,9 +696,9 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 0.11.2; MARKETING_VERSION = 0.10.3;
PRODUCT_BUNDLE_IDENTIFIER = ch.isota.recon; PRODUCT_BUNDLE_IDENTIFIER = me.voidspace.recon;
PRODUCT_NAME = recon; PRODUCT_NAME = ReCon;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -765,4 +741,4 @@
/* End XCConfigurationList section */ /* End XCConfigurationList section */
}; };
rootObject = 97C146E61CF9000F007C117D /* Project object */; rootObject = 97C146E61CF9000F007C117D /* Project object */;
} }

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1530" LastUpgradeVersion = "1430"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@ -15,7 +15,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D" BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "recon.app" BuildableName = "ReCon.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
@ -31,7 +31,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D" BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "recon.app" BuildableName = "ReCon.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
@ -65,7 +65,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D" BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "recon.app" BuildableName = "ReCon.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
@ -82,7 +82,7 @@
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D" BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "recon.app" BuildableName = "ReCon.app"
BlueprintName = "Runner" BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj"> ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference> </BuildableReference>
@ -93,7 +93,7 @@
</AnalyzeAction> </AnalyzeAction>
<ArchiveAction <ArchiveAction
buildConfiguration = "Release" buildConfiguration = "Release"
customArchiveName = "recon" customArchiveName = "ReCon"
revealArchiveInOrganizer = "YES"> revealArchiveInOrganizer = "YES">
</ArchiveAction> </ArchiveAction>
</Scheme> </Scheme>

View file

@ -1,134 +1,104 @@
{ {
"images" : [ "images": [
{ {
"filename" : "icon_40x40@2x.png", "filename": "Icon_40x40@2x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "20x20" "size": "40x40"
}, },
{ {
"filename" : "icon_60x60@3x.png", "filename": "Icon_58x58@2x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "3x", "scale": "2x",
"size" : "20x20" "size": "58x58"
}, },
{ {
"filename" : "icon_58x58@2x.png", "filename": "Icon_60x60@3x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "2x", "scale": "3x",
"size" : "29x29" "size": "60x60"
}, },
{ {
"filename" : "icon_87x87@3x.png", "filename": "Icon_76x76@2x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "3x", "scale": "2x",
"size" : "29x29" "size": "76x76"
}, },
{ {
"filename" : "icon_80x80@2x.png", "filename": "Icon_80x80@2x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "40x40" "size": "80x80"
}, },
{ {
"filename" : "icon_120x120@3x.png", "filename": "Icon_87x87@3x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "3x", "scale": "3x",
"size" : "40x40" "size": "87x87"
}, },
{ {
"filename" : "icon_60x60@2x.png", "filename": "Icon_114x114@3x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "2x", "scale": "3x",
"size" : "60x60" "size": "114x114"
}, },
{ {
"filename" : "icon_180x180@3x.png", "filename": "Icon_120x120@2x.png",
"idiom" : "iphone", "idiom": "universal",
"scale" : "3x", "scale": "2x",
"size" : "60x60" "size": "120x120"
}, },
{ {
"filename" : "icon_40x40@2x 1.png", "filename": "Icon_120x120@3x.png",
"idiom" : "ipad", "idiom": "universal",
"scale" : "2x", "scale": "3x",
"size" : "20x20" "size": "120x120"
}, },
{ {
"filename" : "icon_58x58@2x 1.png", "filename": "Icon_128x128@2x.png",
"idiom" : "ipad", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "29x29" "size": "128x128"
}, },
{ {
"filename" : "icon_80x80@2x 1.png", "filename": "Icon_136x136@2x.png",
"idiom" : "ipad", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "40x40" "size": "136x136"
}, },
{ {
"filename" : "icon_76x76@2x.png", "filename": "Icon_152x152@2x.png",
"idiom" : "ipad", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "76x76" "size": "152x152"
}, },
{ {
"filename" : "icon_83.5x83.5@2x.png", "filename": "Icon_167x167@2x.png",
"idiom" : "ipad", "idiom": "universal",
"scale" : "2x", "scale": "2x",
"size" : "83.5x83.5" "size": "167x167"
}, },
{ {
"filename" : "icon_1024x1024.png", "filename": "Icon_180x180@3x.png",
"idiom" : "ios-marketing", "idiom": "universal",
"scale" : "1x", "scale": "3x",
"size" : "1024x1024" "size": "180x180"
}, },
{ {
"filename" : "icon_114x114@3x.png", "filename": "Icon_192x192@3x.png",
"idiom" : "universal", "idiom": "universal",
"scale" : "3x", "scale": "3x",
"size" : "114x114" "size": "192x192"
}, },
{ {
"filename" : "icon_120x120@2x.png", "filename": "Icon-App-iTunes.png",
"idiom" : "universal", "idiom": "ios-marketing",
"scale" : "2x", "scale": "1x",
"size" : "120x120" "size": "1024x1024"
},
{
"filename" : "icon_128x128@2x.png",
"idiom" : "universal",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "icon_136x136@2x.png",
"idiom" : "universal",
"scale" : "2x",
"size" : "136x136"
},
{
"filename" : "icon_152x152@2x.png",
"idiom" : "universal",
"scale" : "2x",
"size" : "152x152"
},
{
"filename" : "icon_167x167@2x.png",
"idiom" : "universal",
"scale" : "2x",
"size" : "167x167"
},
{
"filename" : "icon_192x192@3x.png",
"idiom" : "universal",
"scale" : "3x",
"size" : "192x192"
} }
], ],
"info" : { "info": {
"author" : "xcode", "author": "me.voidspace",
"version" : 1 "version": 1
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View file

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 265 KiB

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View file

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View file

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View file

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 3 KiB

View file

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View file

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22684"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--View Controller--> <!--View Controller-->
@ -16,14 +14,12 @@
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
<rect key="frame" x="196.33333333333334" y="426" width="0.33333333333334281" height="0.33333333333331439"/>
</imageView> </imageView>
</subviews> </subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints> <constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
@ -32,10 +28,10 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="80.916030534351137" y="264.08450704225356"/> <point key="canvasLocation" x="53" y="375"/>
</scene> </scene>
</scenes> </scenes>
<resources> <resources>
<image name="LaunchImage" width="0.3333333432674408" height="0.3333333432674408"/> <image name="LaunchImage" width="168" height="185"/>
</resources> </resources>
</document> </document>

View file

@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>recon</string> <string>ReCon</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -15,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
<string>recon</string> <string>ReCon</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
@ -32,6 +32,7 @@
<array> <array>
<string>fetch</string> <string>fetch</string>
<string>processing</string> <string>processing</string>
<string>remote-notification</string>
</array> </array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen.storyboard</string> <string>LaunchScreen.storyboard</string>
@ -40,13 +41,15 @@
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UISupportedInterfaceOrientations~ipad</key> <key>UISupportedInterfaceOrientations~ipad</key>
<array> <array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string> <string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View file

@ -4,7 +4,7 @@
<dict> <dict>
<key>keychain-access-groups</key> <key>keychain-access-groups</key>
<array> <array>
<string>$(AppIdentifierPrefix)ch.isota.recon</string> <string>$(AppIdentifierPrefix)me.voidspace.recon</string>
</array> </array>
</dict> </dict>
</plist> </plist>

View file

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/cloud_variable.dart'; import 'package:recon/models/cloud_variable.dart';
class CloudVariableApi { class CloudVariableApi {
static Future<CloudVariable> readCloudVariable(ApiClient client, static Future<CloudVariable> readCloudVariable(ApiClient client,

View file

@ -1,11 +1,11 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/users/friend.dart'; import 'package:recon/models/users/friend.dart';
import 'package:OpenContacts/models/users/friend_status.dart'; import 'package:recon/models/users/friend_status.dart';
import 'package:OpenContacts/models/users/user.dart'; import 'package:recon/models/users/user.dart';
import 'package:OpenContacts/models/users/user_profile.dart'; import 'package:recon/models/users/user_profile.dart';
import 'package:OpenContacts/models/users/user_status.dart'; import 'package:recon/models/users/user_status.dart';
class ContactApi { class ContactApi {
static Future<List<Friend>> getFriendsList(ApiClient client, {DateTime? lastStatusUpdate}) async { static Future<List<Friend>> getFriendsList(ApiClient client, {DateTime? lastStatusUpdate}) async {

View file

@ -3,10 +3,10 @@ import 'dart:convert';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
class GithubApi { class GithubApi {
static const baseUrl = "https://git.mrdab.vore.media/api/v1"; static const baseUrl = "https://api.github.com";
static Future<String> getLatestTagName() async { static Future<String> getLatestTagName() async {
final response = await http.get(Uri.parse("$baseUrl/repos/ThatOneJackalGuy/OpenContacts/releases?per_page=1")); final response = await http.get(Uri.parse("$baseUrl/repos/Nutcake/ReCon/releases?per_page=1"));
if (response.statusCode != 200) return ""; if (response.statusCode != 200) return "";
final body = jsonDecode(response.body) as List; final body = jsonDecode(response.body) as List;
if (body.isEmpty) return ""; if (body.isEmpty) return "";

View file

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/message.dart'; import 'package:recon/models/message.dart';
class MessageApi { class MessageApi {
static Future<List<Message>> getUserMessages(ApiClient client, {String userId = "", DateTime? fromTime, static Future<List<Message>> getUserMessages(ApiClient client, {String userId = "", DateTime? fromTime,

View file

@ -3,16 +3,16 @@ import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:OpenContacts/models/records/asset_digest.dart'; import 'package:recon/models/records/asset_digest.dart';
import 'package:OpenContacts/models/records/json_template.dart'; import 'package:recon/models/records/json_template.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/records/asset_upload_data.dart'; import 'package:recon/models/records/asset_upload_data.dart';
import 'package:OpenContacts/models/records/resonite_db_asset.dart'; import 'package:recon/models/records/resonite_db_asset.dart';
import 'package:OpenContacts/models/records/preprocess_status.dart'; import 'package:recon/models/records/preprocess_status.dart';
import 'package:OpenContacts/models/records/record.dart'; import 'package:recon/models/records/record.dart';
import 'package:http_parser/http_parser.dart'; import 'package:http_parser/http_parser.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';

View file

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/session.dart'; import 'package:recon/models/session.dart';
class SessionApi { class SessionApi {
static Future<Session> getSession(ApiClient client, {required String sessionId}) async { static Future<Session> getSession(ApiClient client, {required String sessionId}) async {

View file

@ -1,9 +1,9 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/personal_profile.dart'; import 'package:recon/models/personal_profile.dart';
import 'package:OpenContacts/models/users/user.dart'; import 'package:recon/models/users/user.dart';
import 'package:OpenContacts/models/users/user_status.dart'; import 'package:recon/models/users/user_status.dart';
class UserApi { class UserApi {
static Future<Iterable<User>> searchUsers(ApiClient client, {required String needle}) async { static Future<Iterable<User>> searchUsers(ApiClient client, {required String needle}) async {

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/config.dart'; import 'package:recon/config.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'package:html/parser.dart' as htmlparser; import 'package:html/parser.dart' as htmlparser;

View file

@ -1,8 +1,8 @@
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/clients/notification_client.dart'; import 'package:recon/clients/notification_client.dart';
import 'package:OpenContacts/clients/settings_client.dart'; import 'package:recon/clients/settings_client.dart';
import 'package:OpenContacts/models/authentication_data.dart'; import 'package:recon/models/authentication_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ClientHolder extends InheritedWidget { class ClientHolder extends InheritedWidget {

View file

@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:OpenContacts/models/authentication_data.dart'; import 'package:recon/models/authentication_data.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';

View file

@ -4,9 +4,9 @@ import 'package:ffmpeg_kit_flutter_audio/ffmpeg_kit.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/message.dart'; import 'package:recon/models/message.dart';
class AudioCacheClient { class AudioCacheClient {
final Future<Directory> _directoryFuture = getTemporaryDirectory(); final Future<Directory> _directoryFuture = getTemporaryDirectory();

View file

@ -1,24 +1,20 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:OpenContacts/apis/record_api.dart'; import 'package:recon/apis/record_api.dart';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/models/inventory/resonite_directory.dart'; import 'package:recon/models/inventory/resonite_directory.dart';
import 'package:OpenContacts/models/records/record.dart'; import 'package:recon/models/records/record.dart';
enum SortMode { enum SortMode {
name, name,
date, date;
resonite;
int sortFunction(Record a, Record b, {bool reverse = false}) { int sortFunction(Record a, Record b, {bool reverse = false}) {
final func = switch (this) { final func = switch (this) {
SortMode.name => (Record x, Record y) => SortMode.name => (Record x, Record y) =>
x.formattedName.toString().toLowerCase().compareTo(y.formattedName.toString().toLowerCase()), x.formattedName.toString().toLowerCase().compareTo(y.formattedName.toString().toLowerCase()),
SortMode.date => (Record x, Record y) => x.creationTime.compareTo(y.creationTime), SortMode.date => (Record x, Record y) => x.creationTime.compareTo(y.creationTime),
SortMode.resonite => (Record x, Record y) => x.isItem
? x.creationTime.compareTo(y.creationTime)
: x.formattedName.toString().toLowerCase().compareTo(y.formattedName.toString().toLowerCase()),
}; };
if (reverse) { if (reverse) {
return func(b, a); return func(b, a);
@ -28,8 +24,7 @@ enum SortMode {
static const Map<SortMode, IconData> _iconsMap = { static const Map<SortMode, IconData> _iconsMap = {
SortMode.name: Icons.sort_by_alpha, SortMode.name: Icons.sort_by_alpha,
SortMode.date: Icons.access_time_outlined, SortMode.date: Icons.access_time_outlined
SortMode.resonite: Icons.star_border_purple500_sharp,
}; };
IconData get icon => _iconsMap[this] ?? Icons.question_mark; IconData get icon => _iconsMap[this] ?? Icons.question_mark;
@ -40,7 +35,7 @@ class InventoryClient extends ChangeNotifier {
final Map<String, Record> _selectedRecords = {}; final Map<String, Record> _selectedRecords = {};
Future<ResoniteDirectory>? _currentDirectory; Future<ResoniteDirectory>? _currentDirectory;
SortMode _sortMode = SortMode.resonite; SortMode _sortMode = SortMode.name;
bool _sortReverse = false; bool _sortReverse = false;
InventoryClient({required this.apiClient}); InventoryClient({required this.apiClient});

View file

@ -1,25 +1,26 @@
import 'dart:async'; import 'dart:async';
import 'package:recon/apis/contact_api.dart';
import 'package:recon/apis/message_api.dart';
import 'package:recon/apis/session_api.dart';
import 'package:recon/apis/user_api.dart';
import 'package:recon/clients/api_client.dart';
import 'package:recon/clients/notification_client.dart';
import 'package:recon/clients/settings_client.dart';
import 'package:recon/crypto_helper.dart';
import 'package:recon/hub_manager.dart';
import 'package:recon/models/hub_events.dart';
import 'package:recon/models/message.dart';
import 'package:recon/models/session.dart';
import 'package:recon/models/users/friend.dart';
import 'package:recon/models/users/online_status.dart';
import 'package:recon/models/users/user_status.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:OpenContacts/apis/contact_api.dart';
import 'package:OpenContacts/apis/message_api.dart';
import 'package:OpenContacts/apis/session_api.dart';
import 'package:OpenContacts/apis/user_api.dart';
import 'package:OpenContacts/clients/api_client.dart';
import 'package:OpenContacts/clients/notification_client.dart';
import 'package:OpenContacts/clients/settings_client.dart';
import 'package:OpenContacts/crypto_helper.dart';
import 'package:OpenContacts/hub_manager.dart';
import 'package:OpenContacts/models/hub_events.dart';
import 'package:OpenContacts/models/message.dart';
import 'package:OpenContacts/models/session.dart';
import 'package:OpenContacts/models/users/friend.dart';
import 'package:OpenContacts/models/users/online_status.dart';
import 'package:OpenContacts/models/users/user_status.dart';
class MessagingClient extends ChangeNotifier { class MessagingClient extends ChangeNotifier {
static const Duration _autoRefreshDuration = Duration(seconds: 10); static const Duration _autoRefreshDuration = Duration(seconds: 10);
@ -48,13 +49,11 @@ class MessagingClient extends ChangeNotifier {
UserStatus get userStatus => _userStatus; UserStatus get userStatus => _userStatus;
MessagingClient( MessagingClient({required ApiClient apiClient, required NotificationClient notificationClient, required SettingsClient settingsClient})
{required ApiClient apiClient,
required NotificationClient notificationClient,
required SettingsClient settingsClient})
: _apiClient = apiClient, : _apiClient = apiClient,
_notificationClient = notificationClient, _notificationClient = notificationClient,
_settingsClient = settingsClient { _settingsClient = settingsClient
{
debugPrint("mClient created: $hashCode"); debugPrint("mClient created: $hashCode");
Hive.openBox(_messageBoxKey).then((box) async { Hive.openBox(_messageBoxKey).then((box) async {
await box.delete(_lastUpdateKey); await box.delete(_lastUpdateKey);
@ -223,46 +222,14 @@ class MessagingClient extends ChangeNotifier {
} catch (_) {} } catch (_) {}
} }
// Calculate online status value, with 'headless' between 'busy' and 'offline'
double getOnlineStatusValue(Friend friend) {
// Adjusting values to ensure correct placement of 'headless'
if (friend.isHeadless) return 2.5;
switch (friend.userStatus.onlineStatus) {
case OnlineStatus.sociable:
return 0;
case OnlineStatus.online:
return 1;
case OnlineStatus.away:
return 2;
case OnlineStatus.busy:
return 3;
case OnlineStatus.invisible:
return 3.5;
case OnlineStatus.offline:
default:
return 4;
}
}
void _sortFriendsCache() { void _sortFriendsCache() {
_sortedFriendsCache.sort((a, b) { _sortedFriendsCache.sort((a, b) {
// Check for unreads and sort by latest message time if either has unreads var aVal = friendHasUnreads(a) ? -3 : 0;
bool aHasUnreads = friendHasUnreads(a); var bVal = friendHasUnreads(b) ? -3 : 0;
bool bHasUnreads = friendHasUnreads(b);
if (aHasUnreads || bHasUnreads) {
if (aHasUnreads && bHasUnreads) {
return -a.latestMessageTime.compareTo(b.latestMessageTime);
}
return aHasUnreads ? -1 : 1; aVal -= a.latestMessageTime.compareTo(b.latestMessageTime);
} aVal += a.userStatus.onlineStatus.compareTo(b.userStatus.onlineStatus) * 2;
return aVal.compareTo(bVal);
int onlineStatusComparison = getOnlineStatusValue(a).compareTo(getOnlineStatusValue(b));
if (onlineStatusComparison != 0) {
return onlineStatusComparison;
}
return -a.latestMessageTime.compareTo(b.latestMessageTime);
}); });
} }
@ -313,8 +280,7 @@ class MessagingClient extends ChangeNotifier {
await _refreshUnreads(); await _refreshUnreads();
_unreadSafeguard = Timer.periodic(_unreadSafeguardDuration, (timer) => _refreshUnreads()); _unreadSafeguard = Timer.periodic(_unreadSafeguardDuration, (timer) => _refreshUnreads());
_hubManager.send("RequestStatus", arguments: [null, false]); _hubManager.send("RequestStatus", arguments: [null, false]);
final lastOnline = final lastOnline = OnlineStatus.values.elementAtOrNull(_settingsClient.currentSettings.lastOnlineStatus.valueOrDefault);
OnlineStatus.values.elementAtOrNull(_settingsClient.currentSettings.lastOnlineStatus.valueOrDefault);
await setOnlineStatus(lastOnline ?? OnlineStatus.online); await setOnlineStatus(lastOnline ?? OnlineStatus.online);
_statusHeartbeat = Timer.periodic(_statusHeartbeatDuration, (timer) { _statusHeartbeat = Timer.periodic(_statusHeartbeatDuration, (timer) {
setOnlineStatus(_userStatus.onlineStatus); setOnlineStatus(_userStatus.onlineStatus);
@ -366,9 +332,7 @@ class MessagingClient extends ChangeNotifier {
var status = UserStatus.fromMap(statusUpdate); var status = UserStatus.fromMap(statusUpdate);
final sessionMap = createSessionMap(status.hashSalt); final sessionMap = createSessionMap(status.hashSalt);
status = status.copyWith( status = status.copyWith(
decodedSessions: status.sessions decodedSessions: status.sessions.map((e) => sessionMap[e.sessionHash] ?? Session.none().copyWith(accessLevel: e.accessLevel)).toList());
.map((e) => sessionMap[e.sessionHash] ?? Session.none().copyWith(accessLevel: e.accessLevel))
.toList());
final friend = getAsFriend(statusUpdate["userId"])?.copyWith(userStatus: status); final friend = getAsFriend(statusUpdate["userId"])?.copyWith(userStatus: status);
if (friend != null) { if (friend != null) {
_updateContact(friend); _updateContact(friend);

View file

@ -2,9 +2,9 @@ import 'dart:convert';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart' as fln; import 'package:flutter_local_notifications/flutter_local_notifications.dart' as fln;
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/models/message.dart'; import 'package:recon/models/message.dart';
import 'package:OpenContacts/models/session.dart'; import 'package:recon/models/session.dart';
class NotificationChannel { class NotificationChannel {
final String id; final String id;
@ -26,7 +26,7 @@ class NotificationClient {
android: fln.AndroidInitializationSettings("ic_notification"), android: fln.AndroidInitializationSettings("ic_notification"),
iOS: fln.DarwinInitializationSettings(), iOS: fln.DarwinInitializationSettings(),
macOS: fln.DarwinInitializationSettings(), macOS: fln.DarwinInitializationSettings(),
linux: fln.LinuxInitializationSettings(defaultActionName: "Open OpenContacts"), linux: fln.LinuxInitializationSettings(defaultActionName: "Open ReCon"),
)); ));
Future<void> showUnreadMessagesNotification(Iterable<Message> messages) async { Future<void> showUnreadMessagesNotification(Iterable<Message> messages) async {

View file

@ -1,8 +1,8 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:OpenContacts/apis/session_api.dart'; import 'package:recon/apis/session_api.dart';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/clients/settings_client.dart'; import 'package:recon/clients/settings_client.dart';
import 'package:OpenContacts/models/session.dart'; import 'package:recon/models/session.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
class SessionClient extends ChangeNotifier { class SessionClient extends ChangeNotifier {

View file

@ -1,6 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/models/settings.dart'; import 'package:recon/models/settings.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';

View file

@ -3,8 +3,8 @@ import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:OpenContacts/config.dart'; import 'package:recon/config.dart';
import 'package:OpenContacts/models/hub_events.dart'; import 'package:recon/models/hub_events.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';

View file

@ -13,17 +13,17 @@ import 'package:intl/intl.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:OpenContacts/apis/github_api.dart'; import 'package:recon/apis/github_api.dart';
import 'package:OpenContacts/client_holder.dart'; import 'package:recon/client_holder.dart';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/clients/inventory_client.dart'; import 'package:recon/clients/inventory_client.dart';
import 'package:OpenContacts/clients/messaging_client.dart'; import 'package:recon/clients/messaging_client.dart';
import 'package:OpenContacts/clients/session_client.dart'; import 'package:recon/clients/session_client.dart';
import 'package:OpenContacts/clients/settings_client.dart'; import 'package:recon/clients/settings_client.dart';
import 'package:OpenContacts/models/sem_ver.dart'; import 'package:recon/models/sem_ver.dart';
import 'package:OpenContacts/widgets/homepage.dart'; import 'package:recon/widgets/homepage.dart';
import 'package:OpenContacts/widgets/login_screen.dart'; import 'package:recon/widgets/login_screen.dart';
import 'package:OpenContacts/widgets/update_notifier.dart'; import 'package:recon/widgets/update_notifier.dart';
import 'models/authentication_data.dart'; import 'models/authentication_data.dart';
@ -59,20 +59,20 @@ void main() async {
// Ignore // Ignore
} }
runApp(recon(settingsClient: settingsClient, cachedAuthentication: cachedAuth)); runApp(ReCon(settingsClient: settingsClient, cachedAuthentication: cachedAuth));
} }
class recon extends StatefulWidget { class ReCon extends StatefulWidget {
const recon({required this.settingsClient, required this.cachedAuthentication, super.key}); const ReCon({required this.settingsClient, required this.cachedAuthentication, super.key});
final SettingsClient settingsClient; final SettingsClient settingsClient;
final AuthenticationData cachedAuthentication; final AuthenticationData cachedAuthentication;
@override @override
State<recon> createState() => _reconState(); State<ReCon> createState() => _ReConState();
} }
class _reconState extends State<recon> { class _ReConState extends State<ReCon> {
final Typography _typography = Typography.material2021(platform: defaultTargetPlatform); final Typography _typography = Typography.material2021(platform: defaultTargetPlatform);
final ReceivePort _port = ReceivePort(); final ReceivePort _port = ReceivePort();
late AuthenticationData _authData = widget.cachedAuthentication; late AuthenticationData _authData = widget.cachedAuthentication;
@ -164,8 +164,8 @@ class _reconState extends State<recon> {
}, },
child: DynamicColorBuilder( child: DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) => MaterialApp( builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) => MaterialApp(
debugShowCheckedModeBanner: true, debugShowCheckedModeBanner: false,
title: 'OpenContacts', title: 'ReCon',
theme: ThemeData( theme: ThemeData(
useMaterial3: true, useMaterial3: true,
textTheme: _typography.black, textTheme: _typography.black,

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
class CloudVariable { class CloudVariable {
final String ownerId; final String ownerId;

View file

@ -1,5 +1,5 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:OpenContacts/models/records/record.dart'; import 'package:recon/models/records/record.dart';
class ResoniteDirectory { class ResoniteDirectory {
static const rootName = "Inventory"; static const rootName = "Inventory";

View file

@ -1,10 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:OpenContacts/clients/api_client.dart'; import 'package:recon/clients/api_client.dart';
import 'package:OpenContacts/apis/message_api.dart'; import 'package:recon/apis/message_api.dart';
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/string_formatter.dart'; import 'package:recon/string_formatter.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
enum MessageType { enum MessageType {

View file

@ -1,6 +1,6 @@
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/models/users/entitlement.dart'; import 'package:recon/models/users/entitlement.dart';
import 'package:OpenContacts/models/users/user_profile.dart'; import 'package:recon/models/users/user_profile.dart';
class PersonalProfile { class PersonalProfile {
final String id; final String id;

View file

@ -1,5 +1,5 @@
import 'package:OpenContacts/models/records/resonite_db_asset.dart'; import 'package:recon/models/records/resonite_db_asset.dart';
class AssetDiff extends ResoniteDBAsset{ class AssetDiff extends ResoniteDBAsset{
final Diff state; final Diff state;

View file

@ -1,7 +1,7 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:OpenContacts/models/records/resonite_db_asset.dart'; import 'package:recon/models/records/resonite_db_asset.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
class AssetDigest { class AssetDigest {

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/models/records/asset_diff.dart'; import 'package:recon/models/records/asset_diff.dart';
enum RecordPreprocessState enum RecordPreprocessState
{ {

View file

@ -1,8 +1,8 @@
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/models/message.dart'; import 'package:recon/models/message.dart';
import 'package:OpenContacts/models/records/asset_digest.dart'; import 'package:recon/models/records/asset_digest.dart';
import 'package:OpenContacts/models/records/resonite_db_asset.dart'; import 'package:recon/models/records/resonite_db_asset.dart';
import 'package:OpenContacts/string_formatter.dart'; import 'package:recon/string_formatter.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/string_formatter.dart'; import 'package:recon/string_formatter.dart';
class Session { class Session {
final String id; final String id;
@ -131,7 +131,6 @@ class Session {
enum SessionAccessLevel { enum SessionAccessLevel {
unknown, unknown,
private, private,
lan,
contacts, contacts,
contactsPlus, contactsPlus,
registeredUsers, registeredUsers,
@ -140,7 +139,6 @@ enum SessionAccessLevel {
static const _readableNamesMap = { static const _readableNamesMap = {
SessionAccessLevel.unknown: "Unknown", SessionAccessLevel.unknown: "Unknown",
SessionAccessLevel.private: "Private", SessionAccessLevel.private: "Private",
SessionAccessLevel.lan: "LAN",
SessionAccessLevel.contacts: "Contacts only", SessionAccessLevel.contacts: "Contacts only",
SessionAccessLevel.contactsPlus: "Contacts+", SessionAccessLevel.contactsPlus: "Contacts+",
SessionAccessLevel.registeredUsers: "Registered users", SessionAccessLevel.registeredUsers: "Registered users",

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/models/session.dart'; import 'package:recon/models/session.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class SessionMetadata { class SessionMetadata {

View file

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:OpenContacts/models/sem_ver.dart'; import 'package:recon/models/sem_ver.dart';
import 'package:OpenContacts/models/users/online_status.dart'; import 'package:recon/models/users/online_status.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
class Entitlement { class Entitlement {
Entitlement(); Entitlement();

View file

@ -1,8 +1,8 @@
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/models/users/friend_status.dart'; import 'package:recon/models/users/user_profile.dart';
import 'package:OpenContacts/models/users/online_status.dart'; import 'package:recon/models/users/friend_status.dart';
import 'package:OpenContacts/models/users/user_profile.dart'; import 'package:recon/models/users/online_status.dart';
import 'package:OpenContacts/models/users/user_status.dart'; import 'package:recon/models/users/user_status.dart';
class Friend implements Comparable { class Friend implements Comparable {
static const _emptyId = "-1"; static const _emptyId = "-1";
@ -15,26 +15,11 @@ class Friend implements Comparable {
final FriendStatus contactStatus; final FriendStatus contactStatus;
final DateTime latestMessageTime; final DateTime latestMessageTime;
const Friend({ const Friend({required this.id, required this.username, required this.ownerId, required this.userStatus, required this.userProfile,
required this.id, required this.contactStatus, required this.latestMessageTime,
required this.username,
required this.ownerId,
required this.userStatus,
required this.userProfile,
required this.contactStatus,
required this.latestMessageTime,
}); });
bool get isHeadless => userStatus.sessionType == UserSessionType.headless; bool get isHeadless => userStatus.outputDevice == "Headless";
bool get isBot => userStatus.sessionType == UserSessionType.bot || id == _resoniteBotId;
bool get isOffline =>
(userStatus.onlineStatus == OnlineStatus.offline || userStatus.onlineStatus == OnlineStatus.invisible) &&
!isBot &&
!isHeadless;
bool get isOnline => !isOffline;
factory Friend.fromMap(Map map) { factory Friend.fromMap(Map map) {
var userStatus = map["userStatus"] == null ? UserStatus.empty() : UserStatus.fromMap(map["userStatus"]); var userStatus = map["userStatus"] == null ? UserStatus.empty() : UserStatus.fromMap(map["userStatus"]);
@ -42,13 +27,12 @@ class Friend implements Comparable {
id: map["id"], id: map["id"],
username: map["contactUsername"], username: map["contactUsername"],
ownerId: map["ownerId"] ?? map["id"], ownerId: map["ownerId"] ?? map["id"],
// Resonite bot status is always offline but should be displayed as online // Neos bot status is always offline but should be displayed as online
userStatus: map["id"] == _resoniteBotId ? userStatus.copyWith(onlineStatus: OnlineStatus.online) : userStatus, userStatus: map["id"] == _resoniteBotId ? userStatus.copyWith(onlineStatus: OnlineStatus.online) : userStatus,
userProfile: UserProfile.fromMap(map["profile"] ?? {}), userProfile: UserProfile.fromMap(map["profile"] ?? {}),
contactStatus: FriendStatus.fromString(map["contactStatus"]), contactStatus: FriendStatus.fromString(map["contactStatus"]),
latestMessageTime: map["latestMessageTime"] == null latestMessageTime: map["latestMessageTime"] == null
? DateTime.fromMillisecondsSinceEpoch(0) ? DateTime.fromMillisecondsSinceEpoch(0) : DateTime.parse(map["latestMessageTime"]),
: DateTime.parse(map["latestMessageTime"]),
); );
} }
@ -59,26 +43,21 @@ class Friend implements Comparable {
factory Friend.empty() { factory Friend.empty() {
return Friend( return Friend(
id: _emptyId, id: _emptyId,
username: "", username: "",
ownerId: "", ownerId: "",
userStatus: UserStatus.empty(), userStatus: UserStatus.empty(),
userProfile: UserProfile.empty(), userProfile: UserProfile.empty(),
contactStatus: FriendStatus.none, contactStatus: FriendStatus.none,
latestMessageTime: DateTimeX.epoch, latestMessageTime: DateTimeX.epoch
); );
} }
bool get isEmpty => id == _emptyId; bool get isEmpty => id == _emptyId;
Friend copyWith( Friend copyWith({
{String? id, String? id, String? username, String? ownerId, UserStatus? userStatus, UserProfile? userProfile,
String? username, FriendStatus? contactStatus, DateTime? latestMessageTime}) {
String? ownerId,
UserStatus? userStatus,
UserProfile? userProfile,
FriendStatus? contactStatus,
DateTime? latestMessageTime}) {
return Friend( return Friend(
id: id ?? this.id, id: id ?? this.id,
username: username ?? this.username, username: username ?? this.username,
@ -90,7 +69,7 @@ class Friend implements Comparable {
); );
} }
Map toMap({bool shallow = false}) { Map toMap({bool shallow=false}) {
return { return {
"id": id, "id": id,
"contactUsername": username, "contactUsername": username,

View file

@ -5,33 +5,26 @@ enum OnlineStatus {
invisible, invisible,
away, away,
busy, busy,
online, online;
sociable;
static final List<Color> _colors = [ static final List<Color> _colors = [
Colors.transparent, Colors.transparent,
Colors.grey, Colors.transparent,
Colors.yellow, Colors.yellow,
Colors.red, Colors.red,
Colors.green, Colors.green,
Colors.blue,
]; ];
Color color(BuildContext context) => this == OnlineStatus.offline || this == OnlineStatus.invisible Color color(BuildContext context) => this == OnlineStatus.offline || this == OnlineStatus.invisible ? Theme.of(context).colorScheme.onSurface : _colors[index];
? Theme.of(context).colorScheme.onSecondaryContainer.withAlpha(150)
: _colors[index];
factory OnlineStatus.fromString(String? text) { factory OnlineStatus.fromString(String? text) {
return OnlineStatus.values.firstWhere( return OnlineStatus.values.firstWhere((element) => element.name.toLowerCase() == text?.toLowerCase(),
(element) => element.name.toLowerCase() == text?.toLowerCase(),
orElse: () => OnlineStatus.online, orElse: () => OnlineStatus.online,
); );
} }
int compareTo(OnlineStatus other) { int compareTo(OnlineStatus other) {
if (this == other) return 0; if (this == other) return 0;
if (this == OnlineStatus.sociable) return -1;
if (other == OnlineStatus.sociable) return 1;
if (this == OnlineStatus.online) return -1; if (this == OnlineStatus.online) return -1;
if (other == OnlineStatus.online) return 1; if (other == OnlineStatus.online) return 1;
if (this == OnlineStatus.away) return -1; if (this == OnlineStatus.away) return -1;

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/models/users/user_profile.dart'; import 'package:recon/models/users/user_profile.dart';
class User { class User {
final String id; final String id;

View file

@ -1,9 +1,9 @@
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:OpenContacts/config.dart'; import 'package:recon/config.dart';
import 'package:OpenContacts/crypto_helper.dart'; import 'package:recon/crypto_helper.dart';
import 'package:OpenContacts/models/session.dart'; import 'package:recon/models/session.dart';
import 'package:OpenContacts/models/session_metadata.dart'; import 'package:recon/models/session_metadata.dart';
import 'package:OpenContacts/models/users/online_status.dart'; import 'package:recon/models/users/online_status.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
enum UserSessionType enum UserSessionType

View file

@ -40,7 +40,9 @@ class FormatNode {
} }
} }
if (substr.isNotEmpty) { if (substr.isNotEmpty) {
root.children.add(FormatNode.buildFromStyles(activeTags, substr)); root.children.add(
FormatNode.buildFromStyles(activeTags, substr)
);
} }
} }
return root; return root;
@ -48,9 +50,9 @@ class FormatNode {
TextSpan toTextSpan({required TextStyle baseStyle}) { TextSpan toTextSpan({required TextStyle baseStyle}) {
final spanTree = TextSpan( final spanTree = TextSpan(
text: text, text: text,
style: format.isUnformatted ? baseStyle : format.style(), style: format.isUnformatted ? baseStyle : format.style(),
children: children.map((e) => e.toTextSpan(baseStyle: baseStyle)).toList(), children: children.map((e) => e.toTextSpan(baseStyle: baseStyle)).toList()
); );
return spanTree; return spanTree;
} }
@ -85,10 +87,8 @@ class FormatTag {
required this.format, required this.format,
}); });
static final _tagRegExp = RegExp(r"<(.+?)>");
static List<FormatTag> parseTags(String text) { static List<FormatTag> parseTags(String text) {
final startMatches = _tagRegExp.allMatches(text); final startMatches = RegExp(r"<(.+?)>").allMatches(text);
final spans = <FormatTag>[]; final spans = <FormatTag>[];
@ -96,11 +96,13 @@ class FormatTag {
final fullTag = startMatch.group(1); final fullTag = startMatch.group(1);
if (fullTag == null) continue; if (fullTag == null) continue;
final tag = FormatData.parse(fullTag); final tag = FormatData.parse(fullTag);
spans.add(FormatTag( spans.add(
startIndex: startMatch.start, FormatTag(
endIndex: startMatch.end, startIndex: startMatch.start,
format: tag, endIndex: startMatch.end,
)); format: tag,
)
);
} }
return spans; return spans;
} }
@ -114,79 +116,20 @@ class FormatAction {
} }
class FormatData { class FormatData {
static final Map<String, Map<String, Color>> _platformColorPalette = { static Color? tryParseColor(String? text) {
"neutrals": { if (text == null) return null;
"dark": const Color(0xFF11151D), var color = cc.RgbColor.namedColors[text];
"mid": const Color(0xFF86888B), if (color != null) {
"light": const Color(0xFFE1E1E0), return Color.fromARGB(255, color.r.round(), color.g.round(), color.b.round());
}, }
"hero": {
"yellow": const Color(0xFFF8F770),
"green": const Color(0xFF59EB5C),
"red": const Color(0xFFFF7676),
"purple": const Color(0xFFBA64F2),
"cyan": const Color(0xFF61D1FA),
"orange": const Color(0xFFE69E50),
},
"sub": {
"yellow": const Color(0xFF484A2C),
"green": const Color(0xFF24512C),
"red": const Color(0xFF5D323A),
"purple": const Color(0xFF492F64),
"cyan": const Color(0xFF284C5D),
"orange": const Color(0xFF48392A),
},
"dark": {
"yellow": const Color(0xFF2B2E26),
"green": const Color(0xFF192D24),
"red": const Color(0xFF1A1318),
"purple": const Color(0xFF241E35),
"cyan": const Color(0xFF1A2A36),
"orange": const Color(0xFF292423),
},
};
static final _hexColorRegExp = RegExp(r"^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$");
static final _platformColorRegExp = RegExp(r"^([a-zA-Z]+)\.([a-zA-Z]+)$");
static Color? _parseHexColor(String text) {
try { try {
if (text.startsWith("#")) text = text.substring(1); color = cc.HexColor(text);
if (text.length == 3) text = text.split("").map((e) => e + e).join("");
final color = cc.HexColor(text);
return Color.fromARGB(255, color.r.round(), color.g.round(), color.b.round()); return Color.fromARGB(255, color.r.round(), color.g.round(), color.b.round());
} catch (_) { } catch (_) {
return null; return null;
} }
} }
static Color? tryParseColor(String text) {
// is it a hex color?
if (_hexColorRegExp.hasMatch(text)) {
return _parseHexColor(text);
}
// is it one of Resonite's color constants?
if (_platformColorRegExp.hasMatch(text)) {
final parts = text.split(".");
if (parts.length == 2) {
final palette = _platformColorPalette[parts[0]];
if (palette != null) {
return palette[parts[1]];
}
}
}
// is it a named color?
final color = cc.RgbColor.namedColors[text];
if (color != null) {
return Color.fromARGB(255, color.r.round(), color.g.round(), color.b.round());
}
// whatever it is, it's probably safe to assume it's not a color
return null;
}
static final Map<String, FormatAction> _richTextTags = { static final Map<String, FormatAction> _richTextTags = {
"align": FormatAction(), "align": FormatAction(),
"alpha": FormatAction(style: (param, baseStyle) { "alpha": FormatAction(style: (param, baseStyle) {
@ -210,12 +153,8 @@ class FormatData {
"line-height": FormatAction(), "line-height": FormatAction(),
"line-indent": FormatAction(), "line-indent": FormatAction(),
"link": FormatAction(), "link": FormatAction(),
"lowercase": FormatAction( "lowercase": FormatAction(transform: (input, parameter) => input.toLowerCase(),),
transform: (input, parameter) => input.toLowerCase(), "uppercase": FormatAction(transform: (input, parameter) => input.toUpperCase(),),
),
"uppercase": FormatAction(
transform: (input, parameter) => input.toUpperCase(),
),
"smallcaps": FormatAction(), "smallcaps": FormatAction(),
"margin": FormatAction(), "margin": FormatAction(),
"mark": FormatAction(style: (param, baseStyle) { "mark": FormatAction(style: (param, baseStyle) {
@ -229,20 +168,22 @@ class FormatData {
"nobr": FormatAction(), "nobr": FormatAction(),
"page": FormatAction(), "page": FormatAction(),
"pos": FormatAction(), "pos": FormatAction(),
"size": FormatAction(style: (param, baseStyle) { "size": FormatAction(
if (param == null) return baseStyle; style: (param, baseStyle) {
final baseSize = baseStyle.fontSize ?? 12; if (param == null) return baseStyle;
if (param.endsWith("%")) { final baseSize = baseStyle.fontSize ?? 12;
final percentage = int.tryParse(param.replaceAll("%", "")); if (param.endsWith("%")) {
if (percentage == null || percentage <= 0) return baseStyle; final percentage = int.tryParse(param.replaceAll("%", ""));
return baseStyle.copyWith(fontSize: baseSize * (percentage / 100)); if (percentage == null || percentage <= 0) return baseStyle;
} else { return baseStyle.copyWith(fontSize: baseSize * (percentage / 100));
final size = num.tryParse(param); } else {
if (size == null || size <= 0) return baseStyle; final size = num.tryParse(param);
final realSize = baseSize * (size / 1000); if (size == null || size <= 0) return baseStyle;
return baseStyle.copyWith(fontSize: realSize.toDouble().clamp(8, 400)); final realSize = baseSize * (size / 1000);
} return baseStyle.copyWith(fontSize: realSize.toDouble().clamp(8, 400));
}), }
}
),
"space": FormatAction(), "space": FormatAction(),
"sprite": FormatAction(), "sprite": FormatAction(),
"s": FormatAction(style: (param, baseStyle) => baseStyle.copyWith(decoration: TextDecoration.lineThrough)), "s": FormatAction(style: (param, baseStyle) => baseStyle.copyWith(decoration: TextDecoration.lineThrough)),
@ -283,4 +224,4 @@ class FormatData {
String? apply(String? text) => text == null ? null : _richTextTags[name]?.transform?.call(text, parameter); String? apply(String? text) => text == null ? null : _richTextTags[name]?.transform?.call(text, parameter);
TextStyle style() => _richTextTags[name]?.style?.call(parameter, const TextStyle()) ?? const TextStyle(); TextStyle style() => _richTextTags[name]?.style?.call(parameter, const TextStyle()) ?? const TextStyle();
} }

View file

@ -1,4 +1,4 @@
import 'package:OpenContacts/string_formatter.dart'; import 'package:recon/string_formatter.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class FormattedText extends StatelessWidget { class FormattedText extends StatelessWidget {

View file

@ -66,7 +66,7 @@ class _ExpandingInputFabState extends State<ExpandingInputFab> {
}, },
splashRadius: 16, splashRadius: 16,
iconSize: 28, iconSize: 28,
icon: _isExtended ? const Icon(Icons.close) : const Icon(Icons.person_search), icon: _isExtended ? const Icon(Icons.close) : const Icon(Icons.search),
), ),
) )
], ],

View file

@ -1,24 +1,22 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:OpenContacts/auxiliary.dart'; import 'package:recon/auxiliary.dart';
import 'package:OpenContacts/clients/messaging_client.dart'; import 'package:recon/clients/messaging_client.dart';
import 'package:OpenContacts/models/message.dart'; import 'package:recon/models/message.dart';
import 'package:OpenContacts/models/users/friend.dart'; import 'package:recon/models/users/friend.dart';
import 'package:OpenContacts/models/users/online_status.dart'; import 'package:recon/models/users/online_status.dart';
import 'package:OpenContacts/widgets/formatted_text.dart'; import 'package:recon/widgets/formatted_text.dart';
import 'package:OpenContacts/widgets/friends/friend_online_status_indicator.dart'; import 'package:recon/widgets/friends/friend_online_status_indicator.dart';
import 'package:OpenContacts/widgets/generic_avatar.dart'; import 'package:recon/widgets/generic_avatar.dart';
import 'package:OpenContacts/widgets/messages/messages_list.dart'; import 'package:recon/widgets/messages/messages_list.dart';
import 'package:OpenContacts/widgets/my_profile_dialog.dart';
class FriendListTile extends StatelessWidget { class FriendListTile extends StatelessWidget {
const FriendListTile({required this.friend, required this.unreads, this.onTap, super.key, this.onLongPress}); const FriendListTile({required this.friend, required this.unreads, this.onTap, super.key});
final Friend friend; final Friend friend;
final int unreads; final int unreads;
final Function? onTap; final Function? onTap;
final Function? onLongPress;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -56,12 +54,13 @@ class FriendListTile extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
FriendOnlineStatusIndicator(friend: friend), FriendOnlineStatusIndicator(userStatus: friend.userStatus),
const SizedBox( const SizedBox(
width: 4, width: 4,
), ),
if (!(friend.isOffline || friend.isHeadless)) ...[ Text(toBeginningOfSentenceCase(friend.userStatus.onlineStatus.name) ?? "Unknown"),
Text(toBeginningOfSentenceCase(friend.userStatus.onlineStatus.name) ?? "Unknown"), if (!(friend.userStatus.onlineStatus == OnlineStatus.offline ||
friend.userStatus.onlineStatus == OnlineStatus.invisible))
if (currentSession != null) ...[ if (currentSession != null) ...[
const Text(" in "), const Text(" in "),
if (currentSession.name.isNotEmpty) if (currentSession.name.isNotEmpty)
@ -88,24 +87,6 @@ class FriendListTile extends StatelessWidget {
maxLines: 1, maxLines: 1,
), ),
), ),
] else if (friend.isOffline)
Text(
"Offline",
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: theme.textTheme.bodyMedium?.copyWith(
color: OnlineStatus.offline.color(context),
),
)
else
Text(
"Headless Host",
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: theme.textTheme.bodyMedium?.copyWith(
color: const Color.fromARGB(255, 41, 77, 92),
),
)
], ],
), ),
onTap: () async { onTap: () async {
@ -131,14 +112,6 @@ class FriendListTile extends StatelessWidget {
); );
mClient.selectedFriend = null; mClient.selectedFriend = null;
}, },
onLongPress: () async {
await showDialog(
context: context,
builder: (context) {
return const MyProfileDialog();
},
);
}
); );
} }
} }

View file

@ -1,32 +1,28 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:OpenContacts/models/users/friend.dart'; import 'package:recon/models/users/online_status.dart';
import 'package:OpenContacts/models/users/online_status.dart'; import 'package:recon/models/users/user_status.dart';
import 'package:OpenContacts/models/users/user_status.dart';
class FriendOnlineStatusIndicator extends StatelessWidget { class FriendOnlineStatusIndicator extends StatelessWidget {
const FriendOnlineStatusIndicator({required this.friend, super.key}); const FriendOnlineStatusIndicator({required this.userStatus, super.key});
final Friend friend; final UserStatus userStatus;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final UserStatus userStatus = friend.userStatus; return userStatus.appVersion.contains("ReCon") && userStatus.onlineStatus != OnlineStatus.offline
final OnlineStatus onlineStatus = userStatus.onlineStatus;
return userStatus.appVersion.contains("OpenContacts") && friend.isOnline
? SizedBox.square( ? SizedBox.square(
dimension: 10, dimension: 10,
child: Image.asset( child: Image.asset(
"assets/images/logo-white.png", "assets/images/logo-white.png",
color: onlineStatus.color(context), color: userStatus.onlineStatus.color(context),
filterQuality: FilterQuality.medium, filterQuality: FilterQuality.medium,
isAntiAlias: true, isAntiAlias: true,
), ),
) )
: Icon( : Icon(
friend.isOffline ? Icons.circle_outlined : Icons.circle, userStatus.onlineStatus == OnlineStatus.offline ? Icons.circle_outlined : Icons.circle,
color: friend.isHeadless ? const Color.fromARGB(255, 41, 77, 92) : onlineStatus.color(context), color: userStatus.onlineStatus.color(context),
size: 10, size: 10,
); );
} }
} }
// TODO: Re-invent the fucking wheel aparently

Some files were not shown because too many files have changed in this diff Show more