diff --git a/.githooks/pre-commit b/.githooks/pre-commit
index 6013a1b..93fb26c 100755
--- a/.githooks/pre-commit
+++ b/.githooks/pre-commit
@@ -3,6 +3,9 @@
printf "\e[33;1m%s\e[0m\n" 'Running the Flutter formatter'
flutter format .
printf "\e[33;1m%s\e[0m\n" 'Finished running the Flutter formatter'
+printf "\e[33;1m%s\e[0m\n" 'Running the import_sorter'
+flutter pub run import_sorter:main
+printf "\e[33;1m%s\e[0m\n" 'Finished running the import_sorter'
branch="$(git rev-parse --abbrev-ref HEAD)"
diff --git a/.githooks/pre-push b/.githooks/pre-push
index a6645ac..82d2f01 100755
--- a/.githooks/pre-push
+++ b/.githooks/pre-push
@@ -10,4 +10,9 @@ if [ $? -ne 0 ]; then
printf "\e[31;1m%s\e[0m\n" 'Flutter analyzer error'
exit 1
fi
+flutter test
+if [ $? -ne 0 ]; then
+ printf "\e[31;1m%s\e[0m\n" 'Flutter test error'
+ exit 1
+fi
printf "\e[33;1m%s\e[0m\n" 'Finished running the Flutter analyzer'
diff --git a/.github/workflows/check_issues.yaml b/.github/workflows/check_issues.yaml
index bfb7ee5..c179913 100644
--- a/.github/workflows/check_issues.yaml
+++ b/.github/workflows/check_issues.yaml
@@ -7,7 +7,7 @@ on:
jobs:
test:
- name: Analyze
+ name: Analyze & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
@@ -16,6 +16,7 @@ jobs:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
- flutter-version: "3.3.2"
+ flutter-version: "3.3.4"
- run: flutter pub get
- run: flutter analyze
+ - run: flutter test
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index 8dc2d7f..14a4481 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -16,7 +16,7 @@ jobs:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
- flutter-version: "3.3.2"
+ flutter-version: "3.3.3"
- run: flutter pub get
- run: flutter analyze
@@ -31,7 +31,7 @@ jobs:
java-version: "12.x"
- uses: subosito/flutter-action@v1
with:
- flutter-version: "3.3.2"
+ flutter-version: "3.3.3"
- run: flutter pub get
- run: flutter build apk --target-platform android-arm,android-arm64 --dart-define="lambiengcode=PRODUCTION" --release -v
- name: Create a Release APK
diff --git a/.vscode/settings.json b/.vscode/settings.json
index abb3215..3dcda23 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,4 @@
{
- "dart.flutterSdkPath": "/Users/lambiengcode/Documents/askany_mobile/F:\\flutter_windows_2.8.1-stable\\flutter"
+ "dart.flutterSdkPath": "/Users/lambiengcode/Documents/askany_mobile/F:\\flutter_windows_2.8.1-stable\\flutter",
+ "java.configuration.updateBuildConfiguration": "interactive"
}
\ No newline at end of file
diff --git a/README.md b/README.md
index ac3fcf4..ae5eaf5 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,44 @@
-# streamskit_mobile
+# StreamOS - UI Live Streaming App using Flutter 🛠️ 🎮
-A new Flutter project.
+
+
+StreamOS UI is a Flutter application with a sleek and intuitive user interface. The app features a robust login system, which allows users to sign in using their Google or Apple accounts via Firebase.
+
+The app has been built using Test-Driven Development (TDD) approach, ensuring that the login functionality is thoroughly tested through unit tests.
+
+## Screenshots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Features
+
+- Intuitive user interface
+- Login with Google/Apple using Firebase
## Getting Started
-This project is a starting point for a Flutter application.
+To get started with StreamOS UI, follow the instructions below.
+
+### Prerequisites
+- Flutter
+- Firebase account
-A few resources to get you started if this is your first Flutter project:
+### Installation
+1. Clone the repository: `git clone https://github.com/lambiengcode/flutter-live-stream-ui.git`
+2. Install dependencies: `flutter pub get`
+3. Run the app: `flutter run`
-- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
-- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+## Conclusion
-For help getting started with Flutter development, view the
-[online documentation](https://docs.flutter.dev/), which offers tutorials,
-samples, guidance on mobile development, and a full API reference.
+StreamOS UI is a sleek and intuitive Flutter application with a robust login system. The app's login functionality has been implemented using Firebase, ensuring a secure and seamless user experience.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..034e848
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,21 @@
+# Security Policy
+
+## Supported Versions
+
+Use this section to tell people about which versions of your project are
+currently being supported with security updates.
+
+| Version | Supported |
+| ------- | ------------------ |
+| 5.1.x | :white_check_mark: |
+| 5.0.x | :x: |
+| 4.0.x | :white_check_mark: |
+| < 4.0 | :x: |
+
+## Reporting a Vulnerability
+
+Use this section to tell people how to report a vulnerability.
+
+Tell them where to go, how often they can expect to get an update on a
+reported vulnerability, what to expect if the vulnerability is accepted or
+declined, etc.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 1411db2..61b6c4d 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -7,7 +7,7 @@
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
-# include: package:flutter_lints/flutter.yaml
+include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
diff --git a/android/app/build.gradle b/android/app/build.gradle
index fb3f944..0870c73 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion flutter.compileSdkVersion
+ compileSdkVersion 33
ndkVersion flutter.ndkVersion
compileOptions {
@@ -47,8 +47,8 @@ android {
applicationId "com.streams.kit"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
- minSdkVersion flutter.minSdkVersion
- targetSdkVersion flutter.targetSdkVersion
+ minSdkVersion 24
+ targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 1032cef..624074c 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,7 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
CFBundleVersion
1.0
MinimumOSVersion
- 11.0
+ 12.0
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee..ec97fc6 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 592ceee..c4855bf 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Podfile b/ios/Podfile
new file mode 100644
index 0000000..f6d3c81
--- /dev/null
+++ b/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+platform :ios, '13.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ target.build_configurations.each do |config|
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
+ end
+ end
+end
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000..bb595c8
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,266 @@
+PODS:
+ - AppAuth (1.7.5):
+ - AppAuth/Core (= 1.7.5)
+ - AppAuth/ExternalUserAgent (= 1.7.5)
+ - AppAuth/Core (1.7.5)
+ - AppAuth/ExternalUserAgent (1.7.5):
+ - AppAuth/Core
+ - FBAEMKit (14.1.0):
+ - FBSDKCoreKit_Basics (= 14.1.0)
+ - FBSDKCoreKit (14.1.0):
+ - FBAEMKit (= 14.1.0)
+ - FBSDKCoreKit_Basics (= 14.1.0)
+ - FBSDKCoreKit_Basics (14.1.0)
+ - FBSDKLoginKit (14.1.0):
+ - FBSDKCoreKit (= 14.1.0)
+ - Firebase/Auth (10.25.0):
+ - Firebase/CoreOnly
+ - FirebaseAuth (~> 10.25.0)
+ - Firebase/CoreOnly (10.25.0):
+ - FirebaseCore (= 10.25.0)
+ - Firebase/Crashlytics (10.25.0):
+ - Firebase/CoreOnly
+ - FirebaseCrashlytics (~> 10.25.0)
+ - Firebase/Messaging (10.25.0):
+ - Firebase/CoreOnly
+ - FirebaseMessaging (~> 10.25.0)
+ - firebase_auth (4.19.5):
+ - Firebase/Auth (= 10.25.0)
+ - firebase_core
+ - Flutter
+ - firebase_core (2.31.0):
+ - Firebase/CoreOnly (= 10.25.0)
+ - Flutter
+ - firebase_crashlytics (3.5.5):
+ - Firebase/Crashlytics (= 10.25.0)
+ - firebase_core
+ - Flutter
+ - firebase_messaging (14.9.2):
+ - Firebase/Messaging (= 10.25.0)
+ - firebase_core
+ - Flutter
+ - FirebaseAppCheckInterop (10.25.0)
+ - FirebaseAuth (10.25.0):
+ - FirebaseAppCheckInterop (~> 10.17)
+ - FirebaseCore (~> 10.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.8)
+ - GoogleUtilities/Environment (~> 7.8)
+ - GTMSessionFetcher/Core (< 4.0, >= 2.1)
+ - RecaptchaInterop (~> 100.0)
+ - FirebaseCore (10.25.0):
+ - FirebaseCoreInternal (~> 10.0)
+ - GoogleUtilities/Environment (~> 7.12)
+ - GoogleUtilities/Logger (~> 7.12)
+ - FirebaseCoreExtension (10.25.0):
+ - FirebaseCore (~> 10.0)
+ - FirebaseCoreInternal (10.25.0):
+ - "GoogleUtilities/NSData+zlib (~> 7.8)"
+ - FirebaseCrashlytics (10.25.0):
+ - FirebaseCore (~> 10.5)
+ - FirebaseInstallations (~> 10.0)
+ - FirebaseRemoteConfigInterop (~> 10.23)
+ - FirebaseSessions (~> 10.5)
+ - GoogleDataTransport (~> 9.2)
+ - GoogleUtilities/Environment (~> 7.8)
+ - nanopb (< 2.30911.0, >= 2.30908.0)
+ - PromisesObjC (~> 2.1)
+ - FirebaseInstallations (10.25.0):
+ - FirebaseCore (~> 10.0)
+ - GoogleUtilities/Environment (~> 7.8)
+ - GoogleUtilities/UserDefaults (~> 7.8)
+ - PromisesObjC (~> 2.1)
+ - FirebaseMessaging (10.25.0):
+ - FirebaseCore (~> 10.0)
+ - FirebaseInstallations (~> 10.0)
+ - GoogleDataTransport (~> 9.3)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.8)
+ - GoogleUtilities/Environment (~> 7.8)
+ - GoogleUtilities/Reachability (~> 7.8)
+ - GoogleUtilities/UserDefaults (~> 7.8)
+ - nanopb (< 2.30911.0, >= 2.30908.0)
+ - FirebaseRemoteConfigInterop (10.25.0)
+ - FirebaseSessions (10.25.0):
+ - FirebaseCore (~> 10.5)
+ - FirebaseCoreExtension (~> 10.0)
+ - FirebaseInstallations (~> 10.0)
+ - GoogleDataTransport (~> 9.2)
+ - GoogleUtilities/Environment (~> 7.13)
+ - GoogleUtilities/UserDefaults (~> 7.13)
+ - nanopb (< 2.30911.0, >= 2.30908.0)
+ - PromisesSwift (~> 2.1)
+ - Flutter (1.0.0)
+ - flutter_facebook_auth (4.4.1):
+ - FBSDKLoginKit (= 14.1.0)
+ - Flutter
+ - google_sign_in_ios (0.0.1):
+ - Flutter
+ - GoogleSignIn (~> 6.2)
+ - GoogleDataTransport (9.4.1):
+ - GoogleUtilities/Environment (~> 7.7)
+ - nanopb (< 2.30911.0, >= 2.30908.0)
+ - PromisesObjC (< 3.0, >= 1.2)
+ - GoogleSignIn (6.2.4):
+ - AppAuth (~> 1.5)
+ - GTMAppAuth (~> 1.3)
+ - GTMSessionFetcher/Core (< 3.0, >= 1.1)
+ - GoogleUtilities/AppDelegateSwizzler (7.13.3):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Network
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/Environment (7.13.3):
+ - GoogleUtilities/Privacy
+ - PromisesObjC (< 3.0, >= 1.2)
+ - GoogleUtilities/Logger (7.13.3):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/Network (7.13.3):
+ - GoogleUtilities/Logger
+ - "GoogleUtilities/NSData+zlib"
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/Reachability
+ - "GoogleUtilities/NSData+zlib (7.13.3)":
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/Privacy (7.13.3)
+ - GoogleUtilities/Reachability (7.13.3):
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/UserDefaults (7.13.3):
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Privacy
+ - GTMAppAuth (1.3.1):
+ - AppAuth/Core (~> 1.6)
+ - GTMSessionFetcher/Core (< 3.0, >= 1.5)
+ - GTMSessionFetcher/Core (2.3.0)
+ - image_picker_ios (0.0.1):
+ - Flutter
+ - nanopb (2.30910.0):
+ - nanopb/decode (= 2.30910.0)
+ - nanopb/encode (= 2.30910.0)
+ - nanopb/decode (2.30910.0)
+ - nanopb/encode (2.30910.0)
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - PromisesObjC (2.4.0)
+ - PromisesSwift (2.4.0):
+ - PromisesObjC (= 2.4.0)
+ - RecaptchaInterop (100.0.0)
+ - sign_in_with_apple (0.0.1):
+ - Flutter
+ - sqflite (0.0.3):
+ - Flutter
+ - FlutterMacOS
+ - url_launcher_ios (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - firebase_auth (from `.symlinks/plugins/firebase_auth/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`)
+ - Flutter (from `Flutter`)
+ - flutter_facebook_auth (from `.symlinks/plugins/flutter_facebook_auth/ios`)
+ - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`)
+ - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
+ - sqflite (from `.symlinks/plugins/sqflite/darwin`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+
+SPEC REPOS:
+ trunk:
+ - AppAuth
+ - FBAEMKit
+ - FBSDKCoreKit
+ - FBSDKCoreKit_Basics
+ - FBSDKLoginKit
+ - Firebase
+ - FirebaseAppCheckInterop
+ - FirebaseAuth
+ - FirebaseCore
+ - FirebaseCoreExtension
+ - FirebaseCoreInternal
+ - FirebaseCrashlytics
+ - FirebaseInstallations
+ - FirebaseMessaging
+ - FirebaseRemoteConfigInterop
+ - FirebaseSessions
+ - GoogleDataTransport
+ - GoogleSignIn
+ - GoogleUtilities
+ - GTMAppAuth
+ - GTMSessionFetcher
+ - nanopb
+ - PromisesObjC
+ - PromisesSwift
+ - RecaptchaInterop
+
+EXTERNAL SOURCES:
+ firebase_auth:
+ :path: ".symlinks/plugins/firebase_auth/ios"
+ firebase_core:
+ :path: ".symlinks/plugins/firebase_core/ios"
+ firebase_crashlytics:
+ :path: ".symlinks/plugins/firebase_crashlytics/ios"
+ firebase_messaging:
+ :path: ".symlinks/plugins/firebase_messaging/ios"
+ Flutter:
+ :path: Flutter
+ flutter_facebook_auth:
+ :path: ".symlinks/plugins/flutter_facebook_auth/ios"
+ google_sign_in_ios:
+ :path: ".symlinks/plugins/google_sign_in_ios/ios"
+ image_picker_ios:
+ :path: ".symlinks/plugins/image_picker_ios/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ sign_in_with_apple:
+ :path: ".symlinks/plugins/sign_in_with_apple/ios"
+ sqflite:
+ :path: ".symlinks/plugins/sqflite/darwin"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+
+SPEC CHECKSUMS:
+ AppAuth: 501c04eda8a8d11f179dbe8637b7a91bb7e5d2fa
+ FBAEMKit: a899515e45476027f73aef377b5cffadcd56ca3a
+ FBSDKCoreKit: 24f8bc8d3b5b2a8c5c656a1329492a12e8efa792
+ FBSDKCoreKit_Basics: 6e578c9bdc7aa1365dbbbde633c9ebb536bcaa98
+ FBSDKLoginKit: 787de205d524c3a4b17d527916f1d066e4361660
+ Firebase: 0312a2352584f782ea56f66d91606891d4607f06
+ firebase_auth: 76ea642e91a9e914b3af751a416046ce1a965cf4
+ firebase_core: 0b39f4f424e02eecabb2356ddf331fa07b772af8
+ firebase_crashlytics: 5adb9a5ac7858811cef7a9447a011bb4dcb540c3
+ firebase_messaging: 8999827b6efc9c3ab4b1f9dc246deaa7f13dbf88
+ FirebaseAppCheckInterop: 5da5ce93e8797a215e3f677fb0654b74e736c8b8
+ FirebaseAuth: c0f93dcc570c9da2bffb576969d793e95c344fbb
+ FirebaseCore: 7ec4d0484817f12c3373955bc87762d96842d483
+ FirebaseCoreExtension: 8a47811d0b155501559ef05d089518152a0a1677
+ FirebaseCoreInternal: 910a81992c33715fec9263ca7381d59ab3a750b7
+ FirebaseCrashlytics: 4b96efb0ce73b38b2a85e8b8bd1bd8f63f09d015
+ FirebaseInstallations: 91950fe859846fff0fbd296180909dd273103b09
+ FirebaseMessaging: 88950ba9485052891ebe26f6c43a52bb62248952
+ FirebaseRemoteConfigInterop: b25018791b204c0d78a90e394d6c62d9b1f22da8
+ FirebaseSessions: c0939656253a1fa0e94ecc266ccf770cc8b33732
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ flutter_facebook_auth: 361ac7a57263ebf327f26089507ead0d66558ee8
+ google_sign_in_ios: 4f85eb9f937450765c8573bb85fd8cd6a5af675c
+ GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
+ GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
+ GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
+ GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
+ GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
+ image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425
+ nanopb: 438bc412db1928dac798aa6fd75726007be04262
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
+ PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
+ RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
+ sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
+ sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
+
+PODFILE CHECKSUM: bd295fc198b245bb51189c8140d55e735c8dd822
+
+COCOAPODS: 1.15.2
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 82919bf..9cf0c37 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,13 +3,15 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 50;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 40684CBA5EA54C8A7F2CC14E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5C642D84F9B2C90C6C478BF /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 8D0A88E028FDA96E0070E94C /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 8D0A88DF28FDA96E0070E94C /* GoogleService-Info.plist */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@@ -32,9 +34,13 @@
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 610335755246C6F60FE9FD14 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 8AF245831FD34D37CF37DDB9 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 8D0A88DF28FDA96E0070E94C /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
+ 8D0A88E128FDAA0F0070E94C /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -42,6 +48,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ A5C642D84F9B2C90C6C478BF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ B02922E201C5089328B22D94 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -49,12 +57,23 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 40684CBA5EA54C8A7F2CC14E /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ 21574D27796729176B267C49 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 8AF245831FD34D37CF37DDB9 /* Pods-Runner.debug.xcconfig */,
+ B02922E201C5089328B22D94 /* Pods-Runner.release.xcconfig */,
+ 610335755246C6F60FE9FD14 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -72,6 +91,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
+ 21574D27796729176B267C49 /* Pods */,
+ DEB8ACB4F7A29354A9F868CC /* Frameworks */,
);
sourceTree = "";
};
@@ -86,10 +107,12 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
+ 8D0A88E128FDAA0F0070E94C /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
+ 8D0A88DF28FDA96E0070E94C /* GoogleService-Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
@@ -98,6 +121,14 @@
path = Runner;
sourceTree = "";
};
+ DEB8ACB4F7A29354A9F868CC /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ A5C642D84F9B2C90C6C478BF /* Pods_Runner.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -105,12 +136,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
+ 3216120C9048560070B84E61 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ CC8680EB32E496F890A253D7 /* [CP] Embed Pods Frameworks */,
+ 1F65992E5291859F00F78227 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -127,7 +161,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1300;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -161,6 +195,7 @@
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 8D0A88E028FDA96E0070E94C /* GoogleService-Info.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
@@ -169,12 +204,53 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 1F65992E5291859F00F78227 /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 3216120C9048560070B84E61 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
@@ -185,6 +261,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@@ -197,6 +274,23 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
+ CC8680EB32E496F890A253D7 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -272,7 +366,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -287,12 +381,16 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3SHAJNAYM4;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Streams Kit";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.video";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -300,6 +398,7 @@
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.streams.kit;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -353,7 +452,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -402,7 +501,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -419,12 +518,16 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3SHAJNAYM4;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Streams Kit";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.video";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -432,6 +535,7 @@
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.streams.kit;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -445,12 +549,16 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3SHAJNAYM4;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Streams Kit";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.video";
+ IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -458,6 +566,7 @@
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.streams.kit;
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index f3d88ac..498aa0d 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 70693e4..e9b4ca7 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -1,5 +1,6 @@
import UIKit
import Flutter
+import Firebase
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
@@ -7,7 +8,10 @@ import Flutter
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
+ /// Configuration
+ FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
+ application.registerForRemoteNotifications()
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png
new file mode 100644
index 0000000..c52923b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png
similarity index 60%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20.png
rename to ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png
index f8c9c56..0090472 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png
new file mode 100644
index 0000000..ab94901
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png
new file mode 100644
index 0000000..e0da407
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png
similarity index 51%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29.png
rename to ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png
index 7d1d7ae..1e072c4 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png
new file mode 100644
index 0000000..0743f87
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png
new file mode 100644
index 0000000..8899db3
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png
new file mode 100644
index 0000000..ab94901
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png
new file mode 100644
index 0000000..07caa6b
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png
new file mode 100644
index 0000000..53a9ab0
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png
new file mode 100644
index 0000000..53a9ab0
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png
new file mode 100644
index 0000000..2324c6f
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png
new file mode 100644
index 0000000..ebefe80
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png
new file mode 100644
index 0000000..979c111
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png
new file mode 100644
index 0000000..3f4ab91
Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
index 451038c..69c9e36 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,109 +1,109 @@
{
"images" : [
{
- "filename" : "STREAM KIT-20@2x.png",
+ "filename" : "AppIcon-20@2x.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
- "filename" : "STREAM KIT-20@3x.png",
+ "filename" : "AppIcon-20@3x.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
- "filename" : "STREAM KIT-29@2x.png",
+ "filename" : "AppIcon-29@2x.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
- "filename" : "STREAM KIT-29@3x.png",
+ "filename" : "AppIcon-29@3x.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
- "filename" : "STREAM KIT-40@2x.png",
+ "filename" : "AppIcon-40@2x.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
- "filename" : "STREAM KIT-40@3x.png",
+ "filename" : "AppIcon-40@3x.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
- "filename" : "STREAM KIT-60@2x.png",
+ "filename" : "AppIcon-60@2x.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
- "filename" : "STREAM KIT-60@3x.png",
+ "filename" : "AppIcon-60@3x.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
- "filename" : "STREAM KIT-20.png",
+ "filename" : "AppIcon-20.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
- "filename" : "STREAM KIT-20@2x.png",
+ "filename" : "AppIcon-20@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
- "filename" : "STREAM KIT-29.png",
+ "filename" : "AppIcon-29.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
- "filename" : "STREAM KIT-29@2x.png",
+ "filename" : "AppIcon-29@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
- "filename" : "STREAM KIT-40.png",
+ "filename" : "AppIcon-40.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
- "filename" : "STREAM KIT-40@2x.png",
+ "filename" : "AppIcon-40@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
- "filename" : "STREAM KIT-76.png",
+ "filename" : "AppIcon-76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
- "filename" : "STREAM KIT-76@2x.png",
+ "filename" : "AppIcon-76@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
- "filename" : "STREAM KIT-83.5@2x.png",
+ "filename" : "AppIcon-83.5@2x.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
- "filename" : "STREAM KIT-1024.png",
+ "filename" : "AppIcon-1024.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-1024.png
deleted file mode 100644
index 6183b3e..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-1024.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@2x.png
deleted file mode 100644
index d348989..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@3x.png
deleted file mode 100644
index 12392e1..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-20@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@2x.png
deleted file mode 100644
index f79966b..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@3x.png
deleted file mode 100644
index fad87d5..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-29@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40.png
deleted file mode 100644
index d348989..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@2x.png
deleted file mode 100644
index 1445dc4..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@3x.png
deleted file mode 100644
index ae0f456..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-40@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@2x.png
deleted file mode 100644
index ae0f456..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@3x.png
deleted file mode 100644
index 377b91f..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-60@3x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76.png
deleted file mode 100644
index e85976f..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76@2x.png
deleted file mode 100644
index 0ef8d73..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-76@2x.png and /dev/null differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-83.5@2x.png
deleted file mode 100644
index cb28cad..0000000
Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/STREAM KIT-83.5@2x.png and /dev/null differ
diff --git a/ios/Runner/GoogleService-Info.plist b/ios/Runner/GoogleService-Info.plist
new file mode 100644
index 0000000..feddb9d
--- /dev/null
+++ b/ios/Runner/GoogleService-Info.plist
@@ -0,0 +1,34 @@
+
+
+
+
+ CLIENT_ID
+ 38681732543-a1c15bbp5qra3vdf4c26f8h4qj4mp8hm.apps.googleusercontent.com
+ REVERSED_CLIENT_ID
+ com.googleusercontent.apps.38681732543-a1c15bbp5qra3vdf4c26f8h4qj4mp8hm
+ API_KEY
+ AIzaSyBvr4N6_c5AtQfWH44EU8QHDH-sPgGtr9A
+ GCM_SENDER_ID
+ 38681732543
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.streams.kit
+ PROJECT_ID
+ streamos-2c5cd
+ STORAGE_BUCKET
+ streamos-2c5cd.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:38681732543:ios:d0c2f5a9f52dd059a5ad0a
+
+
\ No newline at end of file
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 3865557..759156d 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -7,7 +7,7 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
- StreamKit
+ StreamOS
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
@@ -22,6 +22,21 @@
$(FLUTTER_BUILD_NAME)
CFBundleSignature
????
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLName
+ com.streams.kit
+ CFBundleURLSchemes
+
+
+ com.googleusercontent.apps.38681732543-a1c15bbp5qra3vdf4c26f8h4qj4mp8hm
+ https
+
+
+
CFBundleVersion
$(FLUTTER_BUILD_NUMBER)
LSRequiresIPhoneOS
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
new file mode 100644
index 0000000..0c67376
--- /dev/null
+++ b/ios/Runner/Runner.entitlements
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/ios/clean-pods.sh b/ios/clean-pods.sh
old mode 100644
new mode 100755
diff --git a/lib/core/app/application.dart b/lib/core/app/application.dart
new file mode 100644
index 0000000..b0e2ca1
--- /dev/null
+++ b/lib/core/app/application.dart
@@ -0,0 +1,38 @@
+// Flutter imports:
+import 'package:flutter/material.dart';
+
+// Project imports:
+import 'package:streamskit_mobile/core/app/config/base_local_data.dart';
+import 'package:streamskit_mobile/core/app/config/base_remote_data.dart';
+import 'package:streamskit_mobile/core/injection/injection_container.dart';
+import 'package:streamskit_mobile/core/util/path_helper.dart';
+
+class Application {
+ /// [Production - Dev]
+ static Future initialAppLication() async {
+ try {
+ // Init dependency injection
+ configureDependencies();
+
+ // Prepare path cache
+ await PathHelper.createDirStreamOS();
+
+ // Init Hive
+ await BaseLocalData.initialBox();
+
+ // Configure Dio [Cookie, Retry, Transformer]
+ await BaseRemoteData.configureDio();
+ } catch (error) {
+ debugPrint(error.toString());
+ }
+ }
+
+ ///Singleton factory
+ static final Application _instance = Application._internal();
+
+ factory Application() {
+ return _instance;
+ }
+
+ Application._internal();
+}
diff --git a/lib/features/auth/data/.gitkeep b/lib/core/app/colors/.gitkeep
similarity index 100%
rename from lib/features/auth/data/.gitkeep
rename to lib/core/app/colors/.gitkeep
diff --git a/lib/core/app/colors/app_color.dart b/lib/core/app/colors/app_color.dart
new file mode 100644
index 0000000..33b5a64
--- /dev/null
+++ b/lib/core/app/colors/app_color.dart
@@ -0,0 +1,135 @@
+// Flutter imports:
+import 'package:flutter/material.dart';
+
+var colorBlack = const Color(0xFF121212);
+var colorPrimaryBlack = const Color(0xFF121212);
+var colorDarkGrey = const Color(0xFF657786);
+var colorPrimary = const Color(0xFF1DA1F2);
+var colorTitle = const Color(0xFF2C3D50);
+var colorReds400 = Colors.red.shade400;
+var colorBorderAvatar = const Color(0xff3e455b);
+
+var colorBlack1 = const Color(0xFF191414);
+var colorPink = const Color(0xFFcd32d7);
+var colorPurple2 = const Color(0xFFa9ade6);
+var colorBlack2 = const Color(0xFF303234);
+var colorRed = const Color(0xFFf11a42);
+var colorBlue = const Color(0xFF1d51fe);
+var colorPurple = const Color(0xFF7d60e5);
+var colorHintText = const Color(0xFFa0a0a0);
+
+var colorHigh = Colors.redAccent;
+var colorMedium = Colors.amber.shade700;
+var colorLow = colorPrimary;
+var colorCompleted = Colors.green;
+var colorFailed = colorDarkGrey;
+var colorActive = const Color(0xFF00D72F);
+var colorGreenLight = const Color(0xFF009E60);
+var colorAttendance = const Color(0xFF0CCF4C);
+
+var colorBlueGrey = const Color(0xFF455A64);
+var colorBlueGreyIos = const Color(0xFF1C1F2E);
+
+var colorGreyWhite = const Color(0x4dE3E3E3);
+var colorGreyWhite2 = const Color(0xFFE3E3E3);
+var colorCaptionSearch = const Color(0xFFA3A3A3);
+
+Color colorDividerTimeline = const Color(0xFFC5D0CF);
+
+Color mC = Colors.grey.shade100;
+Color mCL = Colors.white;
+Color mCM = Colors.grey.shade200;
+Color mCU = Colors.grey.shade300;
+Color mCH = Colors.grey.shade400;
+Color mGB = Colors.grey.shade500;
+Color mGM = Colors.grey.shade700;
+Color mGE = Colors.grey.shade800;
+Color mGD = Colors.grey.shade900;
+Color mCD = Colors.black.withOpacity(0.075);
+Color mCC = Colors.green.withOpacity(0.65);
+Color fCD = Colors.grey.shade700;
+Color fCL = Colors.grey;
+
+class AppColors {
+ final Color primary;
+ final Color primaryLight;
+ final Color primaryDark;
+ final Color background;
+ final Color focusColor;
+ final Color unFocusColor;
+ final Color accent;
+ final Color disabled;
+ final Color error;
+ final Color divider;
+ final Color dividerBackgroundColor;
+ final Color header;
+ final Color button;
+ final Color contentText1;
+ final Color contentText2;
+ final Color subText1;
+ final Color subText2;
+
+ const AppColors({
+ required this.header,
+ required this.primary,
+ required this.primaryLight,
+ required this.primaryDark,
+ required this.background,
+ required this.focusColor,
+ required this.unFocusColor,
+ required this.accent,
+ required this.disabled,
+ required this.error,
+ required this.divider,
+ required this.dividerBackgroundColor,
+ required this.button,
+ required this.contentText1,
+ required this.contentText2,
+ required this.subText1,
+ required this.subText2,
+ });
+
+ factory AppColors.light() {
+ return AppColors(
+ header: colorBlack,
+ primary: colorPrimary,
+ primaryLight: mCL,
+ primaryDark: colorBlack,
+ background: Colors.white,
+ focusColor: Colors.green,
+ unFocusColor: Colors.grey,
+ accent: const Color(0xFF17c063),
+ disabled: Colors.black12,
+ error: const Color(0xFFFF7466),
+ divider: Colors.black26,
+ dividerBackgroundColor: Colors.black54,
+ button: const Color(0xFF657786),
+ contentText1: colorBlack,
+ contentText2: colorBlack,
+ subText1: mGD,
+ subText2: mGB,
+ );
+ }
+
+ factory AppColors.dark() {
+ return AppColors(
+ header: colorBlack,
+ primary: colorPrimary,
+ primaryLight: mCL,
+ primaryDark: colorBlack,
+ background: colorPrimaryBlack,
+ focusColor: Colors.green,
+ unFocusColor: Colors.grey,
+ accent: const Color(0xFF17c063),
+ disabled: Colors.black12,
+ error: const Color(0xFFFF7466),
+ divider: Colors.white24,
+ dividerBackgroundColor: Colors.black54,
+ button: const Color(0xFF657786),
+ contentText1: mCL,
+ contentText2: mC,
+ subText1: mCH,
+ subText2: mGB,
+ );
+ }
+}
diff --git a/lib/core/app/config/base_local_data.dart b/lib/core/app/config/base_local_data.dart
new file mode 100644
index 0000000..2b34dcb
--- /dev/null
+++ b/lib/core/app/config/base_local_data.dart
@@ -0,0 +1,21 @@
+// Package imports:
+import 'package:hive/hive.dart';
+
+// Project imports:
+import 'package:streamskit_mobile/core/app/constant/storage_keys.dart';
+import 'package:streamskit_mobile/core/util/path_helper.dart';
+
+class BaseLocalData {
+ static Future initialBox() async {
+ String path = await PathHelper.localStoreDirStreamOS;
+ Hive.init(path);
+ await Hive.openBox(StorageKeys.boxSystem);
+ await openBoxApp();
+ }
+
+ static Future openBoxApp() async {
+ await Hive.openBox(StorageKeys.boxAuth);
+ await Hive.openBox(StorageKeys.boxUser);
+ await Hive.openBox(StorageKeys.boxLiveStreams);
+ }
+}
diff --git a/lib/core/app/config/base_remote_data.dart b/lib/core/app/config/base_remote_data.dart
new file mode 100644
index 0000000..3ad7793
--- /dev/null
+++ b/lib/core/app/config/base_remote_data.dart
@@ -0,0 +1,295 @@
+// Dart imports:
+import 'dart:async';
+import 'dart:convert' as convert;
+
+// Flutter imports:
+import 'package:flutter/foundation.dart';
+
+// Package imports:
+import 'package:dio/dio.dart' as diox;
+
+// Project imports:
+import 'package:streamskit_mobile/core/app/constant/constants.dart';
+import 'package:streamskit_mobile/core/types/http_status_code.dart';
+import 'package:streamskit_mobile/core/types/service_method.dart';
+import 'package:streamskit_mobile/core/util/dio_transformer.dart';
+import 'package:streamskit_mobile/core/util/logger.dart';
+import 'package:streamskit_mobile/core/util/stop_watch_api.dart';
+
+class BaseRemoteData {
+ static diox.Dio dio = diox.Dio(diox.BaseOptions(
+ baseUrl: serviceBaseEndpoint,
+ connectTimeout: const Duration(milliseconds: connectTimeOut),
+ receiveTimeout: const Duration(milliseconds: receiveTimeOut),
+ sendTimeout: const Duration(milliseconds: receiveTimeOut),
+ )); // with default Options
+
+ Future> downloadFile(
+ String url, String path, Function onReceive) async {
+ var response = await dio.download(
+ url,
+ path,
+ options: getOptions(),
+ onReceiveProgress: (received, total) {
+ onReceive(received, total);
+ },
+ );
+ return response;
+ }
+
+ Future> postFormData(
+ String gateway,
+ diox.FormData formData,
+ ) async {
+ try {
+ var response = await dio.post(
+ gateway,
+ data: formData,
+ options: getOptions(),
+ onSendProgress: (send, total) {},
+ onReceiveProgress: (received, total) {},
+ );
+
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> putFormData(
+ String gateway,
+ diox.FormData formData,
+ ) async {
+ try {
+ var response = await dio.put(
+ gateway,
+ data: formData,
+ options: getOptions(),
+ onSendProgress: (send, total) {},
+ onReceiveProgress: (received, total) {},
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> postRoute(
+ String gateway, Map body,
+ {String? query}) async {
+ try {
+ Map paramsObject = {};
+ if (query != null) {
+ query.split('&').forEach((element) {
+ paramsObject[element.split('=')[0].toString()] =
+ element.split('=')[1].toString();
+ });
+ }
+ var response = kDebugMode
+ ? await StopWatch.stopWatchApi(
+ () => dio.post(
+ gateway,
+ data: convert.jsonEncode(body),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ ),
+ ServiceMethod.post.methodName,
+ gateway)
+ : await dio.post(
+ gateway,
+ data: convert.jsonEncode(body),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> putRoute(
+ String gateway,
+ Map body,
+ ) async {
+ try {
+ var response = kDebugMode
+ ? await StopWatch.stopWatchApi(
+ () => dio.put(
+ gateway,
+ data: convert.jsonEncode(body),
+ options: getOptions(),
+ ),
+ ServiceMethod.put.methodName,
+ gateway)
+ : await dio.put(
+ gateway,
+ data: convert.jsonEncode(body),
+ options: getOptions(),
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> patchRoute(
+ String gateway, {
+ String? query,
+ Map? body,
+ }) async {
+ try {
+ Map paramsObject = {};
+ if (query != null) {
+ query.split('&').forEach((element) {
+ paramsObject[element.split('=')[0].toString()] =
+ element.split('=')[1].toString();
+ });
+ }
+
+ var response = kDebugMode
+ ? await StopWatch.stopWatchApi(
+ () => dio.patch(
+ gateway,
+ data: body == null ? null : convert.jsonEncode(body),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ ),
+ ServiceMethod.patch.methodName,
+ gateway)
+ : await dio.patch(
+ gateway,
+ data: body == null ? null : convert.jsonEncode(body),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> getRoute(
+ String gateway, {
+ String? params,
+ String? query,
+ }) async {
+ try {
+ Map paramsObject = {};
+ if (query != null) {
+ query.split('&').forEach((element) {
+ paramsObject[element.split('=')[0].toString()] =
+ element.split('=')[1].toString();
+ });
+ }
+
+ var response = kDebugMode
+ ? await StopWatch.stopWatchApi(
+ () => dio.get(
+ gateway,
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ ),
+ ServiceMethod.get.methodName,
+ gateway)
+ : await dio.get(
+ gateway,
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ Future> deleteRoute(
+ String gateway, {
+ String? params,
+ String? query,
+ Map? body,
+ diox.FormData? formData,
+ }) async {
+ try {
+ Map paramsObject = {};
+ if (query != null) {
+ query.split('&').forEach((element) {
+ paramsObject[element.split('=')[0].toString()] =
+ element.split('=')[1].toString();
+ });
+ }
+
+ var response = kDebugMode
+ ? await StopWatch.stopWatchApi(
+ () => dio.delete(
+ gateway,
+ data: formData ??
+ (body == null ? null : convert.jsonEncode(body)),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ ),
+ ServiceMethod.delete.methodName,
+ gateway)
+ : await dio.delete(
+ gateway,
+ data:
+ formData ?? (body == null ? null : convert.jsonEncode(body)),
+ options: getOptions(),
+ queryParameters: query == null ? null : paramsObject,
+ );
+ return response;
+ } on diox.DioError catch (exception) {
+ return catchDioError(exception: exception, gateway: gateway);
+ }
+ }
+
+ diox.Response catchDioError({
+ required diox.DioError exception,
+ required String gateway,
+ }) {
+ return diox.Response(
+ requestOptions: diox.RequestOptions(path: gateway),
+ data: null,
+ statusCode: StatusCode.badGateway,
+ statusMessage: "CATCH EXCEPTION DIO",
+ );
+ }
+
+ diox.Options getOptions() {
+ return diox.Options(
+ validateStatus: (status) {
+ // if (status == StatusCode.unauthorized &&
+ // UserLocal().getAccessToken().isNotEmpty) {
+ // UserLocal().clearAccessToken();
+ // showDialogLoading();
+ // AppBloc.authBloc.add(LogOutEvent());
+ // }
+ return true;
+ },
+ headers: getHeaders(),
+ );
+ }
+
+ getHeaders() {
+ return {
+ 'Authorization': 'Bearer ',
+ 'Content-Type': 'application/json; charset=UTF-8',
+ 'Connection': 'keep-alive',
+ 'Accept': '*/*',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ };
+ }
+
+ static Future configureDio() async {
+ // Transform
+ dio.transformer = DioTransformer(); // replace dio default transformer
+ }
+
+ printEndpoint(String method, String endpoint) {
+ UtilLogger.log('${method.toUpperCase()}: $endpoint');
+ }
+
+ printResponse(diox.Response response) {
+ UtilLogger.log('StatusCode: ${response.statusCode}');
+ UtilLogger.log('Body: ${response.data.toString()}');
+ }
+}
diff --git a/lib/core/app/constant/constants.dart b/lib/core/app/constant/constants.dart
new file mode 100644
index 0000000..7281ff8
--- /dev/null
+++ b/lib/core/app/constant/constants.dart
@@ -0,0 +1,14 @@
+// Remote Data
+const String serviceBaseEndpoint = 'https://streamos.tk/';
+
+// Utils
+const double inchToDP = 160;
+
+// Delay times - miliseconds
+const int delay100ms = 100;
+const int delay200ms = 200;
+const int durationDefaultAnimation = 300;
+const int delay500ms = 500;
+const int delayASecond = 1000;
+const int connectTimeOut = 5000;
+const int receiveTimeOut = 5000;
diff --git a/test/features/auth/data/repositories/auth_repository_test.dart b/lib/core/app/constant/data_channel_events.dart
similarity index 100%
rename from test/features/auth/data/repositories/auth_repository_test.dart
rename to lib/core/app/constant/data_channel_events.dart
diff --git a/lib/core/app/constant/endpoints.dart b/lib/core/app/constant/endpoints.dart
new file mode 100644
index 0000000..25dda54
--- /dev/null
+++ b/lib/core/app/constant/endpoints.dart
@@ -0,0 +1,4 @@
+class Endpoints {
+ // Auth
+ static const String signIn = 'auth/signIn';
+}
diff --git a/test/features/auth/domain/usecases/login_with_email_test.dart b/lib/core/app/constant/socket_events.dart
similarity index 100%
rename from test/features/auth/domain/usecases/login_with_email_test.dart
rename to lib/core/app/constant/socket_events.dart
diff --git a/lib/core/app/constant/storage_keys.dart b/lib/core/app/constant/storage_keys.dart
new file mode 100644
index 0000000..9e376e1
--- /dev/null
+++ b/lib/core/app/constant/storage_keys.dart
@@ -0,0 +1,13 @@
+class StorageKeys {
+ // Box Variables
+ static const String boxSystem = 'boxSystem';
+ static const String boxAuth = 'boxAuth';
+ static const String boxUser = 'boxUser';
+ static const String boxLiveStreams = 'boxLiveStreams';
+
+ // Key in Box - Auth
+ static const String accessToken = 'accessToken';
+
+ // Key in Box - Live Streams
+ static const String liveStreamsKey = 'liveStreamsKey';
+}
diff --git a/lib/core/app/constants.dart b/lib/core/app/constants.dart
new file mode 100644
index 0000000..7c374c8
--- /dev/null
+++ b/lib/core/app/constants.dart
@@ -0,0 +1,7 @@
+const double inchToDP = 160;
+
+// Delay times - miliseconds
+const int delay200ms = 200;
+const int delay500ms = 500;
+const int delayASecond = 1000;
+const int delayHalfSecond = 500;
diff --git a/lib/features/auth/domain/.gitkeep b/lib/core/app/lang/.gitkeep
similarity index 100%
rename from lib/features/auth/domain/.gitkeep
rename to lib/core/app/lang/.gitkeep
diff --git a/lib/features/auth/presentation/.gitkeep b/lib/core/app/themes/.gitkeep
similarity index 100%
rename from lib/features/auth/presentation/.gitkeep
rename to lib/core/app/themes/.gitkeep
diff --git a/lib/core/app/themes/box_shadow.dart b/lib/core/app/themes/box_shadow.dart
new file mode 100644
index 0000000..657e06d
--- /dev/null
+++ b/lib/core/app/themes/box_shadow.dart
@@ -0,0 +1,57 @@
+// Flutter imports:
+import 'package:flutter/material.dart';
+
+// Project imports:
+import 'package:streamskit_mobile/core/app/colors/app_color.dart';
+
+class BoxShadowStatic {
+ static List? boxShadow(BuildContext context) {
+ if (Theme.of(context).brightness == Brightness.dark) {
+ return [
+ BoxShadow(
+ color: const Color(0xFF14171A).withOpacity(.65),
+ offset: const Offset(.75, .75),
+ blurRadius: .4,
+ ),
+ BoxShadow(
+ color: colorBlack.withOpacity(.25),
+ offset: const Offset(-.4, -.4),
+ blurRadius: .4,
+ ),
+ ];
+ } else {
+ return [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.08),
+ blurRadius: 4,
+ offset: const Offset(1, 1),
+ ),
+ ];
+ }
+ }
+
+ static List? boxShadowActive(BuildContext context) {
+ if (Theme.of(context).brightness == Brightness.dark) {
+ return [
+ BoxShadow(
+ color: Colors.black.withOpacity(.8),
+ offset: const Offset(1, 1),
+ blurRadius: 1,
+ ),
+ BoxShadow(
+ color: colorBlack.withOpacity(.35),
+ offset: const Offset(-1, -1),
+ blurRadius: 1,
+ ),
+ ];
+ } else {
+ return [
+ BoxShadow(
+ color: Colors.black.withOpacity(0.08),
+ blurRadius: 4,
+ offset: const Offset(1, 1),
+ ),
+ ];
+ }
+ }
+}
diff --git a/lib/core/app/themes/themes.dart b/lib/core/app/themes/themes.dart
new file mode 100644
index 0000000..ec0abe4
--- /dev/null
+++ b/lib/core/app/themes/themes.dart
@@ -0,0 +1,139 @@
+// Dart imports:
+import 'dart:io';
+
+// Flutter imports:
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+// Project imports:
+import 'package:streamskit_mobile/core/app/colors/app_color.dart';
+
+class AppTheme {
+ AppTheme({
+ required this.data,
+ });
+
+ factory AppTheme.light({bool isChild = false}) {
+ final appColors = AppColors.light();
+ final themeData = ThemeData(
+ useMaterial3: true,
+ pageTransitionsTheme: isChild
+ ? const PageTransitionsTheme(builders: {
+ TargetPlatform.iOS: ZoomPageTransitionsBuilder(),
+ TargetPlatform.android: ZoomPageTransitionsBuilder(),
+ })
+ : const PageTransitionsTheme(builders: {
+ TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
+ TargetPlatform.android: CupertinoPageTransitionsBuilder(),
+ }),
+ brightness: Brightness.light,
+ primaryColor: appColors.primary,
+ primaryColorLight: appColors.primaryLight,
+ primaryColorDark: appColors.primaryDark,
+ focusColor: appColors.focusColor,
+ disabledColor: appColors.unFocusColor,
+ scaffoldBackgroundColor: appColors.background,
+ snackBarTheme: SnackBarThemeData(
+ backgroundColor: appColors.error,
+ behavior: SnackBarBehavior.floating,
+ ),
+ bottomNavigationBarTheme: BottomNavigationBarThemeData(
+ backgroundColor: appColors.background,
+ selectedItemColor: colorPrimary,
+ ),
+ appBarTheme: AppBarTheme(
+ scrolledUnderElevation: 0,
+ surfaceTintColor: appColors.background,
+ backgroundColor: appColors.background,
+ systemOverlayStyle: SystemUiOverlayStyle(
+ statusBarColor: Colors.transparent,
+ statusBarBrightness: Brightness.light ==
+ (Platform.isAndroid ? Brightness.dark : Brightness.light)
+ ? Brightness.light
+ : Brightness.dark,
+ statusBarIconBrightness: Brightness.light ==
+ (Platform.isAndroid ? Brightness.dark : Brightness.light)
+ ? Brightness.light
+ : Brightness.dark,
+ ),
+ iconTheme: IconThemeData(
+ color: appColors.contentText1,
+ ),
+ ),
+ dividerColor: appColors.divider,
+ colorScheme: const ColorScheme.light().copyWith(
+ surface: appColors.dividerBackgroundColor,
+ ),
+ );
+ return AppTheme(
+ data: themeData,
+ );
+ }
+
+ factory AppTheme.dark({bool isChild = false}) {
+ final appColors = AppColors.dark();
+ final themeData = ThemeData(
+ useMaterial3: true,
+ pageTransitionsTheme: isChild
+ ? const PageTransitionsTheme(builders: {
+ TargetPlatform.iOS: ZoomPageTransitionsBuilder(),
+ TargetPlatform.android: ZoomPageTransitionsBuilder(),
+ })
+ : const PageTransitionsTheme(builders: {
+ TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
+ TargetPlatform.android: CupertinoPageTransitionsBuilder(),
+ }),
+ brightness: Brightness.dark,
+ primaryColor: appColors.primary,
+ primaryColorLight: appColors.primaryLight,
+ primaryColorDark: appColors.primaryDark,
+ focusColor: appColors.focusColor,
+ disabledColor: appColors.unFocusColor,
+ scaffoldBackgroundColor: appColors.background,
+ snackBarTheme: SnackBarThemeData(
+ backgroundColor: appColors.error,
+ behavior: SnackBarBehavior.floating,
+ ),
+ bottomNavigationBarTheme: BottomNavigationBarThemeData(
+ backgroundColor: appColors.background,
+ selectedItemColor: colorPrimary,
+ ),
+ appBarTheme: AppBarTheme(
+ scrolledUnderElevation: 0,
+ surfaceTintColor: appColors.background,
+ backgroundColor: appColors.background,
+ systemOverlayStyle: SystemUiOverlayStyle(
+ statusBarColor: Colors.transparent,
+ statusBarBrightness: Brightness.dark ==
+ (Platform.isAndroid ? Brightness.dark : Brightness.light)
+ ? Brightness.light
+ : Brightness.dark,
+ statusBarIconBrightness: Brightness.dark ==
+ (Platform.isAndroid ? Brightness.dark : Brightness.light)
+ ? Brightness.light
+ : Brightness.dark,
+ ),
+ iconTheme: IconThemeData(
+ color: appColors.contentText1,
+ ),
+ ),
+ textTheme: TextTheme(
+ displayLarge: TextStyle(color: appColors.header),
+ displayMedium: TextStyle(color: appColors.header),
+ bodyLarge: TextStyle(color: appColors.contentText1),
+ bodyMedium: TextStyle(color: appColors.contentText2),
+ titleMedium: TextStyle(color: appColors.subText1),
+ titleSmall: TextStyle(color: appColors.subText2),
+ ),
+ dividerColor: appColors.divider,
+ colorScheme: const ColorScheme.dark().copyWith(
+ surface: appColors.dividerBackgroundColor,
+ ),
+ );
+ return AppTheme(
+ data: themeData,
+ );
+ }
+
+ final ThemeData data;
+}
diff --git a/lib/core/error/failure.dart b/lib/core/error/failure.dart
new file mode 100644
index 0000000..22ea587
--- /dev/null
+++ b/lib/core/error/failure.dart
@@ -0,0 +1,14 @@
+// Package imports:
+import 'package:equatable/equatable.dart';
+
+abstract class Failure extends Equatable {
+ @override
+ List