├── .env.example
├── .gitignore
├── .java-version
├── .metadata
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── kindjeff
│ │ │ │ └── anycast
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── launcher_icon.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
├── icon
│ └── icon.png
├── images
│ ├── 200x200.png
│ ├── subscription_intro.png
│ └── subscription_intro_2.png
└── lottie
│ ├── loading.json
│ ├── loading_black.json
│ └── robot_loading.json
├── devtools_options.yaml
├── docs
└── img
│ ├── appstore.svg
│ ├── feat_ai_chat.png
│ ├── feat_ai_trans.png
│ ├── feat_country.png
│ ├── feat_rss.png
│ ├── logo.png
│ ├── main.png
│ └── playstore.svg
├── firebase.json
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
├── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-50x50@1x.png
│ │ │ ├── Icon-App-50x50@2x.png
│ │ │ ├── Icon-App-57x57@1x.png
│ │ │ ├── Icon-App-57x57@2x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-72x72@1x.png
│ │ │ ├── Icon-App-72x72@2x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── Runner-Bridging-Header.h
│ └── Runner.entitlements
├── RunnerTests
│ └── RunnerTests.swift
├── Share Extension
│ ├── Base.lproj
│ │ └── MainInterface.storyboard
│ ├── Info.plist
│ ├── Share Extension.entitlements
│ └── ShareViewController.swift
└── firebase_app_id_file.json
├── lib
├── api
│ ├── error_handler.dart
│ ├── podcasts.dart
│ ├── share.dart
│ ├── subtitles.dart
│ └── user.dart
├── main.dart
├── models
│ ├── episode.dart
│ ├── feed_episode.dart
│ ├── helper.dart
│ ├── history_episode.dart
│ ├── player.dart
│ ├── playlist.dart
│ ├── playlist_episode.dart
│ ├── settings.dart
│ ├── subscription.dart
│ ├── subtitle.dart
│ ├── table_creator.dart
│ └── translation.dart
├── pages
│ ├── channel.dart
│ ├── chat.dart
│ ├── discover.dart
│ ├── feeds.dart
│ ├── login.dart
│ ├── player.dart
│ ├── playlists.dart
│ ├── podcasts.dart
│ ├── settings.dart
│ ├── styles.dart
│ └── subscriptions.dart
├── states
│ ├── cache.dart
│ ├── cardlist.dart
│ ├── channel.dart
│ ├── chat.dart
│ ├── discover.dart
│ ├── feed_episode.dart
│ ├── history.dart
│ ├── import_indicator.dart
│ ├── player.dart
│ ├── playlist.dart
│ ├── playlist_episode.dart
│ ├── share.dart
│ ├── subscription.dart
│ ├── subtitle.dart
│ ├── tab.dart
│ ├── translation.dart
│ └── user.dart
├── styles.dart
├── utils
│ ├── audio_handler.dart
│ ├── formatters.dart
│ ├── http_client.dart
│ ├── keepalive.dart
│ └── rss_fetcher.dart
└── widgets
│ ├── animation.dart
│ ├── appbar.dart
│ ├── bottom_nav_bar.dart
│ ├── card.dart
│ ├── detail.dart
│ ├── expandable_text.dart
│ ├── handler.dart
│ ├── import_export.dart
│ ├── import_indicator.dart
│ ├── play_icon.dart
│ ├── privacy.dart
│ └── share.dart
├── pubspec.yaml
└── test
└── widget_test.dart
/.env.example:
--------------------------------------------------------------------------------
1 | PURCHASES_IOS_API_KEY=
2 | PURCHASES_ANDROID_API_KEY=
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # custom
2 | /android/app/google-services.json
3 | /ios/Runner/GoogleService-Info.plist
4 | /lib/firebase_options.dart
5 | *.env
6 |
7 | # Do not remove or rename entries in this file, only add new ones
8 | # See https://github.com/flutter/flutter/issues/128635 for more context.
9 |
10 | # Miscellaneous
11 | *.class
12 | *.lock
13 | *.log
14 | *.pyc
15 | *.swp
16 | .DS_Store
17 | .atom/
18 | .buildlog/
19 | .history
20 | .svn/
21 |
22 | # IntelliJ related
23 | *.iml
24 | *.ipr
25 | *.iws
26 | .idea/
27 |
28 | # Visual Studio Code related
29 | .classpath
30 | .project
31 | .settings/
32 | .vscode/*
33 |
34 | # Flutter repo-specific
35 | /bin/cache/
36 | /bin/internal/bootstrap.bat
37 | /bin/internal/bootstrap.sh
38 | /bin/mingit/
39 | /dev/benchmarks/mega_gallery/
40 | /dev/bots/.recipe_deps
41 | /dev/bots/android_tools/
42 | /dev/devicelab/ABresults*.json
43 | /dev/docs/doc/
44 | /dev/docs/api_docs.zip
45 | /dev/docs/flutter.docs.zip
46 | /dev/docs/lib/
47 | /dev/docs/pubspec.yaml
48 | /dev/integration_tests/**/xcuserdata
49 | /dev/integration_tests/**/Pods
50 | /packages/flutter/coverage/
51 | version
52 | analysis_benchmark.json
53 |
54 | # packages file containing multi-root paths
55 | .packages.generated
56 |
57 | # Flutter/Dart/Pub related
58 | **/doc/api/
59 | .dart_tool/
60 | .flutter-plugins
61 | .flutter-plugins-dependencies
62 | **/generated_plugin_registrant.dart
63 | .packages
64 | .pub-preload-cache/
65 | .pub-cache/
66 | .pub/
67 | build/
68 | flutter_*.png
69 | linked_*.ds
70 | unlinked.ds
71 | unlinked_spec.ds
72 |
73 | # Android related
74 | **/android/**/gradle-wrapper.jar
75 | .gradle/
76 | **/android/captures/
77 | **/android/gradlew
78 | **/android/gradlew.bat
79 | **/android/local.properties
80 | **/android/**/GeneratedPluginRegistrant.java
81 | **/android/key.properties
82 | *.jks
83 |
84 | # iOS/XCode related
85 | **/ios/**/*.mode1v3
86 | **/ios/**/*.mode2v3
87 | **/ios/**/*.moved-aside
88 | **/ios/**/*.pbxuser
89 | **/ios/**/*.perspectivev3
90 | **/ios/**/*sync/
91 | **/ios/**/.sconsign.dblite
92 | **/ios/**/.tags*
93 | **/ios/**/.vagrant/
94 | **/ios/**/DerivedData/
95 | **/ios/**/Icon?
96 | **/ios/**/Pods/
97 | **/ios/**/.symlinks/
98 | **/ios/**/profile
99 | **/ios/**/xcuserdata
100 | **/ios/.generated/
101 | **/ios/Flutter/.last_build_id
102 | **/ios/Flutter/App.framework
103 | **/ios/Flutter/Flutter.framework
104 | **/ios/Flutter/Flutter.podspec
105 | **/ios/Flutter/Generated.xcconfig
106 | **/ios/Flutter/ephemeral
107 | **/ios/Flutter/app.flx
108 | **/ios/Flutter/app.zip
109 | **/ios/Flutter/flutter_assets/
110 | **/ios/Flutter/flutter_export_environment.sh
111 | **/ios/ServiceDefinitions.json
112 | **/ios/Runner/GeneratedPluginRegistrant.*
113 |
114 | # macOS
115 | **/Flutter/ephemeral/
116 | **/Pods/
117 | **/macos/Flutter/GeneratedPluginRegistrant.swift
118 | **/macos/Flutter/ephemeral
119 | **/xcuserdata/
120 |
121 | # Windows
122 | **/windows/flutter/generated_plugin_registrant.cc
123 | **/windows/flutter/generated_plugin_registrant.h
124 | **/windows/flutter/generated_plugins.cmake
125 |
126 | # Linux
127 | **/linux/flutter/generated_plugin_registrant.cc
128 | **/linux/flutter/generated_plugin_registrant.h
129 | **/linux/flutter/generated_plugins.cmake
130 |
131 | # Coverage
132 | coverage/
133 |
134 | # Symbols
135 | app.*.symbols
136 |
137 | # Exceptions to above rules.
138 | !**/ios/**/default.mode1v3
139 | !**/ios/**/default.mode2v3
140 | !**/ios/**/default.pbxuser
141 | !**/ios/**/default.perspectivev3
142 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
143 | !/dev/ci/**/Gemfile.lock
144 | !.vscode/settings.json
145 |
--------------------------------------------------------------------------------
/.java-version:
--------------------------------------------------------------------------------
1 | 11.0
2 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: "17025dd88227cd9532c33fa78f5250d548d87e9a"
8 | channel: "stable"
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
17 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
18 | - platform: android
19 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
20 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
21 | - platform: ios
22 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
23 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
24 | - platform: linux
25 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
26 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
27 | - platform: macos
28 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
29 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
30 | - platform: web
31 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
32 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
33 | - platform: windows
34 | create_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
35 | base_revision: 17025dd88227cd9532c33fa78f5250d548d87e9a
36 |
37 | # User provided section
38 |
39 | # List of Local paths (relative to this file) that should be
40 | # ignored by the migrate tool.
41 | #
42 | # Files that are not part of the templates will be ignored by default.
43 | unmanaged_files:
44 | - 'lib/main.dart'
45 | - 'ios/Runner.xcodeproj/project.pbxproj'
46 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Anycast
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | Anycast
4 |
5 | An AI-powered Podcast App
6 |
7 |
8 |
9 | Cross-platform, Seamless RSS Integration, Global Content Discovery, and AI
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | ## Website
32 |
33 | [https://anycast.website](https://anycast.website)
34 |
35 | ## Features
36 |
39 |
40 |
41 |
42 |  |
43 |
44 | AI Transcription
45 |
46 |
47 | - Support 10+ languages
48 | - Bilingual Subtitle
49 | - Export to LRC
50 |
51 | |
52 |
53 |
54 |  |
55 |
56 | AI Chat
57 |
58 | Curious about this podcast? Ask it anything.
59 | |
60 |
61 |
62 |  |
63 |
64 | Good RSS Integration
65 |
66 |
67 | - Subscribe to podcasts from any iTunes compatible RSS feed.
68 | - Import or export your subscriptions with OPML.
69 |
70 | |
71 |
72 |
73 |  |
74 |
75 | Access podcasts from all over the world
76 |
77 |
78 | - Tens of countries available.
79 | - A variety of types of podcasts.
80 |
81 | |
82 |
83 |
84 |
85 | ## TODO
86 |
87 | - [ ] Create different playlists
88 | - [ ] Brand new UI design
89 | - [ ] Support time navigation in show notes
90 | - [ ] Support for custom ASR API and Chat API without mandatory login
91 | - [ ] Compiler conditions for the open-source version, without requiring Firebase / RevenueCat configurations
92 | - [ ] Carplay support
93 | - [ ] AI recommendations
94 | - [ ] Enhanced note-taking features
95 |
96 | ## Contributing
97 |
98 | Conditional compilation will be supported soon, allowing you to compile with minimal (or no) extra steps.
99 |
100 | Currently, when cloning and compiling the project, the following additional files are required:
101 |
102 | - `.env`
103 | - `android/app/google-services.json`
104 | - `android/key.properties`
105 | - `ios/Runner/GoogleService-Info.plist`
106 | - `lib/firebase_options.dart`
107 |
108 | ## License
109 |
110 | Anycast is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
111 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at https://dart.dev/lints.
17 | #
18 | # Instead of disabling a lint rule for the entire project in the
19 | # section below, it can also be suppressed for a single line of code
20 | # or a specific dart file by using the `// ignore: name_of_lint` and
21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
22 | # producing the lint.
23 | rules:
24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
26 |
27 | # Additional information about this file can be found at
28 | # https://dart.dev/guides/language/analysis-options
29 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id "com.android.application"
3 | // START: FlutterFire Configuration
4 | id 'com.google.gms.google-services'
5 | // END: FlutterFire Configuration
6 | id "kotlin-android"
7 | id "dev.flutter.flutter-gradle-plugin"
8 | }
9 |
10 | def localProperties = new Properties()
11 | def localPropertiesFile = rootProject.file('local.properties')
12 | if (localPropertiesFile.exists()) {
13 | localPropertiesFile.withReader('UTF-8') { reader ->
14 | localProperties.load(reader)
15 | }
16 | }
17 |
18 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
19 | if (flutterVersionCode == null) {
20 | flutterVersionCode = '1'
21 | }
22 |
23 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
24 | if (flutterVersionName == null) {
25 | flutterVersionName = '1.0'
26 | }
27 |
28 | def keystoreProperties = new Properties()
29 | def keystorePropertiesFile = rootProject.file('key.properties')
30 | if (keystorePropertiesFile.exists()) {
31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
32 | }
33 |
34 | android {
35 | namespace "com.kindjeff.anycast"
36 | compileSdkVersion flutter.compileSdkVersion
37 | // ndkVersion flutter.ndkVersion
38 | ndkVersion = "27.0.12077973"
39 |
40 | compileOptions {
41 | sourceCompatibility JavaVersion.VERSION_1_8
42 | targetCompatibility JavaVersion.VERSION_1_8
43 | }
44 |
45 | kotlinOptions {
46 | jvmTarget = '1.8'
47 | }
48 |
49 | sourceSets {
50 | main.java.srcDirs += 'src/main/kotlin'
51 | }
52 |
53 | defaultConfig {
54 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
55 | applicationId "com.kindjeff.anycast"
56 | // You can update the following values to match your application needs.
57 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
58 | minSdkVersion 23
59 | targetSdkVersion flutter.targetSdkVersion
60 | versionCode flutterVersionCode.toInteger()
61 | versionName flutterVersionName
62 | }
63 |
64 |
65 | signingConfigs {
66 | release {
67 | keyAlias keystoreProperties['keyAlias']
68 | keyPassword keystoreProperties['keyPassword']
69 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
70 | storePassword keystoreProperties['storePassword']
71 | }
72 | }
73 | buildTypes {
74 | release {
75 | // TODO: Add your own signing config for the release build.
76 | // Signing with the debug keys for now, so `flutter run --release` works.
77 | signingConfig signingConfigs.release
78 | }
79 | }
80 | }
81 |
82 | flutter {
83 | source '../..'
84 | }
85 |
86 | dependencies {}
87 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
13 |
21 |
25 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
49 |
50 |
51 |
52 |
53 |
55 |
56 |
57 |
58 |
59 |
61 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/kindjeff/anycast/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.kindjeff.anycast
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-hdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-mdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '2.1.0'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
10 | }
11 | }
12 |
13 | allprojects {
14 | repositories {
15 | google()
16 | mavenCentral()
17 | }
18 | }
19 |
20 | rootProject.buildDir = '../build'
21 | subprojects {
22 | project.buildDir = "${rootProject.buildDir}/${project.name}"
23 | }
24 | subprojects {
25 | project.evaluationDependsOn(':app')
26 | }
27 |
28 | tasks.register("clean", Delete) {
29 | delete rootProject.buildDir
30 | }
31 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx4G
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | android.defaults.buildfeatures.buildconfig=true
5 | android.nonTransitiveRClass=false
6 | android.nonFinalResIds=false
7 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip
6 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | def flutterSdkPath = {
3 | def properties = new Properties()
4 | file("local.properties").withInputStream { properties.load(it) }
5 | def flutterSdkPath = properties.getProperty("flutter.sdk")
6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7 | return flutterSdkPath
8 | }
9 | settings.ext.flutterSdkPath = flutterSdkPath()
10 |
11 | includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
12 |
13 | repositories {
14 | google()
15 | mavenCentral()
16 | gradlePluginPortal()
17 | }
18 |
19 | plugins {
20 | id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
21 | }
22 | }
23 |
24 | plugins {
25 | id "org.jetbrains.kotlin.android" version "2.1.0" apply false
26 | id "dev.flutter.flutter-plugin-loader" version "1.0.0"
27 | id "com.android.application" version '8.7.3' apply false
28 | // START: FlutterFire Configuration
29 | id "com.google.gms.google-services" version "4.3.15" apply false
30 | // END: FlutterFire Configuration
31 | }
32 |
33 | include ":app"
34 |
--------------------------------------------------------------------------------
/assets/icon/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/assets/icon/icon.png
--------------------------------------------------------------------------------
/assets/images/200x200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/assets/images/200x200.png
--------------------------------------------------------------------------------
/assets/images/subscription_intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/assets/images/subscription_intro.png
--------------------------------------------------------------------------------
/assets/images/subscription_intro_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/assets/images/subscription_intro_2.png
--------------------------------------------------------------------------------
/assets/lottie/loading.json:
--------------------------------------------------------------------------------
1 | {"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":25,"ip":25,"op":55,"w":800,"h":800,"nm":"Loading #13","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[60.688,0],[0,55.228],[-60.688,0],[0,0],[-60.688,0],[0,55.228],[60.688,0]],"o":[[0,0],[-60.688,0],[0,-55.229],[60.688,0],[0,0],[60.688,0],[0,-55.229],[-60.688,0]],"v":[[0,0],[-159.333,100],[-245,0],[-159.333,-100],[0,0],[159.333,100],[245,0],[159.333,-100]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":39,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[10]},{"t":30,"s":[25]}],"ix":1},"e":{"a":0,"k":50,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":30,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":125,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Line","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":25,"op":150,"st":25,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Line transparent","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[60.688,0],[0,55.228],[-60.688,0],[0,0],[-60.688,0],[0,55.228],[60.688,0]],"o":[[0,0],[-60.688,0],[0,-55.229],[60.688,0],[0,0],[60.688,0],[0,-55.229],[-60.688,0]],"v":[[0,0],[-159.333,100],[-245,0],[-159.333,-100],[0,0],[159.333,100],[245,0],[159.333,-100]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":39,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":125,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/assets/lottie/loading_black.json:
--------------------------------------------------------------------------------
1 | {"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":25,"ip":25,"op":55,"w":800,"h":800,"nm":"Loading #13","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[60.688,0],[0,55.228],[-60.688,0],[0,0],[-60.688,0],[0,55.228],[60.688,0]],"o":[[0,0],[-60.688,0],[0,-55.229],[60.688,0],[0,0],[60.688,0],[0,-55.229],[-60.688,0]],"v":[[0,0],[-159.333,100],[-245,0],[-159.333,-100],[0,0],[159.333,100],[245,0],[159.333,-100]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":39,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[10]},{"t":30,"s":[25]}],"ix":1},"e":{"a":0,"k":50,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":30,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":125,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Line","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[400,400,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":800,"h":800,"ip":25,"op":150,"st":25,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Line transparent","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[400,400,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[60.688,0],[0,55.228],[-60.688,0],[0,0],[-60.688,0],[0,55.228],[60.688,0]],"o":[[0,0],[-60.688,0],[0,-55.229],[60.688,0],[0,0],[60.688,0],[0,-55.229],[-60.688,0]],"v":[[0,0],[-159.333,100],[-245,0],[-159.333,-100],[0,0],[159.333,100],[245,0],[159.333,-100]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":39,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":125,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/devtools_options.yaml:
--------------------------------------------------------------------------------
1 | extensions:
2 |
--------------------------------------------------------------------------------
/docs/img/feat_ai_chat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/feat_ai_chat.png
--------------------------------------------------------------------------------
/docs/img/feat_ai_trans.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/feat_ai_trans.png
--------------------------------------------------------------------------------
/docs/img/feat_country.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/feat_country.png
--------------------------------------------------------------------------------
/docs/img/feat_rss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/feat_rss.png
--------------------------------------------------------------------------------
/docs/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/logo.png
--------------------------------------------------------------------------------
/docs/img/main.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/docs/img/main.png
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {"flutter":{"platforms":{"android":{"default":{"projectId":"anycast-412313","appId":"1:1092551717876:android:19617e703f779a0074ffa1","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"anycast-412313","appId":"1:1092551717876:ios:5c9c489a2d619ca074ffa1","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"anycast-412313","configurations":{"android":"1:1092551717876:android:19617e703f779a0074ffa1","ios":"1:1092551717876:ios:5c9c489a2d619ca074ffa1"}}}}}}
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 12.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | platform :ios, '13.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | Pod::PICKER_MEDIA = false
31 | Pod::PICKER_AUDIO = false
32 | Pod::PICKER_DOCUMENT = true
33 |
34 | target 'Runner' do
35 | use_frameworks!
36 | use_modular_headers!
37 |
38 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
39 | target 'RunnerTests' do
40 | inherit! :search_paths
41 | end
42 | target 'Share Extension' do
43 | inherit! :search_paths
44 | end
45 | end
46 |
47 | post_install do |installer|
48 | installer.pods_project.targets.each do |target|
49 | flutter_additional_ios_build_settings(target)
50 |
51 | target.build_configurations.each do |config|
52 | config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
53 | '$(inherited)',
54 | 'AUDIO_SESSION_MICROPHONE=0'
55 | ]
56 | end
57 | end
58 | end
59 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
43 |
49 |
50 |
51 |
52 |
53 |
63 |
65 |
71 |
72 |
73 |
74 |
80 |
82 |
88 |
89 |
90 |
91 |
93 |
94 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @main
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sljeff/anycast/1005b5a063a4e691dbccad537e287cf81a768ce9/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AppGroupId
6 | $(CUSTOM_GROUP_ID)
7 | CADisableMinimumFrameDurationOnPhone
8 |
9 | CFBundleDevelopmentRegion
10 | $(DEVELOPMENT_LANGUAGE)
11 | CFBundleDisplayName
12 | Anycast
13 | CFBundleExecutable
14 | $(EXECUTABLE_NAME)
15 | CFBundleIdentifier
16 | $(PRODUCT_BUNDLE_IDENTIFIER)
17 | CFBundleInfoDictionaryVersion
18 | 6.0
19 | CFBundleName
20 | anycast
21 | CFBundlePackageType
22 | APPL
23 | CFBundleShortVersionString
24 | $(FLUTTER_BUILD_NAME)
25 | CFBundleSignature
26 | ????
27 | CFBundleURLTypes
28 |
29 |
30 | CFBundleTypeRole
31 | Editor
32 | CFBundleURLSchemes
33 |
34 | com.googleusercontent.apps.1092551717876-ugib9p1irmilcqr6hcshcmnj9sg6edfm
35 |
36 |
37 |
38 | CFBundleTypeRole
39 | Editor
40 | CFBundleURLSchemes
41 |
42 | ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER)
43 |
44 |
45 |
46 | CFBundleVersion
47 | $(FLUTTER_BUILD_NUMBER)
48 | ITSAppUsesNonExemptEncryption
49 |
50 | LSRequiresIPhoneOS
51 |
52 | NSAppTransportSecurity
53 |
54 | NSAllowsArbitraryLoads
55 |
56 | NSAllowsArbitraryLoadsForMedia
57 |
58 |
59 | UIApplicationSupportsIndirectInputEvents
60 |
61 | UIBackgroundModes
62 |
63 | audio
64 |
65 | UILaunchStoryboardName
66 | LaunchScreen
67 | UIMainStoryboardFile
68 | Main
69 | UISupportedInterfaceOrientations
70 |
71 | UIInterfaceOrientationPortrait
72 | UIInterfaceOrientationLandscapeLeft
73 | UIInterfaceOrientationLandscapeRight
74 |
75 | UISupportedInterfaceOrientations~ipad
76 |
77 | UIInterfaceOrientationPortrait
78 | UIInterfaceOrientationPortraitUpsideDown
79 | UIInterfaceOrientationLandscapeLeft
80 | UIInterfaceOrientationLandscapeRight
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.developer.applesignin
6 |
7 | Default
8 |
9 | com.apple.security.application-groups
10 |
11 | group.com.kindjeff.ShareExtention
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/ios/RunnerTests/RunnerTests.swift:
--------------------------------------------------------------------------------
1 | import Flutter
2 | import UIKit
3 | import XCTest
4 |
5 | class RunnerTests: XCTestCase {
6 |
7 | func testExample() {
8 | // If you add code to the Runner application, consider adding tests here.
9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/ios/Share Extension/Base.lproj/MainInterface.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ios/Share Extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | AppGroupId
6 | $(CUSTOM_GROUP_ID)
7 | CFBundleVersion
8 | $(FLUTTER_BUILD_NUMBER)
9 | NSExtension
10 |
11 | NSExtensionAttributes
12 |
13 | NSExtensionActivationRule
14 |
15 | NSExtensionActivationSupportsFileWithMaxCount
16 | 1
17 | NSExtensionActivationSupportsText
18 |
19 |
20 |
21 | NSExtensionMainStoryboard
22 | MainInterface
23 | NSExtensionPointIdentifier
24 | com.apple.share-services
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/ios/Share Extension/Share Extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.application-groups
6 |
7 | group.com.kindjeff.ShareExtention
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/firebase_app_id_file.json:
--------------------------------------------------------------------------------
1 | {
2 | "file_generated_by": "FlutterFire CLI",
3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
4 | "GOOGLE_APP_ID": "1:1092551717876:ios:5c9c489a2d619ca074ffa1",
5 | "FIREBASE_PROJECT_ID": "anycast-412313",
6 | "GCM_SENDER_ID": "1092551717876"
7 | }
--------------------------------------------------------------------------------
/lib/api/error_handler.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:anycast/pages/login.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:get/get.dart';
6 | import 'package:google_fonts/google_fonts.dart';
7 | import 'package:http/http.dart' as http;
8 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
9 |
10 | class ErrorHandler {
11 | static Future handle(int code, http.Response response) async {
12 | debugPrint(code.toString());
13 | debugPrint(response.body);
14 |
15 | if (code == 401) {
16 | await handle401();
17 | return;
18 | } else if (code == 403) {
19 | await handle403(response);
20 | return;
21 | }
22 |
23 | var style = GoogleFonts.roboto(
24 | color: Colors.white,
25 | fontSize: 14,
26 | fontWeight: FontWeight.w700,
27 | );
28 | Get.dialog(
29 | AlertDialog(
30 | title: Text('Error $code', style: style),
31 | content: Text(response.body, style: style),
32 | actions: [
33 | TextButton(
34 | onPressed: () {
35 | Get.back();
36 | },
37 | child: Text('OK', style: style),
38 | ),
39 | ],
40 | ),
41 | );
42 | }
43 |
44 | static Future handle401() async {
45 | showMaterialModalBottomSheet(
46 | expand: true,
47 | context: Get.context!,
48 | builder: (context) {
49 | return const LoginPage();
50 | },
51 | closeProgressThreshold: 0.9,
52 | );
53 | }
54 |
55 | static Future handle403(http.Response response) async {
56 | var body = utf8.decode(response.bodyBytes);
57 | var data = jsonDecode(body) as Map;
58 |
59 | var error = data['error'] as String;
60 | var errorCode = data['code'] as int;
61 |
62 | if (errorCode == 2) {
63 | handle401();
64 | return;
65 | }
66 |
67 | var style = GoogleFonts.roboto(
68 | color: Colors.white,
69 | fontSize: 14,
70 | fontWeight: FontWeight.w700,
71 | );
72 | Get.dialog(
73 | AlertDialog(
74 | title: Text('Error', style: style),
75 | content: Text(error, style: style),
76 | actions: [
77 | TextButton(
78 | onPressed: () {
79 | Get.back();
80 | },
81 | child: Text('OK', style: style),
82 | ),
83 | ],
84 | ),
85 | );
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/lib/api/podcasts.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:anycast/models/feed_episode.dart';
4 | import 'package:anycast/models/subscription.dart';
5 | import 'package:anycast/utils/http_client.dart';
6 | import 'package:http/http.dart' as http;
7 |
8 | const host = 'api.anycast.website';
9 |
10 | Future> searchChannels(String searchText) async {
11 | var url = Uri(
12 | host: host,
13 | scheme: 'https',
14 | path: '/search_channel/v2',
15 | queryParameters: {
16 | 'keyword': searchText,
17 | 'limit': '20',
18 | },
19 | );
20 |
21 | var response = await fetchWithRetry(url.toString());
22 | var body = utf8.decode(response!.bodyBytes);
23 | Map data = jsonDecode(body);
24 |
25 | List subscriptions = [];
26 | for (var item in data['data']['channel_list']) {
27 | subscriptions.add(resMap2Channel(item));
28 | }
29 | return subscriptions;
30 | }
31 |
32 | SubscriptionModel resMap2Channel(Map item) {
33 | return SubscriptionModel.fromMap({
34 | 'rssFeedUrl': item['rss_url'],
35 | 'title': item['title'].trim(),
36 | 'description': item['description'].trim(),
37 | 'imageUrl': item['small_cover_url'],
38 | 'link': item['link'],
39 | 'categories': item['keywords'].join(','),
40 | 'author': item['author'].trim(),
41 | 'email': '',
42 | });
43 | }
44 |
45 | class EpisodeWithChannel {
46 | FeedEpisodeModel? episode;
47 | SubscriptionModel? channel;
48 |
49 | EpisodeWithChannel(this.episode, this.channel);
50 | }
51 |
52 | Future> searchEpisodes(String searchText) async {
53 | var url = Uri(
54 | host: host,
55 | scheme: 'https',
56 | path: '/search_episode',
57 | queryParameters: {
58 | 'keyword': searchText,
59 | 'limit': '20',
60 | },
61 | );
62 |
63 | var response = await fetchWithRetry(url.toString());
64 | var body = utf8.decode(response!.bodyBytes);
65 | Map data = jsonDecode(body);
66 |
67 | List episodes = [];
68 | for (var item in data['data']) {
69 | episodes.add(EpisodeWithChannel(
70 | FeedEpisodeModel.fromMap({
71 | 'channelTitle': item['channel']['title'],
72 | 'rssFeedUrl': item['channel']['rss_url'],
73 | 'title': item['title'],
74 | 'description': item['description'],
75 | 'duration': item['duration'],
76 | 'enclosureUrl': item['url'],
77 | 'pubDate': parsePubDate(item['release_date'])!.millisecondsSinceEpoch,
78 | 'imageUrl': item['cover_url'],
79 | }),
80 | resMap2Channel(item['channel']),
81 | ));
82 | }
83 | return episodes;
84 | }
85 |
86 | DateTime? parsePubDate(String? pubDate) {
87 | if (pubDate == null) {
88 | return null;
89 | }
90 | return DateTime.parse(pubDate);
91 | }
92 |
93 | class Category {
94 | String name;
95 | String id;
96 | String imageUrl;
97 | String nightImageUrl;
98 |
99 | Category(this.name, this.id, this.imageUrl, this.nightImageUrl);
100 | }
101 |
102 | Future> listCategories() async {
103 | var url = Uri(
104 | host: host,
105 | scheme: 'https',
106 | path: '/categories',
107 | );
108 |
109 | var response = await http.get(url);
110 | var body = utf8.decode(response.bodyBytes);
111 | Map data = jsonDecode(body);
112 |
113 | var result = [];
114 | for (var item in data['data']) {
115 | result.add(Category(
116 | item['name'],
117 | item['id'],
118 | item['image_url'],
119 | item['night_image_url'],
120 | ));
121 | }
122 | return result;
123 | }
124 |
125 | Future> listChannelsByCategoryId(
126 | String categoryId, String country) async {
127 | var url = Uri(
128 | host: host,
129 | scheme: 'https',
130 | path: '/top_channels/v2',
131 | queryParameters: {
132 | 'category_id': categoryId,
133 | 'country': country,
134 | },
135 | );
136 |
137 | var response = await http.get(url);
138 | var body = utf8.decode(response.bodyBytes);
139 | Map data = jsonDecode(body);
140 |
141 | List subscriptions = [];
142 | if (data['data'] == null) {
143 | return subscriptions;
144 | }
145 |
146 | for (var item in data['data']['list']) {
147 | subscriptions.add(SubscriptionModel.fromMap({
148 | 'rssFeedUrl': item['rss_url'],
149 | 'title': item['title'].trim(),
150 | 'description': item['description'].trim(),
151 | 'imageUrl': item['small_cover_url'],
152 | 'link': item['link'],
153 | 'categories': item['keywords'].join(','),
154 | 'author': item['author'].trim(),
155 | 'email': '',
156 | }));
157 | }
158 | return subscriptions;
159 | }
160 |
--------------------------------------------------------------------------------
/lib/api/share.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:convert';
3 | import 'dart:io';
4 | import 'package:retry/retry.dart';
5 | import 'package:crypto/crypto.dart';
6 |
7 | import 'package:http/http.dart' as http;
8 |
9 | const password = 'cjp2PGN3zuf5cfh';
10 | const headers = {'Content-Type': 'application/json'};
11 |
12 | Future getShortUrl(Uri origin) async {
13 | var api = Uri(
14 | scheme: 'https',
15 | host: 's.anycast.website',
16 | path: '/',
17 | );
18 |
19 | Object? err;
20 | var resp = http.Response('', 500);
21 |
22 | try {
23 | resp = await (retry(
24 | () => http
25 | .post(api,
26 | headers: headers,
27 | body: jsonEncode({
28 | "cmd": "add",
29 | "url": origin.toString(),
30 | "password": password,
31 | "key": getMd5(origin.toString()),
32 | }))
33 | .timeout(const Duration(seconds: 3)),
34 | retryIf: (e) => e is SocketException || e is TimeoutException,
35 | maxAttempts: 3,
36 | ));
37 | } catch (e) {
38 | err = e;
39 | }
40 | if (err != null || resp.statusCode != 200) {
41 | return null;
42 | }
43 | var body = utf8.decode(resp.bodyBytes);
44 | Map data = jsonDecode(body);
45 | if (data['status'] != 200) {
46 | return null;
47 | }
48 | return Uri(
49 | scheme: 'https',
50 | host: 's.kindjeff.com',
51 | path: '/${data['key']}',
52 | ).toString();
53 | }
54 |
55 | String getMd5(String input) {
56 | return md5.convert(utf8.encode(input)).toString();
57 | }
58 |
--------------------------------------------------------------------------------
/lib/api/subtitles.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 | import 'package:anycast/api/error_handler.dart';
3 | import 'package:anycast/utils/http_client.dart';
4 | import 'package:http/http.dart' as http;
5 |
6 | const host = 'api.anycast.website';
7 |
8 | class Subtitle {
9 | double? start;
10 | double? end;
11 | String? text;
12 |
13 | Map toJson() => {
14 | 'start': start,
15 | 'end': end,
16 | 'text': text,
17 | };
18 |
19 | static Subtitle fromMap(Map json) {
20 | var subtitle = Subtitle();
21 | subtitle.start = json['start'];
22 | subtitle.end = json['end'];
23 | subtitle.text = json['text'];
24 | return subtitle;
25 | }
26 | }
27 |
28 | class SubtitleResult {
29 | String? status;
30 | String? language;
31 | List? subtitles;
32 | String? summary;
33 | }
34 |
35 | Future getSubtitles(String enclosureUrl) async {
36 | var url = Uri(
37 | host: host,
38 | scheme: 'https',
39 | path: '/subtitles',
40 | );
41 | var req = {'enclosure_url': enclosureUrl};
42 |
43 | var response = await reqWithAuth(url.toString(), method: "POST", data: req);
44 | if (response.statusCode < 200 || response.statusCode >= 300) {
45 | ErrorHandler.handle(response.statusCode, response);
46 | return SubtitleResult()..status = 'failed';
47 | }
48 |
49 | var body = utf8.decode(response.bodyBytes);
50 | Map data = jsonDecode(body);
51 |
52 | var result = SubtitleResult();
53 | if (data['status'] != 'succeeded') {
54 | result.status = data['status'];
55 | return result;
56 | }
57 |
58 | result.language = data['subtitle']['detected_language'];
59 | result.status = data['status'];
60 | result.summary = '';
61 |
62 | result.subtitles = [];
63 | for (var item in data['subtitle']['segments']) {
64 | var subtitle = Subtitle();
65 | subtitle.start = item['start'];
66 | subtitle.end = item['end'];
67 | subtitle.text = item['text'];
68 | result.subtitles!.add(subtitle);
69 | }
70 | return result;
71 | }
72 |
73 | Future?> getTranslation(
74 | String enclosureUrl, String language) async {
75 | var url = Uri(
76 | host: host,
77 | scheme: 'https',
78 | path: '/subtitles/translate',
79 | );
80 | var req = jsonEncode({'enclosure_url': enclosureUrl, 'language': language});
81 | var headers = {'Content-Type': 'application/json'};
82 |
83 | var response = await http.post(url, body: req, headers: headers);
84 | var body = utf8.decode(response.bodyBytes);
85 | Map data = jsonDecode(body);
86 | if (data['translation'] == null) {
87 | return null;
88 | }
89 |
90 | var result = [];
91 | for (var item in data['translation']) {
92 | result.add(Subtitle.fromMap({
93 | 'start': item['start'],
94 | 'end': item['end'],
95 | 'text': item['text'],
96 | }));
97 | }
98 | return result;
99 | }
100 |
101 | Future chatAPI(String enclosureUrl, String input,
102 | List