Compare commits
268 Commits
d93a00066a
...
1.2.1+25
| Author | SHA1 | Date | |
|---|---|---|---|
| bd1369e72d | |||
| 10520b4448 | |||
| cab2217793 | |||
| 4e4e551e2f | |||
| 597a8a802a | |||
| fff756cbe0 | |||
| e38778dbf9 | |||
| cc9081b011 | |||
| 14e8f7b775 | |||
| a70e6c7118 | |||
| 48ca885a2c | |||
| 09cb340a9d | |||
| b6ebd6bef6 | |||
| 2ec25fd1a2 | |||
| bc99865ba8 | |||
| f834351ce2 | |||
| 0f1a02f65b | |||
| 6ad0a34645 | |||
| fdc71475fc | |||
| 047defebd1 | |||
| 6148e889aa | |||
| 1d7affcd84 | |||
| cc1e0599aa | |||
| 221b97901f | |||
| 498bb0e5fb | |||
| aa94dfcfe0 | |||
| 65d9253876 | |||
| 3ac510c4b1 | |||
| 253cd1ecbd | |||
| c82c48dfec | |||
| 433beec2dd | |||
| 3a1e7537dd | |||
| 9170ae6be7 | |||
| a5ee5b7f09 | |||
| 32e6658f3d | |||
| e45d9b39d5 | |||
| cf1cfecb08 | |||
| 95ea3e558f | |||
| 0006a94632 | |||
| 7ea18dbe12 | |||
| 6004b74724 | |||
| 4d82ae8058 | |||
| 7fe26d0df0 | |||
| 80bade0e03 | |||
| b63db7fe76 | |||
| 49f73f5f04 | |||
| 98749f42c0 | |||
| f0e6bd64f4 | |||
| 3bea3a114a | |||
| 454f711656 | |||
| 82e4c923e7 | |||
| 5b4d8282ae | |||
| cf767a1d94 | |||
| af93a8386a | |||
| 29ca263130 | |||
| 7332f68d9c | |||
| e9e6f3313e | |||
| 85764c37c2 | |||
| ef1f29f905 | |||
| 22026efa7d | |||
| 4a3e6a9e15 | |||
| 00092ba7b6 | |||
| b5da8ece4a | |||
| dfe9165bc9 | |||
| 3d45b54236 | |||
| 7f63fe7f0e | |||
| bc5dbab9c5 | |||
| 9910fc7a92 | |||
| 2356eac118 | |||
| 0135b8d838 | |||
| 8ec33ccbf4 | |||
| d267316a35 | |||
| 138da60e55 | |||
| 4562c2f991 | |||
| 8009f4ca9b | |||
| 54dee9702b | |||
| 94385564bd | |||
| 0b2309816f | |||
| 8283272a3b | |||
| eb02a47e9a | |||
| 7c0c1ec94f | |||
| 272044a77e | |||
| 39c22b1cf6 | |||
| 98c3bb912d | |||
| 035b92d9b8 | |||
| 0bfc0bd61b | |||
| de00a20eee | |||
| 73982f48d6 | |||
| 1d36b30361 | |||
| dea743a307 | |||
| c48bd3e758 | |||
| 56bbf73b5e | |||
| 4f6c5aa053 | |||
| d8e79fb4f9 | |||
| 06e0fa465b | |||
| 895a257f50 | |||
| d9804ba00b | |||
| 62ff1c2f1c | |||
| a157596a2e | |||
| 12102bf527 | |||
| c00a018380 | |||
| 53b3cac4ca | |||
| 19eabfaba1 | |||
| ec2eadad6d | |||
| 54e176e75d | |||
| 0a7ccaeefa | |||
| a5f093e185 | |||
| a4f68dd175 | |||
| 8067c35c70 | |||
| ebe381053e | |||
| 03f2470dae | |||
| ea434815cf | |||
| bbea4b4359 | |||
| e0b485cc81 | |||
| 87bb37ac01 | |||
| 989b5babd9 | |||
| 9ea364640d | |||
| a9f55a489d | |||
| 4616f3a3e2 | |||
| 425bae9d13 | |||
| 07771e8979 | |||
| 0ad4854443 | |||
| 4238ea6fdc | |||
| 7d45c06302 | |||
| 7e8993fbd2 | |||
| c88fcc84da | |||
| 11fb79623e | |||
| 98cc313a91 | |||
| bc3401a897 | |||
| 5b6a5d9046 | |||
| 6cbd78e836 | |||
| aefcbad02f | |||
| 70617be687 | |||
| cccb3d5c16 | |||
| a0a3a8d182 | |||
| c6b2ef8459 | |||
| 34a2fe3988 | |||
| 0a5604d0ff | |||
| 5e754ad233 | |||
| 5b9c92e4d3 | |||
| b2a6ca7244 | |||
| 27c60fc8cb | |||
| 8b3c45ab29 | |||
| adb415700a | |||
| 1e4b44a78b | |||
| 9765b200b9 | |||
| 47d03ce1e5 | |||
| c41a71388d | |||
| 7655dfdf37 | |||
| 190bb34958 | |||
| d02ed68afa | |||
| 2bc4513bb6 | |||
| f10393f6d0 | |||
| ecef8dab0c | |||
| 52e58fce3d | |||
| 31d50bfb1f | |||
| ca8ad12d93 | |||
| f799900450 | |||
| dfdf7b23c8 | |||
| 771b2029b0 | |||
| cc9c99f375 | |||
| b70d3795d1 | |||
| a16ff1b9a1 | |||
| 19751617cb | |||
| bb77b74356 | |||
| fc77c8693f | |||
| 58bb549217 | |||
| 6590062dcb | |||
| 6ace977bf6 | |||
| 387f0d14ac | |||
| 18bb0d3db2 | |||
| 8ab3ca5633 | |||
| 3db6850d89 | |||
| 3ca98fa58c | |||
| 425c79d6fc | |||
| 7e98edfbc9 | |||
| 056b98db07 | |||
| 7bfbd37b76 | |||
| 7800a70ef2 | |||
| 74b6ccd5c7 | |||
| 6ca4aad1c4 | |||
| 102df2ef1c | |||
| f08c9903b4 | |||
| 0d279842cf | |||
| 33d69908a6 | |||
| 4552dfd3f3 | |||
| ae87e9ad31 | |||
| 277ba69513 | |||
| 6e3d0f9787 | |||
| 0237409d27 | |||
| a5b6ace79b | |||
| 42c3e5ff0a | |||
| 7dc198f0a7 | |||
| fa3ba0e188 | |||
| 02c28533db | |||
| 6d92a16a62 | |||
| ef58430060 | |||
| 8366bda846 | |||
| 39c8597428 | |||
| e91b4b0947 | |||
| 3545a0737d | |||
| 58b3d75896 | |||
| f69339292b | |||
| 62edab0131 | |||
| dbd05dbb79 | |||
| dac7440477 | |||
| 0573ee456e | |||
| 5a7432e330 | |||
| 6811d8e9b1 | |||
| e068c72b69 | |||
| ca72a44a86 | |||
| 47d3fc90a3 | |||
| e38d8339f1 | |||
| 8c04b81b7c | |||
| 9f3485a2a8 | |||
| da265da61d | |||
| 286dd8193d | |||
| 6311322c4a | |||
| a68a78597e | |||
| 201c38800b | |||
| df7348e117 | |||
| 156e6f1075 | |||
| a2db9a7ae4 | |||
| 1a26880719 | |||
| aa43eaa0eb | |||
| 48b76ed574 | |||
| 3b1b6ec8d6 | |||
| a6d8e2e311 | |||
| 8dbf6ff4f3 | |||
| 505290b2ae | |||
| 065cda27e9 | |||
| fa600d6c69 | |||
| a0fe3f918e | |||
| 10ed44d2e2 | |||
| b241956ce7 | |||
| d4cd120431 | |||
| 60d7df4496 | |||
| f7cc4420b3 | |||
| 5864041e57 | |||
| f231fc9ec0 | |||
| 75c753ef63 | |||
| 22ee817676 | |||
| f8bed6946e | |||
| b2a2d38c3d | |||
| 343b84e3e1 | |||
| 66ddfea68d | |||
| a304b26c96 | |||
| 7d087af4cd | |||
| 90daff5b97 | |||
| cc59814b55 | |||
| b808c76ea3 | |||
| 20a82da2fa | |||
| 867b024285 | |||
| f1abdad54d | |||
| 9d54b04f77 | |||
| 8c7de68e7a | |||
| 31513b0e84 | |||
| 65333ccef6 | |||
| 49f999871a | |||
| e336d2372a | |||
| 85bba21285 | |||
| df2f04d2b2 | |||
| fdeb52bf38 | |||
| fffad00f00 | |||
| 6b0f644353 | |||
| 7b45d95fd6 | |||
| 424be16ab0 | |||
| 29a975235c |
41
.github/workflows/nightly.yml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: release-nightly
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-web:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: stable
|
||||||
|
cache: true
|
||||||
|
- run: flutter pub get
|
||||||
|
- run: flutter build web --release --base-href=/
|
||||||
|
- name: Archive production artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-output-web
|
||||||
|
path: build/web
|
||||||
|
build-exe:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: stable
|
||||||
|
cache: true
|
||||||
|
- run: flutter pub get
|
||||||
|
- run: flutter build windows
|
||||||
|
- name: Archive production artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-output-windows
|
||||||
|
path: build/windows/x64/runner/Release
|
||||||
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
# The following line activates a set of recommended lints for Flutter apps,
|
# The following line activates a set of recommended lints for Flutter apps,
|
||||||
# packages, and plugins designed to encourage good coding practices.
|
# packages, and plugins designed to encourage good coding practices.
|
||||||
|
analyzer:
|
||||||
|
errors:
|
||||||
|
use_build_context_synchronously: ignore
|
||||||
include: package:flutter_lints/flutter.yaml
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
linter:
|
linter:
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id "com.android.application"
|
id "com.android.application"
|
||||||
id 'com.google.gms.google-services'
|
id 'com.google.gms.google-services'
|
||||||
|
id 'com.google.firebase.crashlytics'
|
||||||
id "kotlin-android"
|
id "kotlin-android"
|
||||||
id "dev.flutter.flutter-gradle-plugin"
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
}
|
}
|
||||||
@@ -23,26 +24,36 @@ if (flutterVersionName == null) {
|
|||||||
flutterVersionName = "1.0"
|
flutterVersionName = "1.0"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def keystoreProperties = new Properties()
|
||||||
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
|
if (keystorePropertiesFile.exists()) {
|
||||||
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "dev.solsynth.solian"
|
namespace = "dev.solsynth.solian"
|
||||||
compileSdk = flutter.compileSdkVersion
|
compileSdk = flutter.compileSdkVersion
|
||||||
ndkVersion = flutter.ndkVersion
|
ndkVersion = "26.1.10909125"
|
||||||
|
|
||||||
defaultConfig {
|
signingConfigs {
|
||||||
multiDexEnabled true
|
release {
|
||||||
|
keyAlias keystoreProperties['keyAlias']
|
||||||
|
keyPassword keystoreProperties['keyPassword']
|
||||||
|
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
|
||||||
|
storePassword keystoreProperties['storePassword']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
coreLibraryDesugaringEnabled true
|
coreLibraryDesugaringEnabled true
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_17
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_17
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "dev.solsynth.solian"
|
applicationId = "dev.solsynth.solian"
|
||||||
// You can update the following values to match your application needs.
|
minSdkVersion 23
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
multiDexEnabled true
|
||||||
minSdk = flutter.minSdkVersion
|
|
||||||
targetSdk = flutter.targetSdkVersion
|
targetSdk = flutter.targetSdkVersion
|
||||||
versionCode = flutterVersionCode.toInteger()
|
versionCode = flutterVersionCode.toInteger()
|
||||||
versionName = flutterVersionName
|
versionName = flutterVersionName
|
||||||
@@ -50,7 +61,8 @@ android {
|
|||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
signingConfig = signingConfigs.debug
|
// signingConfig = signingConfigs.debug
|
||||||
|
signingConfig = signingConfigs.release
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,19 +12,26 @@
|
|||||||
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:label="solian"
|
android:label="Solian"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/launcher_icon"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:supportsRtl="true">
|
android:supportsRtl="true">
|
||||||
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
|
<receiver android:exported="false"
|
||||||
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
|
android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
|
||||||
|
<receiver android:exported="false"
|
||||||
|
android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
|
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||||
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
||||||
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
|
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
@@ -41,15 +48,41 @@
|
|||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
to determine the Window background behind the Flutter UI. -->
|
to determine the Window background behind the Flutter UI. -->
|
||||||
<meta-data
|
<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
|
||||||
android:resource="@style/NormalTheme"
|
<intent-filter android:autoVerify="true">
|
||||||
/>
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:host="solsynth.dev" />
|
||||||
|
<data android:host="sn.solsynth.dev" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="solink" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
|
android:resource="@style/NormalTheme"
|
||||||
|
/>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name="com.yalantis.ucrop.UCropActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
|
||||||
|
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
<meta-data
|
<meta-data
|
||||||
@@ -63,8 +96,8 @@
|
|||||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
<action android:name="android.intent.action.PROCESS_TEXT" />
|
||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
BIN
android/app/src/main/res/drawable-hdpi/splash.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
android/app/src/main/res/drawable-mdpi/splash.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
android/app/src/main/res/drawable-night-v21/background.png
Normal file
|
After Width: | Height: | Size: 69 B |
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="center" android:src="@drawable/splash"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
BIN
android/app/src/main/res/drawable-night/background.png
Normal file
|
After Width: | Height: | Size: 69 B |
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="center" android:src="@drawable/splash"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
BIN
android/app/src/main/res/drawable-v21/background.png
Normal file
|
After Width: | Height: | Size: 69 B |
@@ -1,12 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<item android:drawable="?android:colorBackground" />
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
<!-- You can insert your own image assets here -->
|
</item>
|
||||||
<!-- <item>
|
<item>
|
||||||
<bitmap
|
<bitmap android:gravity="center" android:src="@drawable/splash"/>
|
||||||
android:gravity="center"
|
</item>
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
|||||||
BIN
android/app/src/main/res/drawable-xhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 117 KiB |
BIN
android/app/src/main/res/drawable-xxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 233 KiB |
BIN
android/app/src/main/res/drawable-xxxhdpi/splash.png
Normal file
|
After Width: | Height: | Size: 355 KiB |
BIN
android/app/src/main/res/drawable/background.png
Normal file
|
After Width: | Height: | Size: 69 B |
@@ -1,12 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<item android:drawable="@android:color/white" />
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
<!-- You can insert your own image assets here -->
|
</item>
|
||||||
<!-- <item>
|
<item>
|
||||||
<bitmap
|
<bitmap android:gravity="center" android:src="@drawable/splash"/>
|
||||||
android:gravity="center"
|
</item>
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 544 B After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 442 B After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 721 B After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.7 KiB |
19
android/app/src/main/res/values-night-v31/styles.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||||
|
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||||
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
|
<item name="android:windowFullscreen">false</item>
|
||||||
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
|
</style>
|
||||||
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
|
This theme determines the color of the Android Window while your
|
||||||
|
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||||
|
running.
|
||||||
|
|
||||||
|
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||||
|
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||||
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
<!-- Show a splash screen on the activity. Automatically removed when
|
||||||
the Flutter engine draws its first frame -->
|
the Flutter engine draws its first frame -->
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
|
<item name="android:windowFullscreen">false</item>
|
||||||
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
This theme determines the color of the Android Window while your
|
This theme determines the color of the Android Window while your
|
||||||
|
|||||||
19
android/app/src/main/res/values-v31/styles.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||||
|
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||||
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
|
<item name="android:windowFullscreen">false</item>
|
||||||
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
|
</style>
|
||||||
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
|
This theme determines the color of the Android Window while your
|
||||||
|
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||||
|
running.
|
||||||
|
|
||||||
|
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||||
|
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||||
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -5,6 +5,10 @@
|
|||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
<!-- Show a splash screen on the activity. Automatically removed when
|
||||||
the Flutter engine draws its first frame -->
|
the Flutter engine draws its first frame -->
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
|
<item name="android:windowFullscreen">false</item>
|
||||||
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
This theme determines the color of the Android Window while your
|
This theme determines the color of the Android Window while your
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
allprojects {
|
allprojects {
|
||||||
|
ext.kotlin_version = "2.0.0"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@@ -10,6 +12,17 @@ subprojects {
|
|||||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||||
}
|
}
|
||||||
subprojects {
|
subprojects {
|
||||||
|
// TO FIX LIVEKIT ISSUE BY THIS
|
||||||
|
// https://github.com/livekit/client-sdk-flutter/issues/569#issuecomment-2275686786
|
||||||
|
afterEvaluate { project ->
|
||||||
|
if (project.plugins.hasPlugin("com.android.application") ||
|
||||||
|
project.plugins.hasPlugin("com.android.library")) {
|
||||||
|
project.android {
|
||||||
|
compileSdkVersion 34
|
||||||
|
buildToolsVersion "34.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
project.evaluationDependsOn(":app")
|
project.evaluationDependsOn(":app")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ plugins {
|
|||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version '8.4.0' apply false
|
id "com.android.application" version '8.4.0' apply false
|
||||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||||
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
|
id "com.google.firebase.crashlytics" version "2.8.1" apply false
|
||||||
|
id "org.jetbrains.kotlin.android" version '2.0.0' apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
include ":app"
|
include ":app"
|
||||||
|
|||||||
BIN
assets/fonts/Comfortaa-Bold.ttf
Executable file
BIN
assets/fonts/Comfortaa-Regular.ttf
Executable file
BIN
assets/fonts/NotoColorEmoji-Regular.ttf
Executable file
BIN
assets/fonts/NotoSansHK-Bold.ttf
Executable file
BIN
assets/fonts/NotoSansHK-Regular.ttf
Executable file
BIN
assets/fonts/NotoSansJP-Bold.ttf
Executable file
BIN
assets/fonts/NotoSansJP-Regular.ttf
Executable file
BIN
assets/fonts/NotoSansSC-Bold.ttf
Executable file
BIN
assets/fonts/NotoSansSC-Regular.ttf
Executable file
|
Before Width: | Height: | Size: 537 KiB |
BIN
assets/icon-w-shadow.png
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
assets/icon.png
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 360 KiB |
BIN
assets/logo.png
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 360 KiB |
7
build.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
targets:
|
||||||
|
$default:
|
||||||
|
builders:
|
||||||
|
json_serializable:
|
||||||
|
options:
|
||||||
|
explicit_to_json: true
|
||||||
|
field_rename: snake
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
description: This file stores settings for Dart & Flutter DevTools.
|
description: This file stores settings for Dart & Flutter DevTools.
|
||||||
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
||||||
extensions:
|
extensions:
|
||||||
|
- provider: true
|
||||||
381
ios/Podfile.lock
@@ -38,101 +38,226 @@ PODS:
|
|||||||
- file_picker (0.0.1):
|
- file_picker (0.0.1):
|
||||||
- DKImagePickerController/PhotoGallery
|
- DKImagePickerController/PhotoGallery
|
||||||
- Flutter
|
- Flutter
|
||||||
- Firebase/CoreOnly (10.27.0):
|
- Firebase/Analytics (11.0.0):
|
||||||
- FirebaseCore (= 10.27.0)
|
- Firebase/Core
|
||||||
- Firebase/Messaging (10.27.0):
|
- Firebase/Core (11.0.0):
|
||||||
- Firebase/CoreOnly
|
- Firebase/CoreOnly
|
||||||
- FirebaseMessaging (~> 10.27.0)
|
- FirebaseAnalytics (~> 11.0.0)
|
||||||
- firebase_core (3.1.0):
|
- Firebase/CoreOnly (11.0.0):
|
||||||
- Firebase/CoreOnly (= 10.27.0)
|
- FirebaseCore (= 11.0.0)
|
||||||
- Flutter
|
- Firebase/Crashlytics (11.0.0):
|
||||||
- firebase_messaging (15.0.1):
|
- Firebase/CoreOnly
|
||||||
- Firebase/Messaging (= 10.27.0)
|
- FirebaseCrashlytics (~> 11.0.0)
|
||||||
|
- Firebase/Messaging (11.0.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseMessaging (~> 11.0.0)
|
||||||
|
- Firebase/Performance (11.0.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebasePerformance (~> 11.0.0)
|
||||||
|
- firebase_analytics (11.3.0):
|
||||||
|
- Firebase/Analytics (= 11.0.0)
|
||||||
- firebase_core
|
- firebase_core
|
||||||
- Flutter
|
- Flutter
|
||||||
- FirebaseCore (10.27.0):
|
- firebase_core (3.4.0):
|
||||||
- FirebaseCoreInternal (~> 10.0)
|
- Firebase/CoreOnly (= 11.0.0)
|
||||||
- GoogleUtilities/Environment (~> 7.12)
|
- Flutter
|
||||||
- GoogleUtilities/Logger (~> 7.12)
|
- firebase_crashlytics (4.1.0):
|
||||||
- FirebaseCoreInternal (10.28.0):
|
- Firebase/Crashlytics (= 11.0.0)
|
||||||
- "GoogleUtilities/NSData+zlib (~> 7.8)"
|
- firebase_core
|
||||||
- FirebaseInstallations (10.28.0):
|
- Flutter
|
||||||
- FirebaseCore (~> 10.0)
|
- firebase_messaging (15.1.0):
|
||||||
- GoogleUtilities/Environment (~> 7.8)
|
- Firebase/Messaging (= 11.0.0)
|
||||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
- firebase_core
|
||||||
- PromisesObjC (~> 2.1)
|
- Flutter
|
||||||
- FirebaseMessaging (10.27.0):
|
- firebase_performance (0.10.0-5):
|
||||||
- FirebaseCore (~> 10.0)
|
- Firebase/Performance (= 11.0.0)
|
||||||
- FirebaseInstallations (~> 10.0)
|
- firebase_core
|
||||||
- GoogleDataTransport (~> 9.3)
|
- Flutter
|
||||||
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
|
- FirebaseABTesting (11.1.0):
|
||||||
- GoogleUtilities/Environment (~> 7.8)
|
- FirebaseCore (~> 11.0)
|
||||||
- GoogleUtilities/Reachability (~> 7.8)
|
- FirebaseAnalytics (11.0.0):
|
||||||
- GoogleUtilities/UserDefaults (~> 7.8)
|
- FirebaseAnalytics/AdIdSupport (= 11.0.0)
|
||||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Network (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebaseAnalytics/AdIdSupport (11.0.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- GoogleAppMeasurement (= 11.0.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Network (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebaseCore (11.0.0):
|
||||||
|
- FirebaseCoreInternal (~> 11.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- GoogleUtilities/Logger (~> 8.0)
|
||||||
|
- FirebaseCoreExtension (11.1.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseCoreInternal (11.1.0):
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- FirebaseCrashlytics (11.0.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- FirebaseRemoteConfigInterop (~> 11.0)
|
||||||
|
- FirebaseSessions (~> 11.0)
|
||||||
|
- GoogleDataTransport (~> 10.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- PromisesObjC (~> 2.4)
|
||||||
|
- FirebaseInstallations (11.1.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
|
- PromisesObjC (~> 2.4)
|
||||||
|
- FirebaseMessaging (11.0.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- GoogleDataTransport (~> 10.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- GoogleUtilities/Reachability (~> 8.0)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebasePerformance (11.0.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- FirebaseRemoteConfig (~> 11.0)
|
||||||
|
- FirebaseSessions (~> 11.0)
|
||||||
|
- GoogleDataTransport (~> 10.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebaseRemoteConfig (11.1.0):
|
||||||
|
- FirebaseABTesting (~> 11.0)
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- FirebaseRemoteConfigInterop (~> 11.0)
|
||||||
|
- FirebaseSharedSwift (~> 11.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- FirebaseRemoteConfigInterop (11.1.0)
|
||||||
|
- FirebaseSessions (11.1.0):
|
||||||
|
- FirebaseCore (~> 11.0)
|
||||||
|
- FirebaseCoreExtension (~> 11.0)
|
||||||
|
- FirebaseInstallations (~> 11.0)
|
||||||
|
- GoogleDataTransport (~> 10.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.0)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.0)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- PromisesSwift (~> 2.1)
|
||||||
|
- FirebaseSharedSwift (11.1.0)
|
||||||
- Flutter (1.0.0)
|
- Flutter (1.0.0)
|
||||||
- flutter_local_notifications (0.0.1):
|
- flutter_keyboard_visibility (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- flutter_native_splash (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- flutter_secure_storage (6.0.0):
|
- flutter_secure_storage (6.0.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- flutter_webrtc (0.9.36):
|
- flutter_webrtc (0.11.3):
|
||||||
- Flutter
|
- Flutter
|
||||||
- WebRTC-SDK (= 114.5735.10)
|
- WebRTC-SDK (= 125.6422.04)
|
||||||
- GoogleDataTransport (9.4.1):
|
- gal (1.0.0):
|
||||||
- GoogleUtilities/Environment (~> 7.7)
|
- Flutter
|
||||||
- nanopb (< 2.30911.0, >= 2.30908.0)
|
- FlutterMacOS
|
||||||
- PromisesObjC (< 3.0, >= 1.2)
|
- GoogleAppMeasurement (11.0.0):
|
||||||
- GoogleUtilities/AppDelegateSwizzler (7.13.3):
|
- GoogleAppMeasurement/AdIdSupport (= 11.0.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Network (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleAppMeasurement/AdIdSupport (11.0.0):
|
||||||
|
- GoogleAppMeasurement/WithoutAdIdSupport (= 11.0.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Network (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleAppMeasurement/WithoutAdIdSupport (11.0.0):
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.0)
|
||||||
|
- GoogleUtilities/Network (~> 8.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.0)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleDataTransport (10.1.0):
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- PromisesObjC (~> 2.4)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (8.0.2):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Network
|
- GoogleUtilities/Network
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Environment (7.13.3):
|
- GoogleUtilities/Environment (8.0.2):
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- PromisesObjC (< 3.0, >= 1.2)
|
- GoogleUtilities/Logger (8.0.2):
|
||||||
- GoogleUtilities/Logger (7.13.3):
|
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Network (7.13.3):
|
- GoogleUtilities/MethodSwizzler (8.0.2):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
|
- GoogleUtilities/Network (8.0.2):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- "GoogleUtilities/NSData+zlib"
|
- "GoogleUtilities/NSData+zlib"
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Reachability
|
- GoogleUtilities/Reachability
|
||||||
- "GoogleUtilities/NSData+zlib (7.13.3)":
|
- "GoogleUtilities/NSData+zlib (8.0.2)":
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Privacy (7.13.3)
|
- GoogleUtilities/Privacy (8.0.2)
|
||||||
- GoogleUtilities/Reachability (7.13.3):
|
- GoogleUtilities/Reachability (8.0.2):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/UserDefaults (7.13.3):
|
- GoogleUtilities/UserDefaults (8.0.2):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
|
- image_cropper (0.0.4):
|
||||||
|
- Flutter
|
||||||
|
- TOCropViewController (~> 2.7.4)
|
||||||
- image_picker_ios (0.0.1):
|
- image_picker_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- livekit_client (2.2.0):
|
- livekit_client (2.2.4):
|
||||||
- Flutter
|
- Flutter
|
||||||
- WebRTC-SDK (= 114.5735.10)
|
- WebRTC-SDK (= 125.6422.04)
|
||||||
- nanopb (2.30910.0):
|
- media_kit_libs_ios_video (1.0.4):
|
||||||
- nanopb/decode (= 2.30910.0)
|
- Flutter
|
||||||
- nanopb/encode (= 2.30910.0)
|
- media_kit_native_event_loop (1.0.0):
|
||||||
- nanopb/decode (2.30910.0)
|
- Flutter
|
||||||
- nanopb/encode (2.30910.0)
|
- media_kit_video (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- nanopb (3.30910.0):
|
||||||
|
- nanopb/decode (= 3.30910.0)
|
||||||
|
- nanopb/encode (= 3.30910.0)
|
||||||
|
- nanopb/decode (3.30910.0)
|
||||||
|
- nanopb/encode (3.30910.0)
|
||||||
- package_info_plus (0.4.5):
|
- package_info_plus (0.4.5):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- pasteboard (0.0.1):
|
||||||
|
- Flutter
|
||||||
- path_provider_foundation (0.0.1):
|
- path_provider_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- permission_handler_apple (9.3.0):
|
- permission_handler_apple (9.3.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- PromisesObjC (2.4.0)
|
- pointer_interceptor_ios (0.0.1):
|
||||||
- SDWebImage (5.19.2):
|
- Flutter
|
||||||
- SDWebImage/Core (= 5.19.2)
|
- PromisesObjC (2.4.0)
|
||||||
- SDWebImage/Core (5.19.2)
|
- PromisesSwift (2.4.0):
|
||||||
- Sentry/HybridSDK (8.29.0)
|
- PromisesObjC (= 2.4.0)
|
||||||
- sentry_flutter (8.3.0):
|
- protocol_handler_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- screen_brightness_ios (0.1.0):
|
||||||
|
- Flutter
|
||||||
|
- SDWebImage (5.19.7):
|
||||||
|
- SDWebImage/Core (= 5.19.7)
|
||||||
|
- SDWebImage/Core (5.19.7)
|
||||||
|
- share_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
|
||||||
- Sentry/HybridSDK (= 8.29.0)
|
|
||||||
- shared_preferences_foundation (0.0.1):
|
- shared_preferences_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
@@ -140,35 +265,48 @@ PODS:
|
|||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- SwiftyGif (5.4.5)
|
- SwiftyGif (5.4.5)
|
||||||
|
- TOCropViewController (2.7.4)
|
||||||
- url_launcher_ios (0.0.1):
|
- url_launcher_ios (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- video_player_avfoundation (0.0.1):
|
- volume_controller (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
|
||||||
- wakelock_plus (0.0.1):
|
- wakelock_plus (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- WebRTC-SDK (114.5735.10)
|
- WebRTC-SDK (125.6422.04)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
|
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/darwin`)
|
||||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||||
|
- firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`)
|
||||||
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||||
|
- firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
|
||||||
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
||||||
|
- firebase_performance (from `.symlinks/plugins/firebase_performance/ios`)
|
||||||
- Flutter (from `Flutter`)
|
- Flutter (from `Flutter`)
|
||||||
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
|
||||||
|
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
|
||||||
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
|
||||||
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
- flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`)
|
||||||
|
- gal (from `.symlinks/plugins/gal/darwin`)
|
||||||
|
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
|
||||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
- livekit_client (from `.symlinks/plugins/livekit_client/ios`)
|
- livekit_client (from `.symlinks/plugins/livekit_client/ios`)
|
||||||
|
- media_kit_libs_ios_video (from `.symlinks/plugins/media_kit_libs_ios_video/ios`)
|
||||||
|
- media_kit_native_event_loop (from `.symlinks/plugins/media_kit_native_event_loop/ios`)
|
||||||
|
- media_kit_video (from `.symlinks/plugins/media_kit_video/ios`)
|
||||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
|
- pasteboard (from `.symlinks/plugins/pasteboard/ios`)
|
||||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||||
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
|
- pointer_interceptor_ios (from `.symlinks/plugins/pointer_interceptor_ios/ios`)
|
||||||
|
- protocol_handler_ios (from `.symlinks/plugins/protocol_handler_ios/ios`)
|
||||||
|
- screen_brightness_ios (from `.symlinks/plugins/screen_brightness_ios/ios`)
|
||||||
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
|
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
|
||||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
- volume_controller (from `.symlinks/plugins/volume_controller/ios`)
|
||||||
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
@@ -176,17 +314,28 @@ SPEC REPOS:
|
|||||||
- DKImagePickerController
|
- DKImagePickerController
|
||||||
- DKPhotoGallery
|
- DKPhotoGallery
|
||||||
- Firebase
|
- Firebase
|
||||||
|
- FirebaseABTesting
|
||||||
|
- FirebaseAnalytics
|
||||||
- FirebaseCore
|
- FirebaseCore
|
||||||
|
- FirebaseCoreExtension
|
||||||
- FirebaseCoreInternal
|
- FirebaseCoreInternal
|
||||||
|
- FirebaseCrashlytics
|
||||||
- FirebaseInstallations
|
- FirebaseInstallations
|
||||||
- FirebaseMessaging
|
- FirebaseMessaging
|
||||||
|
- FirebasePerformance
|
||||||
|
- FirebaseRemoteConfig
|
||||||
|
- FirebaseRemoteConfigInterop
|
||||||
|
- FirebaseSessions
|
||||||
|
- FirebaseSharedSwift
|
||||||
|
- GoogleAppMeasurement
|
||||||
- GoogleDataTransport
|
- GoogleDataTransport
|
||||||
- GoogleUtilities
|
- GoogleUtilities
|
||||||
- nanopb
|
- nanopb
|
||||||
- PromisesObjC
|
- PromisesObjC
|
||||||
|
- PromisesSwift
|
||||||
- SDWebImage
|
- SDWebImage
|
||||||
- Sentry
|
|
||||||
- SwiftyGif
|
- SwiftyGif
|
||||||
|
- TOCropViewController
|
||||||
- WebRTC-SDK
|
- WebRTC-SDK
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
@@ -196,38 +345,64 @@ EXTERNAL SOURCES:
|
|||||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
file_picker:
|
file_picker:
|
||||||
:path: ".symlinks/plugins/file_picker/ios"
|
:path: ".symlinks/plugins/file_picker/ios"
|
||||||
|
firebase_analytics:
|
||||||
|
:path: ".symlinks/plugins/firebase_analytics/ios"
|
||||||
firebase_core:
|
firebase_core:
|
||||||
:path: ".symlinks/plugins/firebase_core/ios"
|
:path: ".symlinks/plugins/firebase_core/ios"
|
||||||
|
firebase_crashlytics:
|
||||||
|
:path: ".symlinks/plugins/firebase_crashlytics/ios"
|
||||||
firebase_messaging:
|
firebase_messaging:
|
||||||
:path: ".symlinks/plugins/firebase_messaging/ios"
|
:path: ".symlinks/plugins/firebase_messaging/ios"
|
||||||
|
firebase_performance:
|
||||||
|
:path: ".symlinks/plugins/firebase_performance/ios"
|
||||||
Flutter:
|
Flutter:
|
||||||
:path: Flutter
|
:path: Flutter
|
||||||
flutter_local_notifications:
|
flutter_keyboard_visibility:
|
||||||
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
|
||||||
|
flutter_native_splash:
|
||||||
|
:path: ".symlinks/plugins/flutter_native_splash/ios"
|
||||||
flutter_secure_storage:
|
flutter_secure_storage:
|
||||||
:path: ".symlinks/plugins/flutter_secure_storage/ios"
|
:path: ".symlinks/plugins/flutter_secure_storage/ios"
|
||||||
flutter_webrtc:
|
flutter_webrtc:
|
||||||
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
:path: ".symlinks/plugins/flutter_webrtc/ios"
|
||||||
|
gal:
|
||||||
|
:path: ".symlinks/plugins/gal/darwin"
|
||||||
|
image_cropper:
|
||||||
|
:path: ".symlinks/plugins/image_cropper/ios"
|
||||||
image_picker_ios:
|
image_picker_ios:
|
||||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
livekit_client:
|
livekit_client:
|
||||||
:path: ".symlinks/plugins/livekit_client/ios"
|
:path: ".symlinks/plugins/livekit_client/ios"
|
||||||
|
media_kit_libs_ios_video:
|
||||||
|
:path: ".symlinks/plugins/media_kit_libs_ios_video/ios"
|
||||||
|
media_kit_native_event_loop:
|
||||||
|
:path: ".symlinks/plugins/media_kit_native_event_loop/ios"
|
||||||
|
media_kit_video:
|
||||||
|
:path: ".symlinks/plugins/media_kit_video/ios"
|
||||||
package_info_plus:
|
package_info_plus:
|
||||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
|
pasteboard:
|
||||||
|
:path: ".symlinks/plugins/pasteboard/ios"
|
||||||
path_provider_foundation:
|
path_provider_foundation:
|
||||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||||
sentry_flutter:
|
pointer_interceptor_ios:
|
||||||
:path: ".symlinks/plugins/sentry_flutter/ios"
|
:path: ".symlinks/plugins/pointer_interceptor_ios/ios"
|
||||||
|
protocol_handler_ios:
|
||||||
|
:path: ".symlinks/plugins/protocol_handler_ios/ios"
|
||||||
|
screen_brightness_ios:
|
||||||
|
:path: ".symlinks/plugins/screen_brightness_ios/ios"
|
||||||
|
share_plus:
|
||||||
|
:path: ".symlinks/plugins/share_plus/ios"
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
sqflite:
|
sqflite:
|
||||||
:path: ".symlinks/plugins/sqflite/darwin"
|
:path: ".symlinks/plugins/sqflite/darwin"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
video_player_avfoundation:
|
volume_controller:
|
||||||
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
|
:path: ".symlinks/plugins/volume_controller/ios"
|
||||||
wakelock_plus:
|
wakelock_plus:
|
||||||
:path: ".symlinks/plugins/wakelock_plus/ios"
|
:path: ".symlinks/plugins/wakelock_plus/ios"
|
||||||
|
|
||||||
@@ -237,36 +412,60 @@ SPEC CHECKSUMS:
|
|||||||
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||||
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||||
file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
|
file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655
|
||||||
Firebase: 26b040b20866a55f55eb3611b9fcf3ae64816b86
|
Firebase: 9f574c08c2396885b5e7e100ed4293d956218af9
|
||||||
firebase_core: 483cfad66d24d8f3c233f31db4263830c625c909
|
firebase_analytics: 1a66fe8d4375eccff44671ea37897683a78b2675
|
||||||
firebase_messaging: e60c0694699d8a2e56a319e043709583f6544123
|
firebase_core: ceec591a66629daaee82d3321551692c4a871493
|
||||||
FirebaseCore: a2b95ae4ce7c83ceecfbbbe3b6f1cddc7415a808
|
firebase_crashlytics: e4f04180f443d5a8b56fbc0685bdbd7d90dd26f0
|
||||||
FirebaseCoreInternal: 58d07f1362fddeb0feb6a857d1d1d1c5e558e698
|
firebase_messaging: 15d8b557010f3bb7b98d0302e1c7c8fbcd244425
|
||||||
FirebaseInstallations: 60c1d3bc1beef809fd1ad1189a8057a040c59f2e
|
firebase_performance: d373c742649e2d85d92cc223b4511c3d132887ef
|
||||||
FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e
|
FirebaseABTesting: c2e22c3aab99afa81d0561708b2c1c356c556976
|
||||||
|
FirebaseAnalytics: 27eb78b97880ea4a004839b9bac0b58880f5a92a
|
||||||
|
FirebaseCore: 3cf438f431f18c12cdf2aaf64434648b63f7e383
|
||||||
|
FirebaseCoreExtension: aa5c9779c2d0d39d83f1ceb3fdbafe80c4feecfa
|
||||||
|
FirebaseCoreInternal: adefedc9a88dbe393c4884640a73ec9e8e790f8c
|
||||||
|
FirebaseCrashlytics: 745d8f0221fe49c62865391d1bf56f5a12eeec0b
|
||||||
|
FirebaseInstallations: d0a8fea5a6fa91abc661591cf57c0f0d70863e57
|
||||||
|
FirebaseMessaging: d2d1d9c62c46dd2db49a952f7deb5b16ad2c9742
|
||||||
|
FirebasePerformance: efdc02bacb1b4710588c9f867011605c081cdf79
|
||||||
|
FirebaseRemoteConfig: 05521e937b72e01847a7128da5a492327364c705
|
||||||
|
FirebaseRemoteConfigInterop: abf8b1bbc0bf1b84abd22b66746926410bf91a87
|
||||||
|
FirebaseSessions: 78f137e68dc01ca71606169ba4ac73b98c13752a
|
||||||
|
FirebaseSharedSwift: 260a35e08943ec810d820a70bc0359136351d0c5
|
||||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||||
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
|
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
|
||||||
|
flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
|
||||||
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
|
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
|
||||||
flutter_webrtc: b33475c3a57d59ff05bf87b4f5d3feceac63f291
|
flutter_webrtc: 75b868e4f9e817c7a9a42ca4b6169063de4eec9f
|
||||||
GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
|
gal: 61e868295d28fe67ffa297fae6dacebf56fd53e1
|
||||||
GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
|
GoogleAppMeasurement: 6e49ffac7d3f2c3ded9cc663f912a13b67bbd0de
|
||||||
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
|
GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d
|
||||||
|
image_cropper: 37d40f62177c101ff4c164906d259ea2c3aa70cf
|
||||||
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
|
||||||
livekit_client: 2b3f5185f95d46d62d3570bf981f3d98ad3051e2
|
livekit_client: d079c5f040d4bf2b80440ff0ae997725a183e4bc
|
||||||
nanopb: 438bc412db1928dac798aa6fd75726007be04262
|
media_kit_libs_ios_video: a5fe24bc7875ccd6378a0978c13185e1344651c1
|
||||||
|
media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a
|
||||||
|
media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e
|
||||||
|
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||||
|
pasteboard: 982969ebaa7c78af3e6cc7761e8f5e77565d9ce0
|
||||||
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||||
|
pointer_interceptor_ios: 508241697ff0947f853c061945a8b822463947c1
|
||||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||||
SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
|
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
|
||||||
Sentry: 016de45ee5ce5fca2a829996f1bfafeb5e62e8b4
|
protocol_handler_ios: a5db8abc38526ee326988b808be621e5fd568990
|
||||||
sentry_flutter: 5fb57c5b7e6427a9dc1fedde4269eb65823982d4
|
screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625
|
||||||
|
SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
|
||||||
|
share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad
|
||||||
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
|
||||||
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
|
||||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||||
|
TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654
|
||||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||||
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
|
volume_controller: 531ddf792994285c9b17f9d8a7e4dcdd29b3eae9
|
||||||
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
|
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
|
||||||
WebRTC-SDK: 8c0edd05b880a39648118192c252667ea06dea51
|
WebRTC-SDK: c3d69a87e7185fad3568f6f3cff7c9ac5890acf3
|
||||||
|
|
||||||
PODFILE CHECKSUM: a57f30d18f102dd3ce366b1d62a55ecbef2158e5
|
PODFILE CHECKSUM: a57f30d18f102dd3ce366b1d62a55ecbef2158e5
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
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 */; };
|
||||||
697629BCCB242B335F9740F6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 644CB23863BAC87225224BEB /* Pods_Runner.framework */; };
|
697629BCCB242B335F9740F6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 644CB23863BAC87225224BEB /* Pods_Runner.framework */; };
|
||||||
|
730D648E2C4AC4D0005A1975 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 730D648D2C4AC4D0005A1975 /* NotificationService.swift */; };
|
||||||
|
730D64922C4AC4D0005A1975 /* SolianNotifyExt.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 730D648B2C4AC4D0005A1975 /* SolianNotifyExt.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
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 */; };
|
||||||
@@ -27,9 +29,27 @@
|
|||||||
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
|
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
|
||||||
remoteInfo = Runner;
|
remoteInfo = Runner;
|
||||||
};
|
};
|
||||||
|
730D64902C4AC4D0005A1975 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 730D648A2C4AC4D0005A1975;
|
||||||
|
remoteInfo = SolianNotifyExt;
|
||||||
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
730D64932C4AC4D0005A1975 /* Embed Foundation Extensions */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 13;
|
||||||
|
files = (
|
||||||
|
730D64922C4AC4D0005A1975 /* SolianNotifyExt.appex in Embed Foundation Extensions */,
|
||||||
|
);
|
||||||
|
name = "Embed Foundation Extensions";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
||||||
isa = PBXCopyFilesBuildPhase;
|
isa = PBXCopyFilesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -50,6 +70,9 @@
|
|||||||
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; };
|
||||||
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>"; };
|
||||||
644CB23863BAC87225224BEB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
644CB23863BAC87225224BEB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
730D648B2C4AC4D0005A1975 /* SolianNotifyExt.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = SolianNotifyExt.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
730D648D2C4AC4D0005A1975 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
|
||||||
|
730D648F2C4AC4D0005A1975 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
73EB49922C11F3D300A080A2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
|
73EB49922C11F3D300A080A2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; 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>"; };
|
||||||
@@ -79,6 +102,13 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
730D64882C4AC4D0005A1975 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -107,6 +137,15 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
730D648C2C4AC4D0005A1975 /* SolianNotifyExt */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
730D648D2C4AC4D0005A1975 /* NotificationService.swift */,
|
||||||
|
730D648F2C4AC4D0005A1975 /* Info.plist */,
|
||||||
|
);
|
||||||
|
path = SolianNotifyExt;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
7BA6BD8939A7BE19A2C7086C /* Pods */ = {
|
7BA6BD8939A7BE19A2C7086C /* Pods */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -136,6 +175,7 @@
|
|||||||
children = (
|
children = (
|
||||||
9740EEB11CF90186004384FC /* Flutter */,
|
9740EEB11CF90186004384FC /* Flutter */,
|
||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
|
730D648C2C4AC4D0005A1975 /* SolianNotifyExt */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||||
7BA6BD8939A7BE19A2C7086C /* Pods */,
|
7BA6BD8939A7BE19A2C7086C /* Pods */,
|
||||||
@@ -149,6 +189,7 @@
|
|||||||
children = (
|
children = (
|
||||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
||||||
|
730D648B2C4AC4D0005A1975 /* SolianNotifyExt.appex */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -191,23 +232,44 @@
|
|||||||
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
|
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
};
|
};
|
||||||
|
730D648A2C4AC4D0005A1975 /* SolianNotifyExt */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 730D64972C4AC4D0005A1975 /* Build configuration list for PBXNativeTarget "SolianNotifyExt" */;
|
||||||
|
buildPhases = (
|
||||||
|
730D64872C4AC4D0005A1975 /* Sources */,
|
||||||
|
730D64882C4AC4D0005A1975 /* Frameworks */,
|
||||||
|
730D64892C4AC4D0005A1975 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = SolianNotifyExt;
|
||||||
|
productName = SolianNotifyExt;
|
||||||
|
productReference = 730D648B2C4AC4D0005A1975 /* SolianNotifyExt.appex */;
|
||||||
|
productType = "com.apple.product-type.app-extension";
|
||||||
|
};
|
||||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
97C146ED1CF9000F007C117D /* Runner */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
B1CDA9DD5B638A2BB88053CB /* [CP] Check Pods Manifest.lock */,
|
B1CDA9DD5B638A2BB88053CB /* [CP] Check Pods Manifest.lock */,
|
||||||
|
7356FAC42C72724B0051A465 /* [Crashlytics] Clear dSYM */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
|
730D64932C4AC4D0005A1975 /* Embed Foundation Extensions */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
287A33C298CA352A7E7F32A4 /* [CP] Embed Pods Frameworks */,
|
287A33C298CA352A7E7F32A4 /* [CP] Embed Pods Frameworks */,
|
||||||
0818E8E4321C0D7433E07576 /* [CP] Copy Pods Resources */,
|
0818E8E4321C0D7433E07576 /* [CP] Copy Pods Resources */,
|
||||||
|
1A9FD6BE5DEE99CDA7399504 /* [Crashlytics] Upload dSYM */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
|
730D64912C4AC4D0005A1975 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
@@ -221,6 +283,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = YES;
|
BuildIndependentTargetsInParallel = YES;
|
||||||
|
LastSwiftUpdateCheck = 1540;
|
||||||
LastUpgradeCheck = 1510;
|
LastUpgradeCheck = 1510;
|
||||||
ORGANIZATIONNAME = "";
|
ORGANIZATIONNAME = "";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
@@ -228,6 +291,9 @@
|
|||||||
CreatedOnToolsVersion = 14.0;
|
CreatedOnToolsVersion = 14.0;
|
||||||
TestTargetID = 97C146ED1CF9000F007C117D;
|
TestTargetID = 97C146ED1CF9000F007C117D;
|
||||||
};
|
};
|
||||||
|
730D648A2C4AC4D0005A1975 = {
|
||||||
|
CreatedOnToolsVersion = 15.4;
|
||||||
|
};
|
||||||
97C146ED1CF9000F007C117D = {
|
97C146ED1CF9000F007C117D = {
|
||||||
CreatedOnToolsVersion = 7.3.1;
|
CreatedOnToolsVersion = 7.3.1;
|
||||||
LastSwiftMigration = 1100;
|
LastSwiftMigration = 1100;
|
||||||
@@ -249,6 +315,7 @@
|
|||||||
targets = (
|
targets = (
|
||||||
97C146ED1CF9000F007C117D /* Runner */,
|
97C146ED1CF9000F007C117D /* Runner */,
|
||||||
331C8080294A63A400263BE5 /* RunnerTests */,
|
331C8080294A63A400263BE5 /* RunnerTests */,
|
||||||
|
730D648A2C4AC4D0005A1975 /* SolianNotifyExt */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@@ -261,6 +328,13 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
730D64892C4AC4D0005A1975 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
97C146EC1CF9000F007C117D /* Resources */ = {
|
97C146EC1CF9000F007C117D /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -293,6 +367,24 @@
|
|||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
|
1A9FD6BE5DEE99CDA7399504 /* [Crashlytics] Upload dSYM */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "[Crashlytics] Upload dSYM";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\n#!/bin/bash\nsleep 1 # Without this, there seems a chance that the script runs before dSYM generation is finished \n$PODS_ROOT/FirebaseCrashlytics/upload-symbols -gsp $PROJECT_DIR/Runner/GoogleService-Info.plist -p ios $DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME\n";
|
||||||
|
};
|
||||||
259653AE41D478F4C6BAE9B2 /* [CP] Check Pods Manifest.lock */ = {
|
259653AE41D478F4C6BAE9B2 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -348,6 +440,24 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||||
};
|
};
|
||||||
|
7356FAC42C72724B0051A465 /* [Crashlytics] Clear dSYM */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "[Crashlytics] Clear dSYM";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\n#!/bin/bash\nrm -rf $DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME\n";
|
||||||
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@@ -361,7 +471,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
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\n";
|
||||||
};
|
};
|
||||||
B1CDA9DD5B638A2BB88053CB /* [CP] Check Pods Manifest.lock */ = {
|
B1CDA9DD5B638A2BB88053CB /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
@@ -396,6 +506,14 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
730D64872C4AC4D0005A1975 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
730D648E2C4AC4D0005A1975 /* NotificationService.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
97C146EA1CF9000F007C117D /* Sources */ = {
|
97C146EA1CF9000F007C117D /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -413,6 +531,11 @@
|
|||||||
target = 97C146ED1CF9000F007C117D /* Runner */;
|
target = 97C146ED1CF9000F007C117D /* Runner */;
|
||||||
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
|
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
|
730D64912C4AC4D0005A1975 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 730D648A2C4AC4D0005A1975 /* SolianNotifyExt */;
|
||||||
|
targetProxy = 730D64902C4AC4D0005A1975 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
/* End PBXTargetDependency section */
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
/* Begin PBXVariantGroup section */
|
||||||
@@ -491,6 +614,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
@@ -498,6 +622,8 @@
|
|||||||
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -563,6 +689,120 @@
|
|||||||
};
|
};
|
||||||
name = Profile;
|
name = Profile;
|
||||||
};
|
};
|
||||||
|
730D64942C4AC4D0005A1975 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = SolianNotifyExt/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = SolianNotifyExt;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@executable_path/../../Frameworks",
|
||||||
|
);
|
||||||
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianNotifyExt;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
730D64952C4AC4D0005A1975 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = SolianNotifyExt/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = SolianNotifyExt;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@executable_path/../../Frameworks",
|
||||||
|
);
|
||||||
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianNotifyExt;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
730D64962C4AC4D0005A1975 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||||
|
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = SolianNotifyExt/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = SolianNotifyExt;
|
||||||
|
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@executable_path/../../Frameworks",
|
||||||
|
);
|
||||||
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
MTL_FAST_MATH = YES;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.SolianNotifyExt;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
97C147031CF9000F007C117D /* Debug */ = {
|
97C147031CF9000F007C117D /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@@ -678,6 +918,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
@@ -685,6 +926,8 @@
|
|||||||
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -702,6 +945,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
|
||||||
@@ -709,6 +953,8 @@
|
|||||||
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
DEVELOPMENT_TEAM = W7HPZ53V6B;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = Solian;
|
||||||
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -734,6 +980,16 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
730D64972C4AC4D0005A1975 /* Build configuration list for PBXNativeTarget "SolianNotifyExt" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
730D64942C4AC4D0005A1975 /* Debug */,
|
||||||
|
730D64952C4AC4D0005A1975 /* Release */,
|
||||||
|
730D64962C4AC4D0005A1975 /* Profile */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import UIKit
|
import UIKit
|
||||||
import Flutter
|
import Flutter
|
||||||
|
|
||||||
@UIApplicationMain
|
@main
|
||||||
@objc class AppDelegate: FlutterAppDelegate {
|
@objc class AppDelegate: FlutterAppDelegate {
|
||||||
override func application(
|
override func application(
|
||||||
_ application: UIApplication,
|
_ application: UIApplication,
|
||||||
@@ -13,6 +13,5 @@ import Flutter
|
|||||||
|
|
||||||
override func applicationDidBecomeActive(_ application: UIApplication) {
|
override func applicationDidBecomeActive(_ application: UIApplication) {
|
||||||
application.applicationIconBadgeNumber = 0;
|
application.applicationIconBadgeNumber = 0;
|
||||||
UNUserNotificationCenter.current().removeAllDeliveredNotifications();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 320 KiB |
|
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 822 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 868 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 20 KiB |
22
ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "background.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "darkbackground.png",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
vendored
Normal file
|
After Width: | Height: | Size: 69 B |
BIN
ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png
vendored
Normal file
|
After Width: | Height: | Size: 69 B |
@@ -1,23 +1,23 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage.png",
|
"filename" : "LaunchImage.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage@2x.png",
|
"filename" : "LaunchImage@2x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage@3x.png",
|
"filename" : "LaunchImage@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
"version" : 1,
|
"author" : "xcode",
|
||||||
"author" : "xcode"
|
"version" : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 68 B After Width: | Height: | Size: 233 KiB |
@@ -16,13 +16,19 @@
|
|||||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
<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 clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" image="LaunchBackground" translatesAutoresizingMaskIntoConstraints="NO" id="tWc-Dq-wcI"/>
|
||||||
</imageView>
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"></imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<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="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="3T2-ad-Qdv"/>
|
||||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
|
<constraint firstItem="tWc-Dq-wcI" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="RPx-PI-7Xg"/>
|
||||||
|
<constraint firstItem="tWc-Dq-wcI" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="SdS-ul-q2q"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="tWc-Dq-wcI" secondAttribute="trailing" id="Swv-Gf-Rwn"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="YRO-k0-Ey4" secondAttribute="trailing" id="TQA-XW-tRk"/>
|
||||||
|
<constraint firstItem="YRO-k0-Ey4" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="duK-uY-Gun"/>
|
||||||
|
<constraint firstItem="tWc-Dq-wcI" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="kV7-tw-vXt"/>
|
||||||
|
<constraint firstItem="YRO-k0-Ey4" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="xPn-NY-SIU"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
</viewController>
|
</viewController>
|
||||||
@@ -32,6 +38,7 @@
|
|||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
<image name="LaunchImage" width="168" height="185"/>
|
<image name="LaunchImage" width="1026" height="1024"/>
|
||||||
|
<image name="LaunchBackground" width="1" height="1"/>
|
||||||
</resources>
|
</resources>
|
||||||
</document>
|
</document>
|
||||||
|
|||||||
@@ -1,66 +1,87 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>FirebaseMessagingAutoInitEnabled</key>
|
<key>CFBundleURLTypes</key>
|
||||||
<false/>
|
<array>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<dict>
|
||||||
<true/>
|
<key>CFBundleURLName</key>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<string></string>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<key>CFBundleTypeRole</key>
|
||||||
<key>CFBundleDisplayName</key>
|
<string>Editor</string>
|
||||||
<string>Solian</string>
|
<key>CFBundleURLSchemes</key>
|
||||||
<key>CFBundleExecutable</key>
|
<array>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>solink</string>
|
||||||
<key>CFBundleIdentifier</key>
|
</array>
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
</dict>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
</array>
|
||||||
<string>6.0</string>
|
<key>FirebaseMessagingAutoInitEnabled</key>
|
||||||
<key>CFBundleName</key>
|
<false/>
|
||||||
<string>solian</string>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
<key>CFBundlePackageType</key>
|
<true/>
|
||||||
<string>APPL</string>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<key>CFBundleShortVersionString</key>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<key>CFBundleDisplayName</key>
|
||||||
<key>CFBundleSignature</key>
|
<string>Solian</string>
|
||||||
<string>????</string>
|
<key>CFBundleExecutable</key>
|
||||||
<key>CFBundleVersion</key>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<key>CFBundleIdentifier</key>
|
||||||
<key>ITSAppUsesNonExemptEncryption</key>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<false/>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<string>6.0</string>
|
||||||
<true/>
|
<key>CFBundleName</key>
|
||||||
<key>NSCameraUsageDescription</key>
|
<string>solian</string>
|
||||||
<string>Allow you take photo/video for your message or post</string>
|
<key>CFBundlePackageType</key>
|
||||||
<key>NSMicrophoneUsageDescription</key>
|
<string>APPL</string>
|
||||||
<string>Allow you record audio for your message or post</string>
|
<key>CFBundleShortVersionString</key>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||||
<string>Allow you add photo to your message or post</string>
|
<key>CFBundleSignature</key>
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<string>????</string>
|
||||||
<true/>
|
<key>CFBundleVersion</key>
|
||||||
<key>UIBackgroundModes</key>
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
<array>
|
<key>ITSAppUsesNonExemptEncryption</key>
|
||||||
<string>audio</string>
|
<false/>
|
||||||
<string>fetch</string>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<string>remote-notification</string>
|
<true/>
|
||||||
<string>voip</string>
|
<key>NSCameraUsageDescription</key>
|
||||||
</array>
|
<string>Allow you take photo/video for your message or post</string>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>NSMicrophoneUsageDescription</key>
|
||||||
<string>LaunchScreen</string>
|
<string>Allow you record audio for your message or post</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>Main</string>
|
<string>Allow you add photo to your message or post</string>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<array>
|
<true/>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<key>UIBackgroundModes</key>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<array>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>audio</string>
|
||||||
</array>
|
<string>fetch</string>
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
<string>remote-notification</string>
|
||||||
<array>
|
<string>voip</string>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
</array>
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>LaunchScreen</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<key>UIMainStoryboardFile</key>
|
||||||
</array>
|
<string>Main</string>
|
||||||
</dict>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>FlutterDeepLinkingEnabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSUserActivityTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>INSendMessageIntent</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UIStatusBarHidden</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -4,5 +4,14 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>aps-environment</key>
|
<key>aps-environment</key>
|
||||||
<string>development</string>
|
<string>development</string>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array>
|
||||||
|
<string>webcredentials:solsynth.dev</string>
|
||||||
|
<string>applinks:solsynth.dev</string>
|
||||||
|
<string>webcredentials:sn.solsynth.dev</string>
|
||||||
|
<string>applinks:sn.solsynth.dev</string>
|
||||||
|
</array>
|
||||||
|
<key>com.apple.developer.usernotifications.communication</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
18
ios/SolianNotifyExt/Info.plist
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSUserActivityTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>INStartCallIntent</string>
|
||||||
|
<string>INSendMessageIntent</string>
|
||||||
|
</array>
|
||||||
|
<key>NSExtension</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExtensionPointIdentifier</key>
|
||||||
|
<string>com.apple.usernotifications.service</string>
|
||||||
|
<key>NSExtensionPrincipalClass</key>
|
||||||
|
<string>$(PRODUCT_MODULE_NAME).NotificationService</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
81
ios/SolianNotifyExt/NotificationService.swift
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
//
|
||||||
|
// NotificationService.swift
|
||||||
|
// SolianNotifyExt
|
||||||
|
//
|
||||||
|
// Created by LittleSheep on 2024/7/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import UserNotifications
|
||||||
|
import Intents
|
||||||
|
|
||||||
|
enum ParseNotificationPayloadError: Error {
|
||||||
|
case noMetadata(String)
|
||||||
|
case noAvatarUrl(String)
|
||||||
|
}
|
||||||
|
|
||||||
|
class NotificationService: UNNotificationServiceExtension {
|
||||||
|
|
||||||
|
var contentHandler: ((UNNotificationContent) -> Void)?
|
||||||
|
var bestAttemptContent: UNMutableNotificationContent?
|
||||||
|
|
||||||
|
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
||||||
|
self.contentHandler = contentHandler
|
||||||
|
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
|
||||||
|
|
||||||
|
if let bestAttemptContent = bestAttemptContent {
|
||||||
|
do {
|
||||||
|
switch bestAttemptContent.categoryIdentifier {
|
||||||
|
case "messaging.message", "messaging.callStart":
|
||||||
|
guard let metadata = bestAttemptContent.userInfo["metadata"] as? [AnyHashable : Any] else {
|
||||||
|
throw ParseNotificationPayloadError.noMetadata("The notification has no metadata.")
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let avatarUrl = bestAttemptContent.userInfo["avatar"] as? String else {
|
||||||
|
throw ParseNotificationPayloadError.noMetadata("The notification has no avatar url.")
|
||||||
|
}
|
||||||
|
|
||||||
|
let handle = INPersonHandle(value: String(metadata["user_id"] as! Int), type: .unknown)
|
||||||
|
let avatar = INImage(
|
||||||
|
url: URL(string: avatarUrl)!
|
||||||
|
)!
|
||||||
|
let sender = INPerson(personHandle: handle,
|
||||||
|
nameComponents: nil,
|
||||||
|
displayName: bestAttemptContent.title,
|
||||||
|
image: avatar,
|
||||||
|
contactIdentifier: nil,
|
||||||
|
customIdentifier: nil)
|
||||||
|
let intent = INSendMessageIntent(recipients: nil,
|
||||||
|
outgoingMessageType: .outgoingMessageText,
|
||||||
|
content: bestAttemptContent.body,
|
||||||
|
speakableGroupName: nil,
|
||||||
|
conversationIdentifier: String(metadata["channel_id"] as! Int),
|
||||||
|
serviceName: nil,
|
||||||
|
sender: sender,
|
||||||
|
attachments: nil)
|
||||||
|
|
||||||
|
let interaction = INInteraction(intent: intent, response: nil)
|
||||||
|
interaction.direction = .incoming
|
||||||
|
interaction.donate(completion: nil)
|
||||||
|
|
||||||
|
let updatedContent = try request.content.updating(from: intent)
|
||||||
|
contentHandler(updatedContent)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
contentHandler(bestAttemptContent)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
contentHandler(bestAttemptContent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func serviceExtensionTimeWillExpire() {
|
||||||
|
// Called just before the extension will be terminated by the system.
|
||||||
|
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
|
||||||
|
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
|
||||||
|
contentHandler(bestAttemptContent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
269
lib/bootstrapper.dart
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:solian/exts.dart';
|
||||||
|
import 'package:solian/platform.dart';
|
||||||
|
import 'package:solian/providers/auth.dart';
|
||||||
|
import 'package:solian/providers/content/channel.dart';
|
||||||
|
import 'package:solian/providers/content/realm.dart';
|
||||||
|
import 'package:solian/providers/relation.dart';
|
||||||
|
import 'package:solian/providers/stickers.dart';
|
||||||
|
import 'package:solian/providers/theme_switcher.dart';
|
||||||
|
import 'package:solian/providers/websocket.dart';
|
||||||
|
import 'package:solian/services.dart';
|
||||||
|
import 'package:solian/widgets/sized_container.dart';
|
||||||
|
|
||||||
|
class BootstrapperShell extends StatefulWidget {
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
const BootstrapperShell({super.key, required this.child});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<BootstrapperShell> createState() => _BootstrapperShellState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _BootstrapperShellState extends State<BootstrapperShell> {
|
||||||
|
bool _isBusy = true;
|
||||||
|
bool _isErrored = false;
|
||||||
|
bool _isDismissable = true;
|
||||||
|
String? _subtitle;
|
||||||
|
|
||||||
|
Color get _unFocusColor =>
|
||||||
|
Theme.of(context).colorScheme.onSurface.withOpacity(0.75);
|
||||||
|
|
||||||
|
int _periodCursor = 0;
|
||||||
|
|
||||||
|
late final List<({String label, Future<void> Function() action})> _periods = [
|
||||||
|
(
|
||||||
|
label: 'bsLoadingTheme',
|
||||||
|
action: () async {
|
||||||
|
await context.read<ThemeSwitcher>().restoreTheme();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsCheckForUpdate',
|
||||||
|
action: () async {
|
||||||
|
if (PlatformInfo.isWeb) return;
|
||||||
|
try {
|
||||||
|
final info = await PackageInfo.fromPlatform();
|
||||||
|
final localVersionString = '${info.version}+${info.buildNumber}';
|
||||||
|
final resp = await GetConnect().get(
|
||||||
|
'https://git.solsynth.dev/api/v1/repos/hydrogen/solian/tags?limit=1',
|
||||||
|
);
|
||||||
|
if (resp.body[0]['name'] != localVersionString) {
|
||||||
|
setState(() {
|
||||||
|
_isErrored = true;
|
||||||
|
_subtitle = PlatformInfo.isIOS || PlatformInfo.isMacOS
|
||||||
|
? 'bsCheckForUpdateDescApple'.tr
|
||||||
|
: 'bsCheckForUpdateDescCommon'.tr;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
setState(() {
|
||||||
|
_isErrored = true;
|
||||||
|
_subtitle = 'bsCheckForUpdateFailed'.tr;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsCheckingServer',
|
||||||
|
action: () async {
|
||||||
|
final client = ServiceFinder.configureClient('dealer');
|
||||||
|
final resp = await client.get('/.well-known');
|
||||||
|
if (resp.statusCode != null && resp.statusCode != 200) {
|
||||||
|
setState(() {
|
||||||
|
_isErrored = true;
|
||||||
|
_subtitle = 'bsCheckingServerDown'.tr;
|
||||||
|
_isDismissable = false;
|
||||||
|
});
|
||||||
|
throw Exception('unable connect to server');
|
||||||
|
} else if (resp.statusCode == null) {
|
||||||
|
setState(() {
|
||||||
|
_isErrored = true;
|
||||||
|
_subtitle = 'bsCheckingServerFail'.tr;
|
||||||
|
_isDismissable = false;
|
||||||
|
});
|
||||||
|
throw Exception('unable connect to server');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsAuthorizing',
|
||||||
|
action: () async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
await auth.refreshAuthorizeStatus();
|
||||||
|
if (auth.isAuthorized.isTrue) {
|
||||||
|
await auth.refreshUserProfile();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsEstablishingConn',
|
||||||
|
action: () async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
if (auth.isAuthorized.isTrue) {
|
||||||
|
await Get.find<WebSocketProvider>().connect();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsPreparingData',
|
||||||
|
action: () async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
try {
|
||||||
|
await Future.wait([
|
||||||
|
Get.find<StickerProvider>().refreshAvailableStickers(),
|
||||||
|
if (auth.isAuthorized.isTrue)
|
||||||
|
Get.find<ChannelProvider>().refreshAvailableChannel(),
|
||||||
|
if (auth.isAuthorized.isTrue)
|
||||||
|
Get.find<RelationshipProvider>().refreshRelativeList(),
|
||||||
|
if (auth.isAuthorized.isTrue)
|
||||||
|
Get.find<RealmProvider>().refreshAvailableRealms(),
|
||||||
|
]);
|
||||||
|
} catch (e) {
|
||||||
|
context.showErrorDialog(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
(
|
||||||
|
label: 'bsRegisteringPushNotify',
|
||||||
|
action: () async {
|
||||||
|
final AuthProvider auth = Get.find();
|
||||||
|
if (auth.isAuthorized.isTrue) {
|
||||||
|
try {
|
||||||
|
Get.find<WebSocketProvider>().registerPushNotifications();
|
||||||
|
} catch (err) {
|
||||||
|
context.showSnackbar(
|
||||||
|
'pushNotifyRegisterFailed'.trParams({'reason': err.toString()}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
Future<void> _runPeriods() async {
|
||||||
|
try {
|
||||||
|
for (var idx = 0; idx < _periods.length; idx++) {
|
||||||
|
await _periods[idx].action();
|
||||||
|
if (_isErrored && !_isDismissable) break;
|
||||||
|
if (_periodCursor < _periods.length - 1) {
|
||||||
|
setState(() => _periodCursor++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
setState(() => _isBusy = false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_runPeriods();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (_isBusy || _isErrored) {
|
||||||
|
return GestureDetector(
|
||||||
|
child: Material(
|
||||||
|
color: Theme.of(context).colorScheme.surface,
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 280,
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: const BorderRadius.all(Radius.circular(16)),
|
||||||
|
child:
|
||||||
|
Image.asset('assets/logo.png', width: 80, height: 80),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
if (_isErrored && !_isDismissable && !_isBusy)
|
||||||
|
const Icon(Icons.cancel, size: 24),
|
||||||
|
if (_isErrored && _isDismissable && !_isBusy)
|
||||||
|
const Icon(Icons.warning, size: 24),
|
||||||
|
if ((_isErrored && _isDismissable && _isBusy) || _isBusy)
|
||||||
|
const SizedBox(
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
child: CircularProgressIndicator(strokeWidth: 3),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
CenteredContainer(
|
||||||
|
maxWidth: 280,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
if (_subtitle == null)
|
||||||
|
Text(
|
||||||
|
'${_periods[_periodCursor].label.tr} (${_periodCursor + 1}/${_periods.length})',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13,
|
||||||
|
color: _unFocusColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if (_subtitle != null)
|
||||||
|
Text(
|
||||||
|
_subtitle!,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13,
|
||||||
|
color: _unFocusColor,
|
||||||
|
),
|
||||||
|
).paddingOnly(bottom: 4),
|
||||||
|
if (!_isBusy && _isErrored && _isDismissable)
|
||||||
|
Text(
|
||||||
|
'bsDismissibleErrorHint'.tr,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13,
|
||||||
|
color: _unFocusColor,
|
||||||
|
),
|
||||||
|
).paddingOnly(bottom: 5),
|
||||||
|
Text(
|
||||||
|
'2024 © Solsynth LLC',
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 11,
|
||||||
|
color: _unFocusColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
if (_isBusy) return;
|
||||||
|
if (_isDismissable) {
|
||||||
|
setState(() {
|
||||||
|
_isBusy = false;
|
||||||
|
_isErrored = false;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
_isBusy = true;
|
||||||
|
_isErrored = false;
|
||||||
|
_periodCursor = 0;
|
||||||
|
});
|
||||||
|
_runPeriods();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return widget.child;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ import 'package:get/get.dart';
|
|||||||
import 'package:solian/models/channel.dart';
|
import 'package:solian/models/channel.dart';
|
||||||
import 'package:solian/models/event.dart';
|
import 'package:solian/models/event.dart';
|
||||||
import 'package:solian/platform.dart';
|
import 'package:solian/platform.dart';
|
||||||
import 'package:solian/providers/message/helper.dart';
|
import 'package:solian/providers/message/adaptor.dart';
|
||||||
import 'package:solian/providers/message/events.dart';
|
import 'package:solian/providers/message/events.dart';
|
||||||
|
|
||||||
class ChatEventController {
|
class ChatEventController {
|
||||||
@@ -16,7 +16,7 @@ class ChatEventController {
|
|||||||
Channel? channel;
|
Channel? channel;
|
||||||
String? scope;
|
String? scope;
|
||||||
|
|
||||||
initialize() async {
|
Future<void> initialize() async {
|
||||||
if (!PlatformInfo.isWeb) {
|
if (!PlatformInfo.isWeb) {
|
||||||
database = await createHistoryDb();
|
database = await createHistoryDb();
|
||||||
}
|
}
|
||||||
@@ -57,11 +57,13 @@ class ChatEventController {
|
|||||||
totalEvents.value = result?.$2 ?? 0;
|
totalEvents.value = result?.$2 ?? 0;
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
for (final x in result.$1.reversed) {
|
for (final x in result.$1.reversed) {
|
||||||
applyEvent(LocalEvent(x.id, x, x.channelId, x.createdAt));
|
final entry = LocalEvent(x.id, x, x.channelId, x.createdAt);
|
||||||
|
insertEvent(entry);
|
||||||
|
applyEvent(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final result = await database.syncEvents(
|
final result = await database.syncRemoteEvents(
|
||||||
channel,
|
channel,
|
||||||
scope: scope,
|
scope: scope,
|
||||||
);
|
);
|
||||||
@@ -80,14 +82,16 @@ class ChatEventController {
|
|||||||
remainDepth: 3,
|
remainDepth: 3,
|
||||||
offset: currentEvents.length,
|
offset: currentEvents.length,
|
||||||
);
|
);
|
||||||
totalEvents.value = result?.$2 ?? 0;
|
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
|
totalEvents.value = result.$2;
|
||||||
for (final x in result.$1.reversed) {
|
for (final x in result.$1.reversed) {
|
||||||
applyEvent(LocalEvent(x.id, x, x.channelId, x.createdAt));
|
final entry = LocalEvent(x.id, x, x.channelId, x.createdAt);
|
||||||
|
currentEvents.add(entry);
|
||||||
|
applyEvent(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final result = await database.syncEvents(
|
final result = await database.syncRemoteEvents(
|
||||||
channel,
|
channel,
|
||||||
depth: 3,
|
depth: 3,
|
||||||
scope: scope,
|
scope: scope,
|
||||||
@@ -102,6 +106,7 @@ class ChatEventController {
|
|||||||
Future<bool> syncLocal(Channel channel) async {
|
Future<bool> syncLocal(Channel channel) async {
|
||||||
if (PlatformInfo.isWeb) return false;
|
if (PlatformInfo.isWeb) return false;
|
||||||
final data = await database.localEvents.findAllByChannel(channel.id);
|
final data = await database.localEvents.findAllByChannel(channel.id);
|
||||||
|
currentEvents.replaceRange(0, currentEvents.length, data);
|
||||||
for (final x in data.reversed) {
|
for (final x in data.reversed) {
|
||||||
applyEvent(x);
|
applyEvent(x);
|
||||||
}
|
}
|
||||||
@@ -121,10 +126,11 @@ class ChatEventController {
|
|||||||
entry = await database.receiveEvent(remote);
|
entry = await database.receiveEvent(remote);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
insertEvent(entry);
|
||||||
applyEvent(entry);
|
applyEvent(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyEvent(LocalEvent entry) {
|
insertEvent(LocalEvent entry) {
|
||||||
if (entry.channelId != channel?.id) return;
|
if (entry.channelId != channel?.id) return;
|
||||||
|
|
||||||
final idx = currentEvents.indexWhere((x) => x.data.uuid == entry.data.uuid);
|
final idx = currentEvents.indexWhere((x) => x.data.uuid == entry.data.uuid);
|
||||||
@@ -133,6 +139,10 @@ class ChatEventController {
|
|||||||
} else {
|
} else {
|
||||||
currentEvents.insert(0, entry);
|
currentEvents.insert(0, entry);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
applyEvent(LocalEvent entry) {
|
||||||
|
if (entry.channelId != channel?.id) return;
|
||||||
|
|
||||||
switch (entry.data.type) {
|
switch (entry.data.type) {
|
||||||
case 'messages.edit':
|
case 'messages.edit':
|
||||||
|
|||||||
364
lib/controllers/post_editor_controller.dart
Normal file
@@ -0,0 +1,364 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:solian/models/post.dart';
|
||||||
|
import 'package:solian/models/realm.dart';
|
||||||
|
import 'package:solian/widgets/attachments/attachment_editor.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_categories_tags.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_date.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_overview.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_publish_zone.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_thumbnail.dart';
|
||||||
|
import 'package:solian/widgets/posts/editor/post_editor_visibility.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
class PostEditorController extends GetxController {
|
||||||
|
late final SharedPreferences _prefs;
|
||||||
|
|
||||||
|
final aliasController = TextEditingController();
|
||||||
|
final titleController = TextEditingController();
|
||||||
|
final descriptionController = TextEditingController();
|
||||||
|
final contentController = TextEditingController();
|
||||||
|
|
||||||
|
RxInt mode = 0.obs;
|
||||||
|
RxInt contentLength = 0.obs;
|
||||||
|
|
||||||
|
Rx<Post?> editTo = Rx(null);
|
||||||
|
Rx<Post?> replyTo = Rx(null);
|
||||||
|
Rx<Post?> repostTo = Rx(null);
|
||||||
|
Rx<Realm?> realmZone = Rx(null);
|
||||||
|
Rx<DateTime?> publishedAt = Rx(null);
|
||||||
|
Rx<DateTime?> publishedUntil = Rx(null);
|
||||||
|
RxList<String> attachments = RxList<String>.empty(growable: true);
|
||||||
|
RxList<String> tags = RxList<String>.empty(growable: true);
|
||||||
|
Rx<String?> thumbnail = Rx(null);
|
||||||
|
|
||||||
|
RxList<int> visibleUsers = RxList.empty(growable: true);
|
||||||
|
RxList<int> invisibleUsers = RxList.empty(growable: true);
|
||||||
|
|
||||||
|
RxInt visibility = 0.obs;
|
||||||
|
RxBool isDraft = false.obs;
|
||||||
|
|
||||||
|
RxBool isRestoreFromLocal = false.obs;
|
||||||
|
Rx<DateTime?> lastSaveTime = Rx(null);
|
||||||
|
Timer? _saveTimer;
|
||||||
|
|
||||||
|
PostEditorController() {
|
||||||
|
SharedPreferences.getInstance().then((inst) {
|
||||||
|
_prefs = inst;
|
||||||
|
_saveTimer = Timer.periodic(
|
||||||
|
const Duration(seconds: 3),
|
||||||
|
(Timer t) {
|
||||||
|
if (isNotEmpty) {
|
||||||
|
localSave();
|
||||||
|
lastSaveTime.value = DateTime.now();
|
||||||
|
lastSaveTime.refresh();
|
||||||
|
} else if (_prefs.containsKey('post_editor_local_save')) {
|
||||||
|
localClear();
|
||||||
|
lastSaveTime.value = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
contentController.addListener(() {
|
||||||
|
contentLength.value = contentController.text.length;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editOverview(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorOverviewDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editVisibility(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorVisibilityDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editCategoriesAndTags(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorCategoriesDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editPublishZone(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorPublishZoneDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editPublishDate(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorDateDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editAttachment(BuildContext context) {
|
||||||
|
return showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AttachmentEditorPopup(
|
||||||
|
pool: 'interactive',
|
||||||
|
initialAttachments: attachments,
|
||||||
|
onAdd: (String value) {
|
||||||
|
attachments.add(value);
|
||||||
|
},
|
||||||
|
onRemove: (String value) {
|
||||||
|
attachments.remove(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> editThumbnail(BuildContext context) {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => PostEditorThumbnailDialog(
|
||||||
|
controller: this,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleDraftMode() {
|
||||||
|
isDraft.value = !isDraft.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void localSave() {
|
||||||
|
_prefs.setString(
|
||||||
|
'post_editor_local_save',
|
||||||
|
jsonEncode({
|
||||||
|
...payload,
|
||||||
|
'reply_to': replyTo.value?.toJson(),
|
||||||
|
'repost_to': repostTo.value?.toJson(),
|
||||||
|
'edit_to': editTo.value?.toJson(),
|
||||||
|
'realm': realmZone.value?.toJson(),
|
||||||
|
'type': type,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void localRead() {
|
||||||
|
SharedPreferences.getInstance().then((inst) {
|
||||||
|
if (inst.containsKey('post_editor_local_save')) {
|
||||||
|
isRestoreFromLocal.value = true;
|
||||||
|
payload = jsonDecode(inst.getString('post_editor_local_save')!);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void localClear() {
|
||||||
|
_prefs.remove('post_editor_local_save');
|
||||||
|
}
|
||||||
|
|
||||||
|
void currentClear() {
|
||||||
|
aliasController.clear();
|
||||||
|
titleController.clear();
|
||||||
|
descriptionController.clear();
|
||||||
|
contentController.clear();
|
||||||
|
attachments.clear();
|
||||||
|
tags.clear();
|
||||||
|
visibleUsers.clear();
|
||||||
|
invisibleUsers.clear();
|
||||||
|
visibility.value = 0;
|
||||||
|
thumbnail.value = null;
|
||||||
|
publishedAt.value = null;
|
||||||
|
publishedUntil.value = null;
|
||||||
|
isDraft.value = false;
|
||||||
|
isRestoreFromLocal.value = false;
|
||||||
|
lastSaveTime.value = null;
|
||||||
|
contentLength.value = 0;
|
||||||
|
editTo.value = null;
|
||||||
|
replyTo.value = null;
|
||||||
|
repostTo.value = null;
|
||||||
|
realmZone.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
set editTarget(Post? value) {
|
||||||
|
if (value == null) {
|
||||||
|
editTo.value = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = value.type;
|
||||||
|
editTo.value = value;
|
||||||
|
realmZone.value = value.realm;
|
||||||
|
isDraft.value = value.isDraft ?? false;
|
||||||
|
aliasController.text = value.alias ?? '';
|
||||||
|
titleController.text = value.body['title'] ?? '';
|
||||||
|
descriptionController.text = value.body['description'] ?? '';
|
||||||
|
contentController.text = value.body['content'] ?? '';
|
||||||
|
publishedAt.value = value.publishedAt;
|
||||||
|
publishedUntil.value = value.publishedUntil;
|
||||||
|
tags.value = List.from(
|
||||||
|
value.body['tags']?.map((x) => x['alias']).toList() ?? List.empty(),
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
tags.refresh();
|
||||||
|
attachments.value = List.from(
|
||||||
|
value.body['attachments'] ?? List.empty(),
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
attachments.refresh();
|
||||||
|
thumbnail.value = value.body['thumbnail'];
|
||||||
|
|
||||||
|
contentLength.value = contentController.text.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
String get typeEndpoint {
|
||||||
|
switch (mode.value) {
|
||||||
|
case 0:
|
||||||
|
return 'stories';
|
||||||
|
case 1:
|
||||||
|
return 'articles';
|
||||||
|
default:
|
||||||
|
return 'stories';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get type {
|
||||||
|
switch (mode.value) {
|
||||||
|
case 0:
|
||||||
|
return 'story';
|
||||||
|
case 1:
|
||||||
|
return 'article';
|
||||||
|
default:
|
||||||
|
return 'story';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set type(String value) {
|
||||||
|
switch (value) {
|
||||||
|
case 'story':
|
||||||
|
mode.value = 0;
|
||||||
|
case 'article':
|
||||||
|
mode.value = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String? get title {
|
||||||
|
if (titleController.text.isEmpty) return null;
|
||||||
|
return titleController.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
String? get description {
|
||||||
|
if (descriptionController.text.isEmpty) return null;
|
||||||
|
return descriptionController.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> get payload {
|
||||||
|
return {
|
||||||
|
'alias': aliasController.text,
|
||||||
|
'title': title,
|
||||||
|
'description': description,
|
||||||
|
'content': contentController.text,
|
||||||
|
'thumbnail': thumbnail.value,
|
||||||
|
'tags': tags.map((x) => {'alias': x}).toList(),
|
||||||
|
'attachments': attachments,
|
||||||
|
'visible_users': visibleUsers,
|
||||||
|
'invisible_users': invisibleUsers,
|
||||||
|
'visibility': visibility.value,
|
||||||
|
'published_at': publishedAt.value?.toUtc().toIso8601String() ??
|
||||||
|
DateTime.now().toUtc().toIso8601String(),
|
||||||
|
'published_until': publishedUntil.value?.toUtc().toIso8601String(),
|
||||||
|
'is_draft': isDraft.value,
|
||||||
|
if (replyTo.value != null) 'reply_to': replyTo.value!.id,
|
||||||
|
if (repostTo.value != null) 'repost_to': repostTo.value!.id,
|
||||||
|
if (realmZone.value != null) 'realm': realmZone.value!.alias,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
set payload(Map<String, dynamic> value) {
|
||||||
|
type = value['type'];
|
||||||
|
tags.value = List.from(
|
||||||
|
value['tags'].map((x) => x['alias']).toList(),
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
aliasController.text = value['alias'] ?? '';
|
||||||
|
titleController.text = value['title'] ?? '';
|
||||||
|
descriptionController.text = value['description'] ?? '';
|
||||||
|
contentController.text = value['content'] ?? '';
|
||||||
|
attachments.value = List.from(
|
||||||
|
value['attachments'] ?? List.empty(),
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
attachments.refresh();
|
||||||
|
thumbnail.value = value['thumbnail'];
|
||||||
|
visibility.value = value['visibility'];
|
||||||
|
isDraft.value = value['is_draft'];
|
||||||
|
if (value['visible_users'] != null) {
|
||||||
|
visibleUsers.value = List.from(
|
||||||
|
value['visible_users'],
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (value['invisible_users'] != null) {
|
||||||
|
invisibleUsers.value = List.from(
|
||||||
|
value['invisible_users'],
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (value['published_at'] != null) {
|
||||||
|
publishedAt.value = DateTime.parse(value['published_at']).toLocal();
|
||||||
|
}
|
||||||
|
if (value['published_until'] != null) {
|
||||||
|
publishedAt.value = DateTime.parse(value['published_until']).toLocal();
|
||||||
|
}
|
||||||
|
if (value['reply_to'] != null) {
|
||||||
|
replyTo.value = Post.fromJson(value['reply_to']);
|
||||||
|
}
|
||||||
|
if (value['repost_to'] != null) {
|
||||||
|
repostTo.value = Post.fromJson(value['repost_to']);
|
||||||
|
}
|
||||||
|
if (value['edit_to'] != null) {
|
||||||
|
editTo.value = Post.fromJson(value['edit_to']);
|
||||||
|
}
|
||||||
|
if (value['realm'] != null) {
|
||||||
|
realmZone.value = Realm.fromJson(value['realm']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isEmpty {
|
||||||
|
if (contentController.text.isEmpty) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isNotEmpty {
|
||||||
|
return [
|
||||||
|
aliasController.text.isNotEmpty,
|
||||||
|
titleController.text.isNotEmpty,
|
||||||
|
descriptionController.text.isNotEmpty,
|
||||||
|
contentController.text.isNotEmpty,
|
||||||
|
attachments.isNotEmpty,
|
||||||
|
tags.isNotEmpty,
|
||||||
|
thumbnail.value != null,
|
||||||
|
].any((x) => x);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_saveTimer?.cancel();
|
||||||
|
|
||||||
|
titleController.dispose();
|
||||||
|
descriptionController.dispose();
|
||||||
|
contentController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
171
lib/controllers/post_list_controller.dart
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:solian/models/pagination.dart';
|
||||||
|
import 'package:solian/models/post.dart';
|
||||||
|
import 'package:solian/providers/content/posts.dart';
|
||||||
|
|
||||||
|
class PostListController extends GetxController {
|
||||||
|
late final SharedPreferences _prefs;
|
||||||
|
|
||||||
|
String? author;
|
||||||
|
|
||||||
|
/// The polling source modifier.
|
||||||
|
/// - `0`: default recommendations
|
||||||
|
/// - `1`: friend mode
|
||||||
|
/// - `2`: shuffle mode
|
||||||
|
RxInt mode = 0.obs;
|
||||||
|
|
||||||
|
/// The paging controller for infinite loading.
|
||||||
|
/// Only available when mode is `0` or `1`.
|
||||||
|
PagingController<int, Post> pagingController =
|
||||||
|
PagingController(firstPageKey: 0);
|
||||||
|
|
||||||
|
PostListController({this.author}) {
|
||||||
|
_initPreferences();
|
||||||
|
_initPagingController();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initPreferences() {
|
||||||
|
SharedPreferences.getInstance().then((prefs) {
|
||||||
|
_prefs = prefs;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Initialize a compatibility layer to paging controller
|
||||||
|
void _initPagingController() {
|
||||||
|
pagingController.addPageRequestListener(_onPagingControllerRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _onPagingControllerRequest(int pageKey) async {
|
||||||
|
try {
|
||||||
|
final result = await loadMore();
|
||||||
|
|
||||||
|
if (result != null && hasMore.value) {
|
||||||
|
pagingController.appendPage(result, nextPageKey.value);
|
||||||
|
} else if (result != null) {
|
||||||
|
pagingController.appendLastPage(result);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
pagingController.error = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _resetPagingController() {
|
||||||
|
pagingController.removePageRequestListener(_onPagingControllerRequest);
|
||||||
|
pagingController.nextPageKey = nextPageKey.value;
|
||||||
|
pagingController.itemList?.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
RxBool isBusy = false.obs;
|
||||||
|
RxBool isPreparing = false.obs;
|
||||||
|
|
||||||
|
RxInt focusCursor = 0.obs;
|
||||||
|
|
||||||
|
Post get focusPost => postList[focusCursor.value];
|
||||||
|
|
||||||
|
RxInt postTotal = 0.obs;
|
||||||
|
RxList<Post> postList = RxList.empty(growable: true);
|
||||||
|
|
||||||
|
RxInt nextPageKey = 0.obs;
|
||||||
|
RxBool hasMore = true.obs;
|
||||||
|
|
||||||
|
Future<void> reloadAllOver() async {
|
||||||
|
isPreparing.value = true;
|
||||||
|
|
||||||
|
focusCursor.value = 0;
|
||||||
|
nextPageKey.value = 0;
|
||||||
|
postList.clear();
|
||||||
|
hasMore.value = true;
|
||||||
|
|
||||||
|
_resetPagingController();
|
||||||
|
final result = await loadMore();
|
||||||
|
if (result != null && hasMore.value) {
|
||||||
|
pagingController.appendPage(result, nextPageKey.value);
|
||||||
|
} else if (result != null) {
|
||||||
|
pagingController.appendLastPage(result);
|
||||||
|
}
|
||||||
|
_initPagingController();
|
||||||
|
|
||||||
|
isPreparing.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<Post>?> loadMore() async {
|
||||||
|
final result = await _loadPosts(nextPageKey.value);
|
||||||
|
|
||||||
|
if (result != null && result.length >= 10) {
|
||||||
|
postList.addAll(result);
|
||||||
|
nextPageKey.value += result.length;
|
||||||
|
hasMore.value = true;
|
||||||
|
} else if (result != null) {
|
||||||
|
postList.addAll(result);
|
||||||
|
nextPageKey.value += result.length;
|
||||||
|
hasMore.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final idx = <dynamic>{};
|
||||||
|
postList.retainWhere((x) => idx.add(x.id));
|
||||||
|
|
||||||
|
var lastId = postList.map((x) => x.id).reduce(max);
|
||||||
|
if (_prefs.containsKey('feed_last_read_at')) {
|
||||||
|
final storedId = _prefs.getInt('feed_last_read_at') ?? 0;
|
||||||
|
lastId = max(storedId, lastId);
|
||||||
|
}
|
||||||
|
_prefs.setInt('feed_last_read_at', lastId);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<Post>?> _loadPosts(int pageKey) async {
|
||||||
|
isBusy.value = true;
|
||||||
|
|
||||||
|
final PostProvider provider = Get.find();
|
||||||
|
|
||||||
|
Response resp;
|
||||||
|
try {
|
||||||
|
if (author != null) {
|
||||||
|
resp = await provider.listPost(
|
||||||
|
pageKey,
|
||||||
|
author: author,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
switch (mode.value) {
|
||||||
|
case 2:
|
||||||
|
resp = await provider.listRecommendations(
|
||||||
|
pageKey,
|
||||||
|
channel: 'shuffle',
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
resp = await provider.listRecommendations(
|
||||||
|
pageKey,
|
||||||
|
channel: 'friends',
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
resp = await provider.listRecommendations(pageKey);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
rethrow;
|
||||||
|
} finally {
|
||||||
|
isBusy.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final result = PaginationResult.fromJson(resp.body);
|
||||||
|
final out = result.data?.map((e) => Post.fromJson(e)).toList();
|
||||||
|
|
||||||
|
postTotal.value = result.count;
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
pagingController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
10
lib/exceptions/request.dart
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class RequestException implements Exception {
|
||||||
|
final Response data;
|
||||||
|
|
||||||
|
const RequestException(this.data);
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'Request failed ${data.statusCode}: ${data.bodyString}';
|
||||||
|
}
|
||||||
6
lib/exceptions/unauthorized.dart
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
class UnauthorizedException implements Exception {
|
||||||
|
const UnauthorizedException();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'Unauthorized';
|
||||||
|
}
|
||||||
@@ -1,20 +1,97 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:solian/exceptions/request.dart';
|
||||||
|
import 'package:solian/exceptions/unauthorized.dart';
|
||||||
|
|
||||||
extension SolianExtenions on BuildContext {
|
extension SolianExtenions on BuildContext {
|
||||||
void showSnackbar(String content) {
|
void showSnackbar(String content, {SnackBarAction? action}) {
|
||||||
ScaffoldMessenger.of(this).showSnackBar(SnackBar(
|
ScaffoldMessenger.of(this).showSnackBar(SnackBar(
|
||||||
content: Text(content),
|
content: Text(content),
|
||||||
|
action: action,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clearSnackbar() {
|
||||||
|
ScaffoldMessenger.of(this).clearSnackBars();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> showModalDialog(String title, desc) {
|
||||||
|
return showDialog<void>(
|
||||||
|
useRootNavigator: true,
|
||||||
|
context: this,
|
||||||
|
builder: (ctx) => AlertDialog(
|
||||||
|
title: Text(title),
|
||||||
|
content: Text(desc),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(ctx),
|
||||||
|
child: Text('okay'.tr),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> showInfoDialog(String title, body) {
|
||||||
|
return showDialog<void>(
|
||||||
|
useRootNavigator: true,
|
||||||
|
context: this,
|
||||||
|
builder: (ctx) => AlertDialog(
|
||||||
|
title: Text(title),
|
||||||
|
content: Text(body),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(ctx),
|
||||||
|
child: Text('okay'.tr),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> showErrorDialog(dynamic exception) {
|
Future<void> showErrorDialog(dynamic exception) {
|
||||||
|
Widget content = Text(exception.toString().capitalize!);
|
||||||
|
if (exception is UnauthorizedException) {
|
||||||
|
content = Text('errorHappenedUnauthorized'.tr);
|
||||||
|
}
|
||||||
|
if (exception is RequestException) {
|
||||||
|
String overall;
|
||||||
|
switch (exception.data.statusCode) {
|
||||||
|
case 400:
|
||||||
|
overall = 'errorHappenedRequestBad'.tr;
|
||||||
|
break;
|
||||||
|
case 401:
|
||||||
|
overall = 'errorHappenedUnauthorized'.tr;
|
||||||
|
break;
|
||||||
|
case 403:
|
||||||
|
overall = 'errorHappenedRequestForbidden'.tr;
|
||||||
|
break;
|
||||||
|
case 404:
|
||||||
|
overall = 'errorHappenedRequestNotFound'.tr;
|
||||||
|
break;
|
||||||
|
case null:
|
||||||
|
overall = 'errorHappenedRequestConnection'.tr;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
overall = 'errorHappenedRequestUnknown'.tr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exception.data.statusCode != null) {
|
||||||
|
content = Text(
|
||||||
|
'$overall\n\n(${exception.data.statusCode}) ${exception.data.bodyString}',
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
content = Text(overall);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return showDialog<void>(
|
return showDialog<void>(
|
||||||
useRootNavigator: true,
|
useRootNavigator: true,
|
||||||
context: this,
|
context: this,
|
||||||
builder: (ctx) => AlertDialog(
|
builder: (ctx) => AlertDialog(
|
||||||
title: Text('errorHappened'.tr),
|
title: Text('errorHappened'.tr),
|
||||||
content: Text(exception.toString().capitalize!),
|
content: content,
|
||||||
actions: [
|
actions: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => Navigator.pop(ctx),
|
onPressed: () => Navigator.pop(ctx),
|
||||||
|
|||||||
@@ -85,4 +85,5 @@ class DefaultFirebaseOptions {
|
|||||||
storageBucket: 'solian-0x001.appspot.com',
|
storageBucket: 'solian-0x001.appspot.com',
|
||||||
measurementId: 'G-EF9BZMKBC3',
|
measurementId: 'G-EF9BZMKBC3',
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
}
|
||||||
184
lib/main.dart
@@ -1,110 +1,136 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:firebase_core/firebase_core.dart';
|
import 'package:firebase_core/firebase_core.dart';
|
||||||
|
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_acrylic/flutter_acrylic.dart';
|
import 'package:flutter_acrylic/flutter_acrylic.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:solian/exts.dart';
|
import 'package:media_kit/media_kit.dart';
|
||||||
|
import 'package:protocol_handler/protocol_handler.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:solian/bootstrapper.dart';
|
||||||
import 'package:solian/firebase_options.dart';
|
import 'package:solian/firebase_options.dart';
|
||||||
import 'package:solian/platform.dart';
|
import 'package:solian/platform.dart';
|
||||||
import 'package:solian/providers/account.dart';
|
import 'package:solian/providers/attachment_uploader.dart';
|
||||||
|
import 'package:solian/providers/daily_sign.dart';
|
||||||
|
import 'package:solian/providers/link_expander.dart';
|
||||||
|
import 'package:solian/providers/stickers.dart';
|
||||||
|
import 'package:solian/providers/theme_switcher.dart';
|
||||||
|
import 'package:solian/providers/websocket.dart';
|
||||||
import 'package:solian/providers/auth.dart';
|
import 'package:solian/providers/auth.dart';
|
||||||
import 'package:solian/providers/chat.dart';
|
|
||||||
import 'package:solian/providers/content/attachment.dart';
|
import 'package:solian/providers/content/attachment.dart';
|
||||||
import 'package:solian/providers/content/call.dart';
|
import 'package:solian/providers/call.dart';
|
||||||
import 'package:solian/providers/content/channel.dart';
|
import 'package:solian/providers/content/channel.dart';
|
||||||
import 'package:solian/providers/content/post.dart';
|
import 'package:solian/providers/content/posts.dart';
|
||||||
import 'package:solian/providers/content/realm.dart';
|
import 'package:solian/providers/content/realm.dart';
|
||||||
import 'package:solian/providers/friend.dart';
|
import 'package:solian/providers/relation.dart';
|
||||||
import 'package:solian/providers/account_status.dart';
|
import 'package:solian/providers/account_status.dart';
|
||||||
import 'package:solian/router.dart';
|
import 'package:solian/router.dart';
|
||||||
|
import 'package:solian/shells/system_shell.dart';
|
||||||
import 'package:solian/theme.dart';
|
import 'package:solian/theme.dart';
|
||||||
import 'package:solian/translations.dart';
|
import 'package:solian/translations.dart';
|
||||||
|
import 'package:flutter_web_plugins/url_strategy.dart' show usePathUrlStrategy;
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
await SentryFlutter.init(
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
(options) {
|
MediaKit.ensureInitialized();
|
||||||
options.dsn =
|
|
||||||
'https://55438cdff9048aa2225df72fdc629c42@o4506965897117696.ingest.us.sentry.io/4507357676437504';
|
|
||||||
options.tracesSampleRate = 1.0;
|
|
||||||
options.profilesSampleRate = 1.0;
|
|
||||||
},
|
|
||||||
appRunner: () async {
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
|
||||||
|
|
||||||
await Firebase.initializeApp(
|
await Future.wait([
|
||||||
options: DefaultFirebaseOptions.currentPlatform,
|
_initializeFirebase(),
|
||||||
);
|
_initializePlatformComponents(),
|
||||||
|
]);
|
||||||
|
|
||||||
if (PlatformInfo.isDesktop) {
|
GoRouter.optionURLReflectsImperativeAPIs = true;
|
||||||
await Window.initialize();
|
|
||||||
await Window.setEffect(
|
|
||||||
effect: WindowEffect.transparent,
|
|
||||||
dark: true,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (PlatformInfo.isMacOS) {
|
usePathUrlStrategy();
|
||||||
await Window.hideTitle();
|
runApp(const SolianApp());
|
||||||
await Window.hideCloseButton();
|
|
||||||
await Window.hideMiniaturizeButton();
|
|
||||||
await Window.hideZoomButton();
|
|
||||||
await Window.makeTitlebarTransparent();
|
|
||||||
await Window.enableFullSizeContentView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
runApp(const SolianApp());
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _initializeFirebase() async {
|
||||||
|
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||||
|
FlutterError.onError = (errorDetails) {
|
||||||
|
FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
|
||||||
|
};
|
||||||
|
PlatformDispatcher.instance.onError = (error, stack) {
|
||||||
|
FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _initializePlatformComponents() async {
|
||||||
|
if (!PlatformInfo.isWeb) {
|
||||||
|
await protocolHandler.register('solink');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PlatformInfo.isDesktop) {
|
||||||
|
await Window.initialize();
|
||||||
|
|
||||||
|
if (PlatformInfo.isMacOS) {
|
||||||
|
await Future.wait([
|
||||||
|
Window.hideTitle(),
|
||||||
|
Window.makeTitlebarTransparent(),
|
||||||
|
Window.enableFullSizeContentView(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final themeSwitcher = ThemeSwitcher(
|
||||||
|
lightThemeData: SolianTheme.build(Brightness.light),
|
||||||
|
darkThemeData: SolianTheme.build(Brightness.dark),
|
||||||
|
);
|
||||||
|
|
||||||
class SolianApp extends StatelessWidget {
|
class SolianApp extends StatelessWidget {
|
||||||
const SolianApp({super.key});
|
const SolianApp({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return GetMaterialApp.router(
|
return ChangeNotifierProvider.value(
|
||||||
title: 'Solian',
|
value: themeSwitcher,
|
||||||
theme: SolianTheme.build(Brightness.light),
|
child: Builder(builder: (context) {
|
||||||
darkTheme: SolianTheme.build(Brightness.dark),
|
final theme = Provider.of<ThemeSwitcher>(context);
|
||||||
themeMode: ThemeMode.system,
|
|
||||||
routerDelegate: AppRouter.instance.routerDelegate,
|
|
||||||
routeInformationParser: AppRouter.instance.routeInformationParser,
|
|
||||||
routeInformationProvider: AppRouter.instance.routeInformationProvider,
|
|
||||||
translations: SolianMessages(),
|
|
||||||
locale: Get.deviceLocale,
|
|
||||||
fallbackLocale: const Locale('en', 'US'),
|
|
||||||
onInit: () {
|
|
||||||
Get.lazyPut(() => AuthProvider());
|
|
||||||
Get.lazyPut(() => FriendProvider());
|
|
||||||
Get.lazyPut(() => PostProvider());
|
|
||||||
Get.lazyPut(() => AttachmentProvider());
|
|
||||||
Get.lazyPut(() => ChatProvider());
|
|
||||||
Get.lazyPut(() => AccountProvider());
|
|
||||||
Get.lazyPut(() => StatusProvider());
|
|
||||||
Get.lazyPut(() => ChannelProvider());
|
|
||||||
Get.lazyPut(() => RealmProvider());
|
|
||||||
Get.lazyPut(() => ChatCallProvider());
|
|
||||||
|
|
||||||
final AuthProvider auth = Get.find();
|
return GetMaterialApp.router(
|
||||||
auth.isAuthorized.then((value) async {
|
title: 'Solian',
|
||||||
if (value) {
|
theme: theme.lightThemeData,
|
||||||
Get.find<AccountProvider>().connect();
|
darkTheme: theme.darkThemeData,
|
||||||
Get.find<ChatProvider>().connect();
|
themeMode: ThemeMode.system,
|
||||||
|
routerDelegate: AppRouter.instance.routerDelegate,
|
||||||
try {
|
routeInformationParser: AppRouter.instance.routeInformationParser,
|
||||||
Get.find<AccountProvider>().registerPushNotifications();
|
routeInformationProvider: AppRouter.instance.routeInformationProvider,
|
||||||
} catch (err) {
|
backButtonDispatcher: AppRouter.instance.backButtonDispatcher,
|
||||||
context.showSnackbar('pushNotifyRegisterFailed'
|
translations: SolianMessages(),
|
||||||
.trParams({'reason': err.toString()}));
|
locale: Get.deviceLocale,
|
||||||
}
|
fallbackLocale: const Locale('en', 'US'),
|
||||||
}
|
onInit: () => _initializeProviders(context),
|
||||||
});
|
builder: (context, child) {
|
||||||
},
|
return SystemShell(
|
||||||
builder: (context, child) {
|
child: ScaffoldMessenger(
|
||||||
return ScaffoldMessenger(
|
child: BootstrapperShell(
|
||||||
child: child ?? Container(),
|
child: child ?? const SizedBox(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
);
|
);
|
||||||
},
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _initializeProviders(BuildContext context) async {
|
||||||
|
Get.lazyPut(() => AuthProvider());
|
||||||
|
Get.lazyPut(() => RelationshipProvider());
|
||||||
|
Get.lazyPut(() => PostProvider());
|
||||||
|
Get.lazyPut(() => StickerProvider());
|
||||||
|
Get.lazyPut(() => AttachmentProvider());
|
||||||
|
Get.lazyPut(() => WebSocketProvider());
|
||||||
|
Get.lazyPut(() => StatusProvider());
|
||||||
|
Get.lazyPut(() => ChannelProvider());
|
||||||
|
Get.lazyPut(() => RealmProvider());
|
||||||
|
Get.lazyPut(() => ChatCallProvider());
|
||||||
|
Get.lazyPut(() => AttachmentUploaderController());
|
||||||
|
Get.lazyPut(() => LinkExpandProvider());
|
||||||
|
Get.lazyPut(() => DailySignProvider());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ class Account {
|
|||||||
DateTime createdAt;
|
DateTime createdAt;
|
||||||
DateTime updatedAt;
|
DateTime updatedAt;
|
||||||
DateTime? deletedAt;
|
DateTime? deletedAt;
|
||||||
|
DateTime? confirmedAt;
|
||||||
|
DateTime? suspendedAt;
|
||||||
String name;
|
String name;
|
||||||
String nick;
|
String nick;
|
||||||
dynamic avatar;
|
dynamic avatar;
|
||||||
@@ -17,6 +19,8 @@ class Account {
|
|||||||
required this.createdAt,
|
required this.createdAt,
|
||||||
required this.updatedAt,
|
required this.updatedAt,
|
||||||
required this.deletedAt,
|
required this.deletedAt,
|
||||||
|
required this.confirmedAt,
|
||||||
|
required this.suspendedAt,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.nick,
|
required this.nick,
|
||||||
required this.avatar,
|
required this.avatar,
|
||||||
@@ -31,7 +35,15 @@ class Account {
|
|||||||
id: json['id'],
|
id: json['id'],
|
||||||
createdAt: DateTime.parse(json['created_at']),
|
createdAt: DateTime.parse(json['created_at']),
|
||||||
updatedAt: DateTime.parse(json['updated_at']),
|
updatedAt: DateTime.parse(json['updated_at']),
|
||||||
deletedAt: json['deleted_at'],
|
deletedAt: json['deleted_at'] != null
|
||||||
|
? DateTime.parse(json['deleted_at'])
|
||||||
|
: null,
|
||||||
|
confirmedAt: json['confirmed_at'] != null
|
||||||
|
? DateTime.parse(json['confirmed_at'])
|
||||||
|
: null,
|
||||||
|
suspendedAt: json['suspended_at'] != null
|
||||||
|
? DateTime.parse(json['suspended_at'])
|
||||||
|
: null,
|
||||||
name: json['name'],
|
name: json['name'],
|
||||||
nick: json['nick'],
|
nick: json['nick'],
|
||||||
avatar: json['avatar'],
|
avatar: json['avatar'],
|
||||||
@@ -49,7 +61,9 @@ class Account {
|
|||||||
'id': id,
|
'id': id,
|
||||||
'created_at': createdAt.toIso8601String(),
|
'created_at': createdAt.toIso8601String(),
|
||||||
'updated_at': updatedAt.toIso8601String(),
|
'updated_at': updatedAt.toIso8601String(),
|
||||||
'deleted_at': deletedAt,
|
'deleted_at': deletedAt?.toIso8601String(),
|
||||||
|
'confirmed_at': confirmedAt?.toIso8601String(),
|
||||||
|
'suspended_at': suspendedAt?.toIso8601String(),
|
||||||
'name': name,
|
'name': name,
|
||||||
'nick': nick,
|
'nick': nick,
|
||||||
'avatar': avatar,
|
'avatar': avatar,
|
||||||
|
|||||||
@@ -1,77 +1,117 @@
|
|||||||
import 'package:solian/models/account.dart';
|
import 'package:solian/models/account.dart';
|
||||||
|
|
||||||
|
class AttachmentPlaceholder {
|
||||||
|
int chunkCount;
|
||||||
|
int chunkSize;
|
||||||
|
Attachment meta;
|
||||||
|
|
||||||
|
AttachmentPlaceholder({
|
||||||
|
required this.chunkCount,
|
||||||
|
required this.chunkSize,
|
||||||
|
required this.meta,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory AttachmentPlaceholder.fromJson(Map<String, dynamic> json) =>
|
||||||
|
AttachmentPlaceholder(
|
||||||
|
chunkCount: json['chunk_count'],
|
||||||
|
chunkSize: json['chunk_size'],
|
||||||
|
meta: Attachment.fromJson(json['meta']),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
'chunk_count': chunkCount,
|
||||||
|
'chunk_size': chunkSize,
|
||||||
|
'meta': meta.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
class Attachment {
|
class Attachment {
|
||||||
int id;
|
int id;
|
||||||
DateTime createdAt;
|
DateTime createdAt;
|
||||||
DateTime updatedAt;
|
DateTime updatedAt;
|
||||||
dynamic deletedAt;
|
DateTime? deletedAt;
|
||||||
|
String rid;
|
||||||
String uuid;
|
String uuid;
|
||||||
int size;
|
int size;
|
||||||
String name;
|
String name;
|
||||||
String alt;
|
String alt;
|
||||||
String usage;
|
|
||||||
String mimetype;
|
String mimetype;
|
||||||
String hash;
|
String hash;
|
||||||
String destination;
|
int destination;
|
||||||
|
bool isAnalyzed;
|
||||||
|
bool isUploaded;
|
||||||
Map<String, dynamic>? metadata;
|
Map<String, dynamic>? metadata;
|
||||||
|
Map<String, dynamic>? fileChunks;
|
||||||
bool isMature;
|
bool isMature;
|
||||||
Account account;
|
Account? account;
|
||||||
int accountId;
|
int? accountId;
|
||||||
|
|
||||||
Attachment({
|
Attachment({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.createdAt,
|
required this.createdAt,
|
||||||
required this.updatedAt,
|
required this.updatedAt,
|
||||||
required this.deletedAt,
|
required this.deletedAt,
|
||||||
|
required this.rid,
|
||||||
required this.uuid,
|
required this.uuid,
|
||||||
required this.size,
|
required this.size,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.alt,
|
required this.alt,
|
||||||
required this.usage,
|
|
||||||
required this.mimetype,
|
required this.mimetype,
|
||||||
required this.hash,
|
required this.hash,
|
||||||
required this.destination,
|
required this.destination,
|
||||||
|
required this.isAnalyzed,
|
||||||
|
required this.isUploaded,
|
||||||
required this.metadata,
|
required this.metadata,
|
||||||
|
required this.fileChunks,
|
||||||
required this.isMature,
|
required this.isMature,
|
||||||
required this.account,
|
required this.account,
|
||||||
required this.accountId,
|
required this.accountId,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory Attachment.fromJson(Map<String, dynamic> json) => Attachment(
|
factory Attachment.fromJson(Map<String, dynamic> json) => Attachment(
|
||||||
id: json['id'],
|
id: json['id'],
|
||||||
createdAt: DateTime.parse(json['created_at']),
|
createdAt: DateTime.parse(json['created_at']),
|
||||||
updatedAt: DateTime.parse(json['updated_at']),
|
updatedAt: DateTime.parse(json['updated_at']),
|
||||||
deletedAt: json['deleted_at'],
|
deletedAt: json['deleted_at'] != null
|
||||||
uuid: json['uuid'],
|
? DateTime.parse(json['deleted_at'])
|
||||||
size: json['size'],
|
: null,
|
||||||
name: json['name'],
|
rid: json['rid'],
|
||||||
alt: json['alt'],
|
uuid: json['uuid'],
|
||||||
usage: json['usage'],
|
size: json['size'],
|
||||||
mimetype: json['mimetype'],
|
name: json['name'],
|
||||||
hash: json['hash'],
|
alt: json['alt'],
|
||||||
destination: json['destination'],
|
mimetype: json['mimetype'],
|
||||||
metadata: json['metadata'],
|
hash: json['hash'],
|
||||||
isMature: json['is_mature'],
|
destination: json['destination'],
|
||||||
account: Account.fromJson(json['account']),
|
isAnalyzed: json['is_analyzed'],
|
||||||
accountId: json['account_id'],
|
isUploaded: json['is_uploaded'],
|
||||||
);
|
metadata: json['metadata'],
|
||||||
|
fileChunks: json['file_chunks'],
|
||||||
|
isMature: json['is_mature'],
|
||||||
|
account:
|
||||||
|
json['account'] != null ? Account.fromJson(json['account']) : null,
|
||||||
|
accountId: json['account_id'],
|
||||||
|
);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
'id': id,
|
'id': id,
|
||||||
'created_at': createdAt.toIso8601String(),
|
'created_at': createdAt.toIso8601String(),
|
||||||
'updated_at': updatedAt.toIso8601String(),
|
'updated_at': updatedAt.toIso8601String(),
|
||||||
'deleted_at': deletedAt,
|
'deleted_at': deletedAt?.toIso8601String(),
|
||||||
'uuid': uuid,
|
'rid': rid,
|
||||||
'size': size,
|
'uuid': uuid,
|
||||||
'name': name,
|
'size': size,
|
||||||
'alt': alt,
|
'name': name,
|
||||||
'usage': usage,
|
'alt': alt,
|
||||||
'mimetype': mimetype,
|
'mimetype': mimetype,
|
||||||
'hash': hash,
|
'hash': hash,
|
||||||
'destination': destination,
|
'destination': destination,
|
||||||
'metadata': metadata,
|
'is_analyzed': isAnalyzed,
|
||||||
'is_mature': isMature,
|
'is_uploaded': isUploaded,
|
||||||
'account': account.toJson(),
|
'metadata': metadata,
|
||||||
'account_id': accountId,
|
'file_chunks': fileChunks,
|
||||||
};
|
'is_mature': isMature,
|
||||||
}
|
'account': account?.toJson(),
|
||||||
|
'account_id': accountId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ class Call {
|
|||||||
String externalId;
|
String externalId;
|
||||||
int founderId;
|
int founderId;
|
||||||
int channelId;
|
int channelId;
|
||||||
|
List<dynamic> participants;
|
||||||
Channel channel;
|
Channel channel;
|
||||||
|
|
||||||
Call({
|
Call({
|
||||||
@@ -21,6 +22,7 @@ class Call {
|
|||||||
required this.externalId,
|
required this.externalId,
|
||||||
required this.founderId,
|
required this.founderId,
|
||||||
required this.channelId,
|
required this.channelId,
|
||||||
|
required this.participants,
|
||||||
required this.channel,
|
required this.channel,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -34,6 +36,7 @@ class Call {
|
|||||||
externalId: json['external_id'],
|
externalId: json['external_id'],
|
||||||
founderId: json['founder_id'],
|
founderId: json['founder_id'],
|
||||||
channelId: json['channel_id'],
|
channelId: json['channel_id'],
|
||||||
|
participants: json['participants'] ?? List.empty(),
|
||||||
channel: Channel.fromJson(json['channel']),
|
channel: Channel.fromJson(json['channel']),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -46,6 +49,7 @@ class Call {
|
|||||||
'external_id': externalId,
|
'external_id': externalId,
|
||||||
'founder_id': founderId,
|
'founder_id': founderId,
|
||||||
'channel_id': channelId,
|
'channel_id': channelId,
|
||||||
|
'participants': participants,
|
||||||
'channel': channel.toJson(),
|
'channel': channel.toJson(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -63,6 +67,7 @@ class ParticipantTrack {
|
|||||||
{required this.participant,
|
{required this.participant,
|
||||||
required this.videoTrack,
|
required this.videoTrack,
|
||||||
required this.isScreenShare});
|
required this.isScreenShare});
|
||||||
|
|
||||||
VideoTrack? videoTrack;
|
VideoTrack? videoTrack;
|
||||||
Participant participant;
|
Participant participant;
|
||||||
bool isScreenShare;
|
bool isScreenShare;
|
||||||
|
|||||||
48
lib/models/daily_sign.dart
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
import 'package:solian/models/account.dart';
|
||||||
|
|
||||||
|
part 'daily_sign.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class DailySignRecord {
|
||||||
|
int id;
|
||||||
|
DateTime createdAt;
|
||||||
|
DateTime updatedAt;
|
||||||
|
DateTime? deletedAt;
|
||||||
|
Account account;
|
||||||
|
int resultTier;
|
||||||
|
int resultExperience;
|
||||||
|
int accountId;
|
||||||
|
|
||||||
|
DailySignRecord({
|
||||||
|
required this.id,
|
||||||
|
required this.createdAt,
|
||||||
|
required this.updatedAt,
|
||||||
|
required this.deletedAt,
|
||||||
|
required this.resultTier,
|
||||||
|
required this.resultExperience,
|
||||||
|
required this.account,
|
||||||
|
required this.accountId,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory DailySignRecord.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$DailySignRecordFromJson(json);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => _$DailySignRecordToJson(this);
|
||||||
|
|
||||||
|
String get symbol => switch (resultTier) {
|
||||||
|
0 => '大\n凶',
|
||||||
|
1 => '凶',
|
||||||
|
2 => '中\n平',
|
||||||
|
3 => '吉',
|
||||||
|
_ => '大\n吉',
|
||||||
|
};
|
||||||
|
|
||||||
|
String get overviewSuggestion => switch (resultTier) {
|
||||||
|
0 => '诸事不宜',
|
||||||
|
1 => '有些不宜',
|
||||||
|
2 => '平平淡淡',
|
||||||
|
3 => '有些事宜',
|
||||||
|
_ => '诸事皆宜',
|
||||||
|
};
|
||||||
|
}
|
||||||
33
lib/models/daily_sign.g.dart
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'daily_sign.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
DailySignRecord _$DailySignRecordFromJson(Map<String, dynamic> json) =>
|
||||||
|
DailySignRecord(
|
||||||
|
id: (json['id'] as num).toInt(),
|
||||||
|
createdAt: DateTime.parse(json['created_at'] as String),
|
||||||
|
updatedAt: DateTime.parse(json['updated_at'] as String),
|
||||||
|
deletedAt: json['deleted_at'] == null
|
||||||
|
? null
|
||||||
|
: DateTime.parse(json['deleted_at'] as String),
|
||||||
|
resultTier: (json['result_tier'] as num).toInt(),
|
||||||
|
resultExperience: (json['result_experience'] as num).toInt(),
|
||||||
|
account: Account.fromJson(json['account'] as Map<String, dynamic>),
|
||||||
|
accountId: (json['account_id'] as num).toInt(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$DailySignRecordToJson(DailySignRecord instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'id': instance.id,
|
||||||
|
'created_at': instance.createdAt.toIso8601String(),
|
||||||
|
'updated_at': instance.updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': instance.deletedAt?.toIso8601String(),
|
||||||
|
'account': instance.account.toJson(),
|
||||||
|
'result_tier': instance.resultTier,
|
||||||
|
'result_experience': instance.resultExperience,
|
||||||
|
'account_id': instance.accountId,
|
||||||
|
};
|
||||||
@@ -63,7 +63,7 @@ class Event {
|
|||||||
class EventMessageBody {
|
class EventMessageBody {
|
||||||
String text;
|
String text;
|
||||||
String algorithm;
|
String algorithm;
|
||||||
List<int>? attachments;
|
List<String>? attachments;
|
||||||
int? quoteEvent;
|
int? quoteEvent;
|
||||||
int? relatedEvent;
|
int? relatedEvent;
|
||||||
List<int>? relatedUsers;
|
List<int>? relatedUsers;
|
||||||
@@ -79,10 +79,10 @@ class EventMessageBody {
|
|||||||
|
|
||||||
factory EventMessageBody.fromJson(Map<String, dynamic> json) =>
|
factory EventMessageBody.fromJson(Map<String, dynamic> json) =>
|
||||||
EventMessageBody(
|
EventMessageBody(
|
||||||
text: json['text'],
|
text: json['text'] ?? '',
|
||||||
algorithm: json['algorithm'],
|
algorithm: json['algorithm'] ?? 'plain',
|
||||||
attachments: json['attachments'] != null
|
attachments: json['attachments'] != null
|
||||||
? List<int>.from(json['attachments'].map((x) => x))
|
? List<String>.from(json['attachments']?.whereType<String>())
|
||||||
: null,
|
: null,
|
||||||
quoteEvent: json['quote_event'],
|
quoteEvent: json['quote_event'],
|
||||||
relatedEvent: json['related_event'],
|
relatedEvent: json['related_event'],
|
||||||
|
|||||||
83
lib/models/feed.dart
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
class Tag {
|
||||||
|
int id;
|
||||||
|
String alias;
|
||||||
|
String name;
|
||||||
|
String description;
|
||||||
|
DateTime createdAt;
|
||||||
|
DateTime updatedAt;
|
||||||
|
DateTime? deletedAt;
|
||||||
|
|
||||||
|
Tag({
|
||||||
|
required this.id,
|
||||||
|
required this.alias,
|
||||||
|
required this.name,
|
||||||
|
required this.description,
|
||||||
|
required this.createdAt,
|
||||||
|
required this.updatedAt,
|
||||||
|
required this.deletedAt,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Tag.fromJson(Map<String, dynamic> json) => Tag(
|
||||||
|
id: json['id'],
|
||||||
|
alias: json['alias'],
|
||||||
|
name: json['name'],
|
||||||
|
description: json['description'],
|
||||||
|
createdAt: DateTime.parse(json['created_at']),
|
||||||
|
updatedAt: DateTime.parse(json['updated_at']),
|
||||||
|
deletedAt: json['deleted_at'] != null
|
||||||
|
? DateTime.parse(json['deleted_at'])
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
'id': id,
|
||||||
|
'alias': alias,
|
||||||
|
'description': description,
|
||||||
|
'name': name,
|
||||||
|
'created_at': createdAt.toIso8601String(),
|
||||||
|
'updated_at': updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': deletedAt?.toIso8601String(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Category {
|
||||||
|
int id;
|
||||||
|
String alias;
|
||||||
|
String name;
|
||||||
|
String description;
|
||||||
|
DateTime createdAt;
|
||||||
|
DateTime updatedAt;
|
||||||
|
DateTime? deletedAt;
|
||||||
|
|
||||||
|
Category({
|
||||||
|
required this.id,
|
||||||
|
required this.alias,
|
||||||
|
required this.name,
|
||||||
|
required this.description,
|
||||||
|
required this.createdAt,
|
||||||
|
required this.updatedAt,
|
||||||
|
required this.deletedAt,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Category.fromJson(Map<String, dynamic> json) => Category(
|
||||||
|
id: json['id'],
|
||||||
|
alias: json['alias'],
|
||||||
|
name: json['name'],
|
||||||
|
description: json['description'],
|
||||||
|
createdAt: DateTime.parse(json['created_at']),
|
||||||
|
updatedAt: DateTime.parse(json['updated_at']),
|
||||||
|
deletedAt: json['deleted_at'] != null
|
||||||
|
? DateTime.parse(json['deleted_at'])
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
'id': id,
|
||||||
|
'alias': alias,
|
||||||
|
'description': description,
|
||||||
|
'name': name,
|
||||||
|
'created_at': createdAt.toIso8601String(),
|
||||||
|
'updated_at': updatedAt.toIso8601String(),
|
||||||
|
'deleted_at': deletedAt?.toIso8601String(),
|
||||||
|
};
|
||||||
|
}
|
||||||