├── .gitignore
├── .metadata
├── README.md
├── Screenshot_20200824-180154.jpg
├── Screenshot_20200824-180256.jpg
├── Screenshot_20200825-152025.jpg
├── Screenshot_20200825-152332.jpg
├── Screenshot_20200825-155059.jpg
├── Screenshot_20200825-155200.jpg
├── Screenshot_20200825-155355.jpg
├── Screenshot_20200825-155431.jpg
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── pawelfranitza
│ │ │ │ ├── chat_app
│ │ │ │ └── MainActivity.kt
│ │ │ │ └── chatapp
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
└── template.txt
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── 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-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.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
├── lib
├── generated
│ ├── intl
│ │ ├── messages_all.dart
│ │ ├── messages_en.dart
│ │ └── messages_pl.dart
│ └── l10n.dart
├── l10n
│ ├── intl_en.arb
│ └── intl_pl.arb
├── main.dart
├── models
│ ├── ListExtension.dart
│ ├── Message.dart
│ ├── NavMsgsOccupancyGridExtension.dart
│ ├── StringExtension.dart
│ └── Waypoint.dart
├── providers
│ ├── AppStateProvider.dart
│ ├── AudioProvider.dart
│ ├── ChatInfoProvider.dart
│ ├── DialogflowProvider.dart
│ ├── RosProvider.dart
│ └── SettingsProvider.dart
├── screens
│ ├── ChatPage.dart
│ ├── ControllerPage.dart
│ ├── MainPage.dart
│ ├── MapPage.dart
│ ├── SettingsPage.dart
│ └── SettingsPageNew.dart
└── widgets
│ ├── BubbleMessage.dart
│ ├── ChatBar.dart
│ ├── ColorPickerCustom.dart
│ ├── FavoriteShelf.dart
│ ├── MapPainter.dart
│ ├── MapShelfButtons.dart
│ ├── MessagesList.dart
│ ├── RainbowCircularIndicator.dart
│ ├── RainbowLinearIndicator.dart
│ ├── RoomShelf.dart
│ ├── RoundedCornersContainer.dart
│ ├── ShadowLine.dart
│ ├── StatusInfo.dart
│ ├── WaypointDialog.dart
│ ├── WaypointShelf.dart
│ └── WirtualController.dart
├── pubspec.lock
├── pubspec.yaml
├── test
└── widget_test.dart
└── web
├── favicon.png
├── icons
├── Icon-192.png
└── Icon-512.png
├── index.html
└── manifest.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | .vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
39 | # Api keys
40 | /assets/api/*
41 |
--------------------------------------------------------------------------------
/.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: f139b11009aeb8ed2a3a3aa8b0066e482709dde3
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ros_command_app
2 | Application for controlling ROS robot with voice commands, sending goals on map or remote controll with virtual joystick
3 | 29.03.2020
4 |
5 | Please note that I made this app as a beginner (~29.03.2020), there are some mistakes and bad practices that should be changed, architecture / state management is also not great. It serves as a demo and the starter point for anyone interested in ROS + Flutter, please keep in mind that it is unlikely that the repository will be updated and / or activelly updated. Sorry for the inconvenience and unresolved issues.
6 |
7 | Check out youtube video showcasing app (PL + ENG subtitles):
8 |
9 | [](https://www.youtube.com/watch?v=RIz-qJ3_qvo "YouTube video here")
10 |
11 | ### Map page
12 | You can move robot between points which are created fter clicking on the fab.
13 |
14 | https://github.com/Rongix/ros_navigation_command_app
15 |
16 |
17 |
18 | ### Controller page
19 |
20 |
21 | ### Chat page
22 | Chat page provides communication with Dialogflow Agent.
23 |
24 |
25 |
26 | ### Internatiolization & language support
27 | ~~This app is not internationalized, there are some UI hardcoded strings in polish, sorry for any inconvenience! It uses polish dialogflow intents so it may be tricky to get it running flawlessly~~.
28 | This app has english and polish versions (no dialogflow agent included)
29 |
30 | ## Getting started:
31 | You need to have ROS installed. App was tested with Turtlebot3 Waffle Pi in the simulation environment, althought it can work with any robot. You can quickly set topics and configurate ROS in the app settings.
32 |
33 | This project is a Flutter application.
34 |
35 | A few resources to get you started if this is your first Flutter project:
36 |
37 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
38 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
39 |
40 | For help getting started with Flutter, view our
41 | [online documentation](https://flutter.dev/docs), which offers tutorials,
42 | samples, guidance on mobile development, and a full API reference.
43 |
44 | ## Getting Started
45 |
46 | A few resources to get you started if this is your first Flutter project:
47 |
48 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
49 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
50 |
51 | For help getting started with Flutter, view our
52 | [online documentation](https://flutter.dev/docs), which offers tutorials,
53 | samples, guidance on mobile development, and a full API reference.
54 |
55 | ## Prerequisites
56 |
57 | - You don't need real robot to run app and navigate.
58 | - [ROS Melodic](http://wiki.ros.org/melodic) - Ubuntu 18.04 / [ROS Kinetic](http://wiki.ros.org/kinetic) - Ubuntu 16.04)
59 | - [Flutter](https://flutter.dev/docs/get-started/install).
60 | - [Node.js](https://nodejs.org/en/) for interactive map.
61 |
62 | ## Installation
63 | ### Installation of ROS
64 |
65 | ROS kinetic: [please follow instruction](http://emanual.robotis.com/docs/en/platform/turtlebot3/pc_setup/)
66 | ROS Melodic: Instruction for Ubuntu 18.04 below:
67 |
68 | 1. Following step will update your system and install ROS-Melodic-dekstop-full version. It will also create few aliases and source ROS-melodic environment in your .bashrc, and create catkin_ws folder in your root directory.
69 | ```
70 | sudo apt update
71 | sudo apt upgrade -y
72 | wget https://raw.githubusercontent.com/ROBOTIS-GIT/robotis_tools/master/install_ros_melodic.sh && chmod 755 ./install_ros_melodic.sh && bash ./install_ros_melodic.sh
73 | ```
74 | 2. Install dependencies.
75 | ```
76 | sudo apt install ros-melodic-joy ros-melodic-teleop-twist-joy ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-server ros-melodic-rosserial-client ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers
77 | ```
78 | 3. Install packages for Turtlebot3 (it contains node for simulation).
79 | ```
80 | cd ~/catkin_ws/src/
81 | git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
82 | git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
83 | git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
84 | cd ~/catkin_ws && catkin_make
85 | ```
86 | 4. In the next steps you should configure your network.
87 | ```
88 | sudo nano ~/.bashrc
89 | // EDIT FIELDS: Replace with your ip adress. Please not that you should not use http://localhost:11311 because it won't work.
90 | // Get your ip with: hostname -I
91 | // EXAMPLE: export ROS_MASTER_URI=http://192.221.1.11:11311
92 | // EXAMPLE: export ROS_HOSTNAME=192.221.1.11
93 | // REPLACE: 192.221.1.11 with your ip.
94 | ```
95 | 5. Install camera package.
96 | ```
97 | cd ~/catkin_ws/src/
98 | git clone https://github.com/OTL/cv_camera.git
99 | cd ~/catkin_ws && catkin_make
100 |
101 | // EXAMPLE of use: rosparam set cv_camera/device_id 001
102 | // EXAMPLE of use: rosrun cv_camera cv_camera_node
103 | ```
104 | 6. Export ROS parameters; simulated robot model. I use waffle_pi. Add appropriete line to your bashrc.
105 | ```
106 | export TURTLEBOT3_MODEL=waffle_pi
107 | ```
108 |
109 | ## Running ROS with application.
110 | Refer [ROBOTIS e-Manual for more information.](http://emanual.robotis.com/docs/en/platform/turtlebot3/overview/#overview)
111 |
112 | ### Launch ROS
113 | Read instruction how to use launch nodes and fake node in [simulation chapter](http://emanual.robotis.com/docs/en/platform/turtlebot3/simulation/#simulation).
114 | ```
115 | roscore
116 | roslaunch turtlebot3_fake turtlebot3_fake.launch
117 | roslaunch turtlebot3_gazebo turtlebot3_house.launch
118 | roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
119 | roslaunch turtlebot3_navigation turtlebot3_navigation.launch
120 | //NOTE: This is example, adjust paths to launch files.
121 | roslaunch '/home/rongix/catkin_ws/src/turtlebot3/turtlebot3_navigation/launch/move_base.launch'
122 | ```
123 | ### Configure ROS params in mobile app settings
124 |
125 | ### Voice commands
126 | To use voice commands you have to configure your own dialogflow agent
127 |
--------------------------------------------------------------------------------
/Screenshot_20200824-180154.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200824-180154.jpg
--------------------------------------------------------------------------------
/Screenshot_20200824-180256.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200824-180256.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-152025.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-152025.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-152332.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-152332.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-155059.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-155059.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-155200.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-155200.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-155355.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-155355.jpg
--------------------------------------------------------------------------------
/Screenshot_20200825-155431.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/Screenshot_20200825-155431.jpg
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 28
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | lintOptions {
36 | disable 'InvalidPackage'
37 | }
38 |
39 | defaultConfig {
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
41 | applicationId "com.pawelfranitza.chatapp"
42 | minSdkVersion 16
43 | targetSdkVersion 28
44 | versionCode flutterVersionCode.toInteger()
45 | versionName flutterVersionName
46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
47 | }
48 |
49 | buildTypes {
50 | release {
51 | // TODO: Add your own signing config for the release build.
52 | // Signing with the debug keys for now, so `flutter run --release` works.
53 | signingConfig signingConfigs.debug
54 | }
55 | }
56 | }
57 |
58 | flutter {
59 | source '../..'
60 | }
61 |
62 | dependencies {
63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
64 | testImplementation 'junit:junit:4.12'
65 | androidTestImplementation 'androidx.test:runner:1.1.1'
66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
67 | }
68 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
24 |
25 |
26 |
27 |
28 |
29 |
31 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/pawelfranitza/chat_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.pawelfranitza.chat_app
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/pawelfranitza/chatapp/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.pawelfranitza.chatapp
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/assets/template.txt:
--------------------------------------------------------------------------------
1 | /api/dialogflowapi.json
2 | {
3 | "type": "service_account",
4 | "project_id": "XXXXXXXXXXXX",
5 | "private_key_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
6 | "private_key": "-----BEGIN PRIVATE KEY-----\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-----END PRIVATE KEY-----\n",
7 | "client_email": "XXXXXXXXXXXXXXXXX",
8 | "client_id": "XXXXXXXXXXXX",
9 | "auth_uri": "XXXXXXXXXXXXXXXXXXXXXXX",
10 | "token_uri": "XXXXXXXXXXXXXXXXXXXXXXXX",
11 | "auth_provider_x509_cert_url": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
12 | "client_x509_cert_url": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
13 | }
14 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
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 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/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 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/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 | @UIApplicationMain
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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Rongix/ros_navigation_command_app/b753892383b08cfb929a6e9aeb3718b4cdbc3163/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 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | chatapp
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
--------------------------------------------------------------------------------
/lib/generated/intl/messages_all.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2 | // This is a library that looks up messages for specific locales by
3 | // delegating to the appropriate library.
4 |
5 | // Ignore issues from commonly used lints in this file.
6 | // ignore_for_file:implementation_imports, file_names, unnecessary_new
7 | // ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering
8 | // ignore_for_file:argument_type_not_assignable, invalid_assignment
9 | // ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases
10 | // ignore_for_file:comment_references
11 |
12 | import 'dart:async';
13 |
14 | import 'package:intl/intl.dart';
15 | import 'package:intl/message_lookup_by_library.dart';
16 | import 'package:intl/src/intl_helpers.dart';
17 |
18 | import 'messages_en.dart' as messages_en;
19 | import 'messages_pl.dart' as messages_pl;
20 |
21 | typedef Future LibraryLoader();
22 | Map _deferredLibraries = {
23 | 'en': () => new Future.value(null),
24 | 'pl': () => new Future.value(null),
25 | };
26 |
27 | MessageLookupByLibrary _findExact(String localeName) {
28 | switch (localeName) {
29 | case 'en':
30 | return messages_en.messages;
31 | case 'pl':
32 | return messages_pl.messages;
33 | default:
34 | return null;
35 | }
36 | }
37 |
38 | /// User programs should call this before using [localeName] for messages.
39 | Future initializeMessages(String localeName) async {
40 | var availableLocale = Intl.verifiedLocale(
41 | localeName,
42 | (locale) => _deferredLibraries[locale] != null,
43 | onFailure: (_) => null);
44 | if (availableLocale == null) {
45 | return new Future.value(false);
46 | }
47 | var lib = _deferredLibraries[availableLocale];
48 | await (lib == null ? new Future.value(false) : lib());
49 | initializeInternalMessageLookup(() => new CompositeMessageLookup());
50 | messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
51 | return new Future.value(true);
52 | }
53 |
54 | bool _messagesExistFor(String locale) {
55 | try {
56 | return _findExact(locale) != null;
57 | } catch (e) {
58 | return false;
59 | }
60 | }
61 |
62 | MessageLookupByLibrary _findGeneratedMessagesFor(String locale) {
63 | var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor,
64 | onFailure: (_) => null);
65 | if (actualLocale == null) return null;
66 | return _findExact(actualLocale);
67 | }
68 |
--------------------------------------------------------------------------------
/lib/generated/intl/messages_en.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2 | // This is a library that provides messages for a en locale. All the
3 | // messages from the main program should be duplicated here with the same
4 | // function name.
5 |
6 | // Ignore issues from commonly used lints in this file.
7 | // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
8 | // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
9 | // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
10 | // ignore_for_file:unused_import, file_names
11 |
12 | import 'package:intl/intl.dart';
13 | import 'package:intl/message_lookup_by_library.dart';
14 |
15 | final messages = new MessageLookup();
16 |
17 | typedef String MessageIfAbsent(String messageStr, List args);
18 |
19 | class MessageLookup extends MessageLookupByLibrary {
20 | String get localeName => 'en';
21 |
22 | static m0(type) => "${Intl.select(type, {'title': 'Limit animations', 'desc': 'Changes how lists and messages animate', })}";
23 |
24 | static m1(type) => "${Intl.select(type, {'title': 'Button labels', 'desc': 'Show additional labels under buttons', })}";
25 |
26 | static m2(type) => "${Intl.select(type, {'title': 'App settings', 'desc': 'General settings & accessibility', })}";
27 |
28 | static m3(type) => "${Intl.select(type, {'title': 'Ros configuration', 'desc': 'Ros web config of main and current device', })}";
29 |
30 | static m4(theme) => "${Intl.select(theme, {'light': 'Light theme', 'dark': 'Dark theme', 'system': 'System theme', })}";
31 |
32 | final messages = _notInlinedMessages(_notInlinedMessages);
33 | static _notInlinedMessages(_) => {
34 | "creatorAddNew" : MessageLookupByLibrary.simpleMessage("Add new marker"),
35 | "creatorEdit" : MessageLookupByLibrary.simpleMessage("Edit marker"),
36 | "creatorHue" : MessageLookupByLibrary.simpleMessage("Hue"),
37 | "creatorName" : MessageLookupByLibrary.simpleMessage("Name"),
38 | "pageChatIntroAction1" : MessageLookupByLibrary.simpleMessage("Click text icon or order field"),
39 | "pageChatIntroAction2" : MessageLookupByLibrary.simpleMessage("Hold mic icon"),
40 | "pageChatIntroBody" : MessageLookupByLibrary.simpleMessage("Try to talk with voice assistant to issue commands. To begin:"),
41 | "pageChatIntroTitle" : MessageLookupByLibrary.simpleMessage("Hello"),
42 | "pageChatRecording" : MessageLookupByLibrary.simpleMessage("Recording"),
43 | "pageChatTexting" : MessageLookupByLibrary.simpleMessage("Order"),
44 | "pageChatTitle" : MessageLookupByLibrary.simpleMessage("Chat"),
45 | "pageControllerInfoTitle" : MessageLookupByLibrary.simpleMessage("Waiting for cammera topic"),
46 | "pageControllerTitle" : MessageLookupByLibrary.simpleMessage("Controller"),
47 | "pageMapButtonFloating" : MessageLookupByLibrary.simpleMessage("Add new map marker"),
48 | "pageMapButtonGrid" : MessageLookupByLibrary.simpleMessage("Show / hide grid"),
49 | "pageMapInfoTitle" : MessageLookupByLibrary.simpleMessage("Waiting for map topic"),
50 | "pageMapTitle" : MessageLookupByLibrary.simpleMessage("Map"),
51 | "pageSettingsAbout" : MessageLookupByLibrary.simpleMessage("About"),
52 | "pageSettingsAnimations" : m0,
53 | "pageSettingsButtonsDesc" : m1,
54 | "pageSettingsGeneral" : m2,
55 | "pageSettingsRos" : m3,
56 | "pageSettingsRosBattery" : MessageLookupByLibrary.simpleMessage("Battery"),
57 | "pageSettingsRosCamera" : MessageLookupByLibrary.simpleMessage("Camera"),
58 | "pageSettingsRosChatter" : MessageLookupByLibrary.simpleMessage("Chatter"),
59 | "pageSettingsRosDevice" : MessageLookupByLibrary.simpleMessage("This device (ip)"),
60 | "pageSettingsRosMain" : MessageLookupByLibrary.simpleMessage("Main server (ip)"),
61 | "pageSettingsRosMap" : MessageLookupByLibrary.simpleMessage("Map"),
62 | "pageSettingsRosNavigation" : MessageLookupByLibrary.simpleMessage("Navigation / Goal"),
63 | "pageSettingsRosOdom" : MessageLookupByLibrary.simpleMessage("Odometry"),
64 | "pageSettingsRosVelocity" : MessageLookupByLibrary.simpleMessage("Linear / angular velocity"),
65 | "pageSettingsThemes" : m4,
66 | "pageSettingsTitle" : MessageLookupByLibrary.simpleMessage("Settings"),
67 | "tooltipChatMode" : MessageLookupByLibrary.simpleMessage("Text input"),
68 | "tooltipChatStar" : MessageLookupByLibrary.simpleMessage("Quick Replies"),
69 | "tooltipCoordinates" : MessageLookupByLibrary.simpleMessage("Coordinates"),
70 | "tooltipCurrentLocation" : MessageLookupByLibrary.simpleMessage("Current robot location"),
71 | "tooltipRandom" : MessageLookupByLibrary.simpleMessage("Random name"),
72 | "tooltipRefreshConnection" : MessageLookupByLibrary.simpleMessage("Refresh connection"),
73 | "tooltipSettings" : MessageLookupByLibrary.simpleMessage("Settings"),
74 | "tooltipStopActions" : MessageLookupByLibrary.simpleMessage("Stop actions")
75 | };
76 | }
77 |
--------------------------------------------------------------------------------
/lib/generated/intl/messages_pl.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
2 | // This is a library that provides messages for a pl locale. All the
3 | // messages from the main program should be duplicated here with the same
4 | // function name.
5 |
6 | // Ignore issues from commonly used lints in this file.
7 | // ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
8 | // ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
9 | // ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
10 | // ignore_for_file:unused_import, file_names
11 |
12 | import 'package:intl/intl.dart';
13 | import 'package:intl/message_lookup_by_library.dart';
14 |
15 | final messages = new MessageLookup();
16 |
17 | typedef String MessageIfAbsent(String messageStr, List args);
18 |
19 | class MessageLookup extends MessageLookupByLibrary {
20 | String get localeName => 'pl';
21 |
22 | static m0(type) => "${Intl.select(type, {'title': 'Ogranicz animacje', 'desc': 'Zmienia zachowanie list, wiadomości', })}";
23 |
24 | static m1(type) => "${Intl.select(type, {'title': 'Podpisy przycisków', 'desc': 'Dodaje podpisy pod przyciskami nawigacji', })}";
25 |
26 | static m2(type) => "${Intl.select(type, {'title': 'Ustawienia aplikacji', 'desc': 'Ogólne ustawienia i opcje dostępu', })}";
27 |
28 | static m3(type) => "${Intl.select(type, {'title': 'Konfiguracja ROS', 'desc': 'Konfiguracja sieciowa ROS, należy wprowadzić adres urządzenia roscore i adres ip aktualnego urządzenia', })}";
29 |
30 | static m4(theme) => "${Intl.select(theme, {'light': 'Jasny motyw', 'dark': 'Ciemny motyw', 'system': 'Systemowy motyw', })}";
31 |
32 | final messages = _notInlinedMessages(_notInlinedMessages);
33 | static _notInlinedMessages(_) => {
34 | "creatorAddNew" : MessageLookupByLibrary.simpleMessage("Dodaj nowy znacznik"),
35 | "creatorEdit" : MessageLookupByLibrary.simpleMessage("Edytuj znacznik"),
36 | "creatorHue" : MessageLookupByLibrary.simpleMessage("Barwa"),
37 | "creatorName" : MessageLookupByLibrary.simpleMessage("Nazwa"),
38 | "pageChatIntroAction1" : MessageLookupByLibrary.simpleMessage("Click text icon or order field"),
39 | "pageChatIntroAction2" : MessageLookupByLibrary.simpleMessage("Hold mic icon"),
40 | "pageChatIntroBody" : MessageLookupByLibrary.simpleMessage("Try to talk with voice assistant to issue commands. To begin:"),
41 | "pageChatIntroTitle" : MessageLookupByLibrary.simpleMessage("Hello"),
42 | "pageChatRecording" : MessageLookupByLibrary.simpleMessage("Nagrywam..."),
43 | "pageChatTexting" : MessageLookupByLibrary.simpleMessage("Polecenie"),
44 | "pageChatTitle" : MessageLookupByLibrary.simpleMessage("Chat"),
45 | "pageControllerInfoTitle" : MessageLookupByLibrary.simpleMessage("Czekam na obraz z kamery"),
46 | "pageControllerTitle" : MessageLookupByLibrary.simpleMessage("Controller"),
47 | "pageMapButtonFloating" : MessageLookupByLibrary.simpleMessage("Utwórz nowy znacznik lokalizacyjny"),
48 | "pageMapButtonGrid" : MessageLookupByLibrary.simpleMessage("Pokaż / ukryj siatkę"),
49 | "pageMapInfoTitle" : MessageLookupByLibrary.simpleMessage("Czekam na obraz mapy"),
50 | "pageMapTitle" : MessageLookupByLibrary.simpleMessage("Mapa"),
51 | "pageSettingsAbout" : MessageLookupByLibrary.simpleMessage("O aplikacji"),
52 | "pageSettingsAnimations" : m0,
53 | "pageSettingsButtonsDesc" : m1,
54 | "pageSettingsGeneral" : m2,
55 | "pageSettingsRos" : m3,
56 | "pageSettingsRosBattery" : MessageLookupByLibrary.simpleMessage("Bateria"),
57 | "pageSettingsRosCamera" : MessageLookupByLibrary.simpleMessage("Kamera"),
58 | "pageSettingsRosChatter" : MessageLookupByLibrary.simpleMessage("Chatter"),
59 | "pageSettingsRosDevice" : MessageLookupByLibrary.simpleMessage("To urządzenie (ip)"),
60 | "pageSettingsRosMain" : MessageLookupByLibrary.simpleMessage("Główny serwer (ip)"),
61 | "pageSettingsRosMap" : MessageLookupByLibrary.simpleMessage("Mapa"),
62 | "pageSettingsRosNavigation" : MessageLookupByLibrary.simpleMessage("Nawigacja / Cel"),
63 | "pageSettingsRosOdom" : MessageLookupByLibrary.simpleMessage("Odometria robota"),
64 | "pageSettingsRosVelocity" : MessageLookupByLibrary.simpleMessage("Prędkość liniowa / kątowa silników"),
65 | "pageSettingsThemes" : m4,
66 | "pageSettingsTitle" : MessageLookupByLibrary.simpleMessage("Ustawienia"),
67 | "tooltipChatMode" : MessageLookupByLibrary.simpleMessage("Polecenie tekstowe"),
68 | "tooltipChatStar" : MessageLookupByLibrary.simpleMessage("Szybkie odpowiedzi"),
69 | "tooltipCoordinates" : MessageLookupByLibrary.simpleMessage("Ręczne koordynaty"),
70 | "tooltipCurrentLocation" : MessageLookupByLibrary.simpleMessage("Aktualne położenie robota"),
71 | "tooltipRandom" : MessageLookupByLibrary.simpleMessage("Wylosuj nazwę"),
72 | "tooltipRefreshConnection" : MessageLookupByLibrary.simpleMessage("Odśwież połączenie"),
73 | "tooltipSettings" : MessageLookupByLibrary.simpleMessage("Ustawienia"),
74 | "tooltipStopActions" : MessageLookupByLibrary.simpleMessage("Zatrzymaj akcje robota")
75 | };
76 | }
77 |
--------------------------------------------------------------------------------
/lib/generated/l10n.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 | import 'package:flutter/material.dart';
3 | import 'package:intl/intl.dart';
4 | import 'intl/messages_all.dart';
5 |
6 | // **************************************************************************
7 | // Generator: Flutter Intl IDE plugin
8 | // Made by Localizely
9 | // **************************************************************************
10 |
11 | // ignore_for_file: non_constant_identifier_names, lines_longer_than_80_chars
12 | // ignore_for_file: join_return_with_assignment, prefer_final_in_for_each
13 | // ignore_for_file: avoid_redundant_argument_values
14 |
15 | class S {
16 | S();
17 |
18 | static S current;
19 |
20 | static const AppLocalizationDelegate delegate =
21 | AppLocalizationDelegate();
22 |
23 | static Future load(Locale locale) {
24 | final name = (locale.countryCode?.isEmpty ?? false) ? locale.languageCode : locale.toString();
25 | final localeName = Intl.canonicalizedLocale(name);
26 | return initializeMessages(localeName).then((_) {
27 | Intl.defaultLocale = localeName;
28 | S.current = S();
29 |
30 | return S.current;
31 | });
32 | }
33 |
34 | static S of(BuildContext context) {
35 | return Localizations.of(context, S);
36 | }
37 |
38 | /// `Stop actions`
39 | String get tooltipStopActions {
40 | return Intl.message(
41 | 'Stop actions',
42 | name: 'tooltipStopActions',
43 | desc: '',
44 | args: [],
45 | );
46 | }
47 |
48 | /// `Refresh connection`
49 | String get tooltipRefreshConnection {
50 | return Intl.message(
51 | 'Refresh connection',
52 | name: 'tooltipRefreshConnection',
53 | desc: '',
54 | args: [],
55 | );
56 | }
57 |
58 | /// `Settings`
59 | String get tooltipSettings {
60 | return Intl.message(
61 | 'Settings',
62 | name: 'tooltipSettings',
63 | desc: '',
64 | args: [],
65 | );
66 | }
67 |
68 | /// `Text input`
69 | String get tooltipChatMode {
70 | return Intl.message(
71 | 'Text input',
72 | name: 'tooltipChatMode',
73 | desc: '',
74 | args: [],
75 | );
76 | }
77 |
78 | /// `Quick Replies`
79 | String get tooltipChatStar {
80 | return Intl.message(
81 | 'Quick Replies',
82 | name: 'tooltipChatStar',
83 | desc: '',
84 | args: [],
85 | );
86 | }
87 |
88 | /// `Random name`
89 | String get tooltipRandom {
90 | return Intl.message(
91 | 'Random name',
92 | name: 'tooltipRandom',
93 | desc: '',
94 | args: [],
95 | );
96 | }
97 |
98 | /// `Current robot location`
99 | String get tooltipCurrentLocation {
100 | return Intl.message(
101 | 'Current robot location',
102 | name: 'tooltipCurrentLocation',
103 | desc: '',
104 | args: [],
105 | );
106 | }
107 |
108 | /// `Coordinates`
109 | String get tooltipCoordinates {
110 | return Intl.message(
111 | 'Coordinates',
112 | name: 'tooltipCoordinates',
113 | desc: '',
114 | args: [],
115 | );
116 | }
117 |
118 | /// `Chat`
119 | String get pageChatTitle {
120 | return Intl.message(
121 | 'Chat',
122 | name: 'pageChatTitle',
123 | desc: '',
124 | args: [],
125 | );
126 | }
127 |
128 | /// `Order`
129 | String get pageChatTexting {
130 | return Intl.message(
131 | 'Order',
132 | name: 'pageChatTexting',
133 | desc: '',
134 | args: [],
135 | );
136 | }
137 |
138 | /// `Recording`
139 | String get pageChatRecording {
140 | return Intl.message(
141 | 'Recording',
142 | name: 'pageChatRecording',
143 | desc: '',
144 | args: [],
145 | );
146 | }
147 |
148 | /// `Hello`
149 | String get pageChatIntroTitle {
150 | return Intl.message(
151 | 'Hello',
152 | name: 'pageChatIntroTitle',
153 | desc: '',
154 | args: [],
155 | );
156 | }
157 |
158 | /// `Try to talk with voice assistant to issue commands. To begin:`
159 | String get pageChatIntroBody {
160 | return Intl.message(
161 | 'Try to talk with voice assistant to issue commands. To begin:',
162 | name: 'pageChatIntroBody',
163 | desc: '',
164 | args: [],
165 | );
166 | }
167 |
168 | /// `Click text icon or order field`
169 | String get pageChatIntroAction1 {
170 | return Intl.message(
171 | 'Click text icon or order field',
172 | name: 'pageChatIntroAction1',
173 | desc: '',
174 | args: [],
175 | );
176 | }
177 |
178 | /// `Hold mic icon`
179 | String get pageChatIntroAction2 {
180 | return Intl.message(
181 | 'Hold mic icon',
182 | name: 'pageChatIntroAction2',
183 | desc: '',
184 | args: [],
185 | );
186 | }
187 |
188 | /// `Controller`
189 | String get pageControllerTitle {
190 | return Intl.message(
191 | 'Controller',
192 | name: 'pageControllerTitle',
193 | desc: '',
194 | args: [],
195 | );
196 | }
197 |
198 | /// `Waiting for cammera topic`
199 | String get pageControllerInfoTitle {
200 | return Intl.message(
201 | 'Waiting for cammera topic',
202 | name: 'pageControllerInfoTitle',
203 | desc: '',
204 | args: [],
205 | );
206 | }
207 |
208 | /// `Map`
209 | String get pageMapTitle {
210 | return Intl.message(
211 | 'Map',
212 | name: 'pageMapTitle',
213 | desc: '',
214 | args: [],
215 | );
216 | }
217 |
218 | /// `Waiting for map topic`
219 | String get pageMapInfoTitle {
220 | return Intl.message(
221 | 'Waiting for map topic',
222 | name: 'pageMapInfoTitle',
223 | desc: '',
224 | args: [],
225 | );
226 | }
227 |
228 | /// `Show / hide grid`
229 | String get pageMapButtonGrid {
230 | return Intl.message(
231 | 'Show / hide grid',
232 | name: 'pageMapButtonGrid',
233 | desc: '',
234 | args: [],
235 | );
236 | }
237 |
238 | /// `Add new map marker`
239 | String get pageMapButtonFloating {
240 | return Intl.message(
241 | 'Add new map marker',
242 | name: 'pageMapButtonFloating',
243 | desc: '',
244 | args: [],
245 | );
246 | }
247 |
248 | // skipped getter for the 'pageMapInitialRooms' key
249 |
250 | /// `Settings`
251 | String get pageSettingsTitle {
252 | return Intl.message(
253 | 'Settings',
254 | name: 'pageSettingsTitle',
255 | desc: '',
256 | args: [],
257 | );
258 | }
259 |
260 | /// `{type, select, title {App settings} desc {General settings & accessibility}}`
261 | String pageSettingsGeneral(Object type) {
262 | return Intl.select(
263 | type,
264 | {
265 | 'title': 'App settings',
266 | 'desc': 'General settings & accessibility',
267 | },
268 | name: 'pageSettingsGeneral',
269 | desc: '',
270 | args: [type],
271 | );
272 | }
273 |
274 | /// `{theme, select, light {Light theme} dark {Dark theme} system {System theme}}`
275 | String pageSettingsThemes(Object theme) {
276 | return Intl.select(
277 | theme,
278 | {
279 | 'light': 'Light theme',
280 | 'dark': 'Dark theme',
281 | 'system': 'System theme',
282 | },
283 | name: 'pageSettingsThemes',
284 | desc: '',
285 | args: [theme],
286 | );
287 | }
288 |
289 | /// `{type, select, title {Limit animations} desc {Changes how lists and messages animate}}`
290 | String pageSettingsAnimations(Object type) {
291 | return Intl.select(
292 | type,
293 | {
294 | 'title': 'Limit animations',
295 | 'desc': 'Changes how lists and messages animate',
296 | },
297 | name: 'pageSettingsAnimations',
298 | desc: '',
299 | args: [type],
300 | );
301 | }
302 |
303 | /// `{type, select, title {Button labels} desc {Show additional labels under buttons}}`
304 | String pageSettingsButtonsDesc(Object type) {
305 | return Intl.select(
306 | type,
307 | {
308 | 'title': 'Button labels',
309 | 'desc': 'Show additional labels under buttons',
310 | },
311 | name: 'pageSettingsButtonsDesc',
312 | desc: '',
313 | args: [type],
314 | );
315 | }
316 |
317 | /// `{type, select, title {Ros configuration} desc {Ros web config of main and current device}}`
318 | String pageSettingsRos(Object type) {
319 | return Intl.select(
320 | type,
321 | {
322 | 'title': 'Ros configuration',
323 | 'desc': 'Ros web config of main and current device',
324 | },
325 | name: 'pageSettingsRos',
326 | desc: '',
327 | args: [type],
328 | );
329 | }
330 |
331 | /// `Main server (ip)`
332 | String get pageSettingsRosMain {
333 | return Intl.message(
334 | 'Main server (ip)',
335 | name: 'pageSettingsRosMain',
336 | desc: '',
337 | args: [],
338 | );
339 | }
340 |
341 | /// `This device (ip)`
342 | String get pageSettingsRosDevice {
343 | return Intl.message(
344 | 'This device (ip)',
345 | name: 'pageSettingsRosDevice',
346 | desc: '',
347 | args: [],
348 | );
349 | }
350 |
351 | /// `Odometry`
352 | String get pageSettingsRosOdom {
353 | return Intl.message(
354 | 'Odometry',
355 | name: 'pageSettingsRosOdom',
356 | desc: '',
357 | args: [],
358 | );
359 | }
360 |
361 | /// `Camera`
362 | String get pageSettingsRosCamera {
363 | return Intl.message(
364 | 'Camera',
365 | name: 'pageSettingsRosCamera',
366 | desc: '',
367 | args: [],
368 | );
369 | }
370 |
371 | /// `Battery`
372 | String get pageSettingsRosBattery {
373 | return Intl.message(
374 | 'Battery',
375 | name: 'pageSettingsRosBattery',
376 | desc: '',
377 | args: [],
378 | );
379 | }
380 |
381 | /// `Linear / angular velocity`
382 | String get pageSettingsRosVelocity {
383 | return Intl.message(
384 | 'Linear / angular velocity',
385 | name: 'pageSettingsRosVelocity',
386 | desc: '',
387 | args: [],
388 | );
389 | }
390 |
391 | /// `Map`
392 | String get pageSettingsRosMap {
393 | return Intl.message(
394 | 'Map',
395 | name: 'pageSettingsRosMap',
396 | desc: '',
397 | args: [],
398 | );
399 | }
400 |
401 | /// `Navigation / Goal`
402 | String get pageSettingsRosNavigation {
403 | return Intl.message(
404 | 'Navigation / Goal',
405 | name: 'pageSettingsRosNavigation',
406 | desc: '',
407 | args: [],
408 | );
409 | }
410 |
411 | /// `Chatter`
412 | String get pageSettingsRosChatter {
413 | return Intl.message(
414 | 'Chatter',
415 | name: 'pageSettingsRosChatter',
416 | desc: '',
417 | args: [],
418 | );
419 | }
420 |
421 | /// `About`
422 | String get pageSettingsAbout {
423 | return Intl.message(
424 | 'About',
425 | name: 'pageSettingsAbout',
426 | desc: '',
427 | args: [],
428 | );
429 | }
430 |
431 | /// `Add new marker`
432 | String get creatorAddNew {
433 | return Intl.message(
434 | 'Add new marker',
435 | name: 'creatorAddNew',
436 | desc: '',
437 | args: [],
438 | );
439 | }
440 |
441 | /// `Edit marker`
442 | String get creatorEdit {
443 | return Intl.message(
444 | 'Edit marker',
445 | name: 'creatorEdit',
446 | desc: '',
447 | args: [],
448 | );
449 | }
450 |
451 | /// `Name`
452 | String get creatorName {
453 | return Intl.message(
454 | 'Name',
455 | name: 'creatorName',
456 | desc: '',
457 | args: [],
458 | );
459 | }
460 |
461 | /// `Hue`
462 | String get creatorHue {
463 | return Intl.message(
464 | 'Hue',
465 | name: 'creatorHue',
466 | desc: '',
467 | args: [],
468 | );
469 | }
470 | }
471 |
472 | class AppLocalizationDelegate extends LocalizationsDelegate {
473 | const AppLocalizationDelegate();
474 |
475 | List get supportedLocales {
476 | return const [
477 | Locale.fromSubtags(languageCode: 'en'),
478 | Locale.fromSubtags(languageCode: 'pl'),
479 | ];
480 | }
481 |
482 | @override
483 | bool isSupported(Locale locale) => _isSupported(locale);
484 | @override
485 | Future load(Locale locale) => S.load(locale);
486 | @override
487 | bool shouldReload(AppLocalizationDelegate old) => false;
488 |
489 | bool _isSupported(Locale locale) {
490 | if (locale != null) {
491 | for (var supportedLocale in supportedLocales) {
492 | if (supportedLocale.languageCode == locale.languageCode) {
493 | return true;
494 | }
495 | }
496 | }
497 | return false;
498 | }
499 | }
--------------------------------------------------------------------------------
/lib/l10n/intl_en.arb:
--------------------------------------------------------------------------------
1 | {
2 | "tooltipStopActions": "Stop actions",
3 | "tooltipRefreshConnection": "Refresh connection",
4 | "tooltipSettings": "Settings",
5 | "tooltipChatMode": "Text input",
6 | "tooltipChatStar": "Quick Replies",
7 | "tooltipRandom": "Random name",
8 | "tooltipCurrentLocation": "Current robot location",
9 | "tooltipCoordinates": "Coordinates",
10 | "pageChatTitle": "Chat",
11 | "pageChatTexting": "Order",
12 | "pageChatRecording": "Recording",
13 | "pageChatIntroTitle": "Hello",
14 | "pageChatIntroBody": "Try to talk with voice assistant to issue commands. To begin:",
15 | "pageChatIntroAction1": "Click text icon or order field",
16 | "pageChatIntroAction2": "Hold mic icon",
17 | "pageControllerTitle": "Controller",
18 | "pageControllerInfoTitle": "Waiting for cammera topic",
19 | "pageMapTitle": "Map",
20 | "pageMapInfoTitle": "Waiting for map topic",
21 | "pageMapButtonGrid": "Show / hide grid",
22 | "pageMapButtonFloating": "Add new map marker",
23 | "pageMapInitialRooms": "{room, select, kitchen {Kitchen} livingRoom {Living room} bedroom {Bedroom} bathroom {Bathroom}",
24 | "pageSettingsTitle": "Settings",
25 | "pageSettingsGeneral": "{type, select, title {App settings} desc {General settings & accessibility}}",
26 | "pageSettingsThemes": "{theme, select, light {Light theme} dark {Dark theme} system {System theme}}",
27 | "pageSettingsAnimations": "{type, select, title {Limit animations} desc {Changes how lists and messages animate}}",
28 | "pageSettingsButtonsDesc": "{type, select, title {Button labels} desc {Show additional labels under buttons}}",
29 | "pageSettingsRos": "{type, select, title {Ros configuration} desc {Ros web config of main and current device}}",
30 | "pageSettingsRosMain": "Main server (ip)",
31 | "pageSettingsRosDevice": "This device (ip)",
32 | "pageSettingsRosOdom": "Odometry",
33 | "pageSettingsRosCamera": "Camera",
34 | "pageSettingsRosBattery": "Battery",
35 | "pageSettingsRosVelocity": "Linear / angular velocity",
36 | "pageSettingsRosMap": "Map",
37 | "pageSettingsRosNavigation": "Navigation / Goal",
38 | "pageSettingsRosChatter": "Chatter",
39 | "pageSettingsAbout": "About",
40 | "creatorAddNew": "Add new marker",
41 | "creatorEdit": "Edit marker",
42 | "creatorName": "Name",
43 | "creatorHue": "Hue"
44 | }
--------------------------------------------------------------------------------
/lib/l10n/intl_pl.arb:
--------------------------------------------------------------------------------
1 | {
2 | "tooltipStopActions": "Zatrzymaj akcje robota",
3 | "tooltipRefreshConnection": "Odśwież połączenie",
4 | "tooltipSettings": "Ustawienia",
5 | "tooltipChatMode": "Polecenie tekstowe",
6 | "tooltipChatStar": "Szybkie odpowiedzi",
7 | "tooltipRandom": "Wylosuj nazwę",
8 | "tooltipCurrentLocation": "Aktualne położenie robota",
9 | "tooltipCoordinates": "Ręczne koordynaty",
10 | "pageChatTitle": "Chat",
11 | "pageChatTexting": "Polecenie",
12 | "pageChatRecording": "Nagrywam...",
13 | "pageChatIntroTitle": "Hello",
14 | "pageChatIntroBody": "Try to talk with voice assistant to issue commands. To begin:",
15 | "pageChatIntroAction1": "Click text icon or order field",
16 | "pageChatIntroAction2": "Hold mic icon",
17 | "pageControllerTitle": "Controller",
18 | "pageControllerInfoTitle": "Czekam na obraz z kamery",
19 | "pageMapTitle": "Mapa",
20 | "pageMapInfoTitle": "Czekam na obraz mapy",
21 | "pageMapButtonGrid": "Pokaż / ukryj siatkę",
22 | "pageMapButtonFloating": "Utwórz nowy znacznik lokalizacyjny",
23 | "pageMapInitialRooms": "{room, select, kitchen {Kitchen} livingRoom {Living room} bedroom {Bedroom} bathroom {Bathroom}",
24 | "pageSettingsTitle": "Ustawienia",
25 | "pageSettingsGeneral": "{type, select, title {Ustawienia aplikacji} desc {Ogólne ustawienia i opcje dostępu}}",
26 | "pageSettingsThemes": "{theme, select, light {Jasny motyw} dark {Ciemny motyw} system {Systemowy motyw}}",
27 | "pageSettingsAnimations": "{type, select, title {Ogranicz animacje} desc {Zmienia zachowanie list, wiadomości}}",
28 | "pageSettingsButtonsDesc": "{type, select, title {Podpisy przycisków} desc {Dodaje podpisy pod przyciskami nawigacji}}",
29 | "pageSettingsRos": "{type, select, title {Konfiguracja ROS} desc {Konfiguracja sieciowa ROS, należy wprowadzić adres urządzenia roscore i adres ip aktualnego urządzenia}}",
30 | "pageSettingsRosMain": "Główny serwer (ip)",
31 | "pageSettingsRosDevice": "To urządzenie (ip)",
32 | "pageSettingsRosOdom": "Odometria robota",
33 | "pageSettingsRosCamera": "Kamera",
34 | "pageSettingsRosBattery": "Bateria",
35 | "pageSettingsRosVelocity": "Prędkość liniowa / kątowa silników",
36 | "pageSettingsRosMap": "Mapa",
37 | "pageSettingsRosNavigation": "Nawigacja / Cel",
38 | "pageSettingsRosChatter": "Chatter",
39 | "pageSettingsAbout": "O aplikacji",
40 | "creatorAddNew": "Dodaj nowy znacznik",
41 | "creatorEdit": "Edytuj znacznik",
42 | "creatorName": "Nazwa",
43 | "creatorHue": "Barwa"
44 | }
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'dart:async';
3 |
4 | import 'generated/l10n.dart';
5 |
6 | import 'package:flutter_localizations/flutter_localizations.dart';
7 | import 'package:chatapp/providers/AppStateProvider.dart';
8 | import 'package:chatapp/providers/AudioProvider.dart';
9 | import 'package:chatapp/providers/ChatInfoProvider.dart';
10 | import 'package:chatapp/providers/DialogflowProvider.dart';
11 | import 'package:chatapp/providers/RosProvider.dart';
12 | import 'package:chatapp/providers/SettingsProvider.dart';
13 | import 'package:chatapp/screens/MainPage.dart';
14 | import 'package:flutter/material.dart';
15 | import 'package:flutter/services.dart';
16 | import 'package:path_provider/path_provider.dart';
17 | import 'package:provider/provider.dart';
18 |
19 | void main() {
20 | WidgetsFlutterBinding.ensureInitialized();
21 | runApp(MultiProvider(providers: [
22 | ChangeNotifierProvider(create: (_) => SettingsProvider()),
23 | ChangeNotifierProvider(create: (_) => ChatInfoProvider()),
24 | ChangeNotifierProvider(create: (_) => DialogflowProvider()),
25 | ChangeNotifierProvider(create: (_) => AudioProvider()),
26 | ChangeNotifierProvider(create: (_) => AppStateProvider()),
27 | ChangeNotifierProvider(create: (_) => RosProvider()),
28 | ], child: MyApp()));
29 | }
30 |
31 | class MyApp extends StatefulWidget {
32 | @override
33 | _MyAppState createState() => _MyAppState();
34 | }
35 |
36 | class _MyAppState extends State {
37 | Future applicationLoaded;
38 |
39 | @override
40 | void didChangeDependencies() {
41 | super.didChangeDependencies();
42 | applicationLoaded = configureApplication(context);
43 | }
44 |
45 | Future configureApplication(BuildContext context) {
46 | // SystemChrome.setEnabledSystemUIOverlays(
47 | // [SystemUiOverlay.top, SystemUiOverlay.bottom]);
48 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
49 | systemNavigationBarColor: Colors.transparent,
50 | statusBarColor: Colors.transparent));
51 |
52 | //Get local storage initialized - for saved waypoints locations
53 | Provider.of(context, listen: false)
54 | .localStorageInitialize();
55 |
56 | return Future.wait([
57 | //Get shared preferences intialized
58 | Provider.of(context, listen: false).prefsInitialize(),
59 | getTemporaryDirectory().then((dir) async {
60 | dir = Directory(dir.path + '/recordings');
61 | if (await dir.exists()) {
62 | await dir.delete(recursive: true);
63 | }
64 | await dir.create();
65 | }),
66 | ]);
67 | }
68 |
69 | @override
70 | Widget build(BuildContext context) {
71 | return FutureBuilder(
72 | future: applicationLoaded,
73 | builder: (context, snapshot) {
74 | if (snapshot.connectionState == ConnectionState.done) {
75 | return mainApp(context);
76 | } else {
77 | return loadingScreen(context);
78 | }
79 | },
80 | );
81 | }
82 |
83 | Widget loadingScreen(BuildContext context) {
84 | return MaterialApp(
85 | home: Container(),
86 | );
87 | }
88 |
89 | Widget mainApp(BuildContext context) {
90 | return MaterialApp(
91 | localizationsDelegates: [
92 | S.delegate,
93 | GlobalMaterialLocalizations.delegate,
94 | GlobalWidgetsLocalizations.delegate,
95 | GlobalCupertinoLocalizations.delegate,
96 | ],
97 | supportedLocales: S.delegate.supportedLocales,
98 | debugShowCheckedModeBanner: false,
99 | title: 'Voice App',
100 | themeMode: Provider.of(context, listen: true).appTheme,
101 | theme: ThemeData(
102 | brightness: Brightness.light,
103 | // primaryColor: Colors.blueAccent[300],
104 | primaryColor: Colors.white,
105 | secondaryHeaderColor: Colors.blue[50],
106 | canvasColor: Color.fromRGBO(245, 245, 245, 1),
107 | appBarTheme: AppBarTheme(elevation: 0),
108 | backgroundColor: Color.fromRGBO(240, 240, 240, 1),
109 |
110 | // accentColor: Colors.lightBlueAccent[400],
111 | accentColor: Colors.amber[200],
112 | textSelectionHandleColor: Colors.amber,
113 |
114 | scaffoldBackgroundColor: Colors.white,
115 | chipTheme: ThemeData.light()
116 | .chipTheme
117 | .copyWith(backgroundColor: Color.fromRGBO(230, 230, 230, 1)),
118 | ),
119 | // darkTheme: ThemeData(
120 | // brightness: Brightness.dark,
121 | // primaryColor: Color.fromRGBO(60, 60, 60, 1),
122 | // accentColor: Colors.cyan,
123 | // scaffoldBackgroundColor: Color.fromRGBO(80, 80, 80, 1),
124 | // textSelectionHandleColor: Colors.cyanAccent,
125 | // ),
126 | darkTheme: ThemeData(
127 | brightness: Brightness.dark,
128 | // primaryColor: Color.fromRGBO(60, 60, 60, 1),
129 | // scaffoldBackgroundColor: Color.fromRGBO(80, 80, 80, 1),
130 | // textSelectionHandleColor: Colors.cyanAccent,
131 | primaryColor: Color.fromRGBO(40, 40, 40, 1),
132 | canvasColor: Color.fromRGBO(60, 60, 60, 1),
133 | scaffoldBackgroundColor: Color.fromRGBO(40, 40, 40, 1),
134 | backgroundColor: Color.fromRGBO(50, 50, 50, 1),
135 | appBarTheme: AppBarTheme(elevation: 0),
136 | accentColor: Colors.cyan,
137 | textSelectionHandleColor: Colors.cyan,
138 | chipTheme: ThemeData.dark()
139 | .chipTheme
140 | .copyWith(backgroundColor: Color.fromRGBO(50, 50, 50, 1)),
141 | ),
142 |
143 | home: MainPage(),
144 | // initialRoute: '/',
145 | // routes: {
146 | // '/': (context) => ChatPage(),
147 | // },
148 | );
149 | }
150 | }
151 |
--------------------------------------------------------------------------------
/lib/models/ListExtension.dart:
--------------------------------------------------------------------------------
1 | extension ListExtension on List {
2 | List insertEveryNth(T item, {int insertOffset = 2}) {
3 | assert(insertOffset > 1);
4 |
5 | var listLength = length + (length / (insertOffset - 1)).floor();
6 | var returnList = List(listLength);
7 | var listIterator = iterator;
8 |
9 | for (var i = 0; i < listLength; ++i) {
10 | if (i % insertOffset != insertOffset - 1 && listIterator.moveNext()) {
11 | returnList[i] = listIterator.current;
12 | } else {
13 | returnList[i] = item;
14 | }
15 | }
16 |
17 | return returnList;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/models/Message.dart:
--------------------------------------------------------------------------------
1 | import 'package:audio_recorder/audio_recorder.dart';
2 | import 'package:chatapp/providers/DialogflowProvider.dart';
3 | import 'package:flutter/widgets.dart';
4 |
5 | enum Sender { user, system, bot }
6 |
7 | class IconWithDescription {
8 | final Function onTap;
9 | final IconData icon;
10 | final String description;
11 |
12 | IconWithDescription({this.onTap, this.icon, this.description})
13 | : assert(onTap != null),
14 | assert(icon != null),
15 | assert(description != null);
16 | }
17 |
18 | class Message {
19 | final String heading;
20 |
21 | // If message has no heading or description, fill body only;
22 | String body;
23 | List actions;
24 |
25 | final Sender sender;
26 | final DateTime timestamp;
27 | final CustomAIResponse aiResponse;
28 | final Recording voiceActing;
29 |
30 | Message({
31 | this.heading,
32 | this.body,
33 | this.actions,
34 | this.sender,
35 | DateTime timestamp,
36 | this.aiResponse,
37 | this.voiceActing,
38 | }) : this.timestamp = timestamp ?? DateTime.now();
39 | }
40 |
--------------------------------------------------------------------------------
/lib/models/NavMsgsOccupancyGridExtension.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'dart:typed_data';
3 | import 'dart:ui';
4 |
5 | import 'package:flutter/material.dart';
6 | import 'package:ros_nodes/messages/nav_msgs/OccupancyGrid.dart';
7 |
8 | extension CallMeBritney on NavMsgsOccupancyGrid {
9 | Uint8List toRGBA({@required Color border, @required Color fill}) {
10 | var buffor = BytesBuilder();
11 | for (var value in data) {
12 | switch (value) {
13 | case -1:
14 | {
15 | buffor.add([0, 0, 0, 0]);
16 | break;
17 | }
18 | case 0:
19 | {
20 | buffor.add([fill.red, fill.green, fill.blue, fill.alpha]);
21 | break;
22 | }
23 | default:
24 | {
25 | buffor.add([border.red, border.green, border.blue, border.alpha]);
26 | break;
27 | }
28 | }
29 | }
30 | return buffor.takeBytes();
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/lib/models/StringExtension.dart:
--------------------------------------------------------------------------------
1 | extension StringExtension on String {
2 | String capitalize() {
3 | return "${this[0].toUpperCase()}${this.substring(1)}";
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/lib/models/Waypoint.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | class Waypoint {
4 | String name;
5 | Color color;
6 | double x;
7 | double y;
8 | double radius;
9 |
10 | Waypoint({this.name, this.color, this.x, this.y, this.radius = 0.0});
11 |
12 | toJSONEencodable() {
13 | Map encoded = Map();
14 |
15 | encoded['name'] = name;
16 | encoded['color'] = color;
17 | encoded['x'] = x;
18 | encoded['y'] = y;
19 | encoded['radius'] = radius;
20 |
21 | return encoded;
22 | }
23 | }
24 |
25 | class WaypointList {
26 | List waypoints;
27 |
28 | WaypointList(this.waypoints);
29 |
30 | toJSONEencodable() {
31 | return waypoints.map((item) {
32 | return item.toJSONEencodable();
33 | }).toList();
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/lib/providers/AppStateProvider.dart:
--------------------------------------------------------------------------------
1 | import 'package:chatapp/generated/l10n.dart';
2 | import 'package:chatapp/screens/ChatPage.dart';
3 | import 'package:chatapp/screens/ControllerPage.dart';
4 | import 'package:chatapp/screens/MapPage.dart';
5 | import 'package:flutter/cupertino.dart';
6 |
7 | class AppStateProvider extends ChangeNotifier {
8 | var _activePageIndex = 0;
9 | static const _appPages = [ChatPage(), ControllerPage(), MapPage()];
10 |
11 | var _navigationBarPageController =
12 | PageController(initialPage: 0, keepPage: true);
13 |
14 | void setActivePage(int index) {
15 | if (index != _activePageIndex) {
16 | _activePageIndex = index;
17 | // Navigation with PagedView
18 | // if (WidgetsBinding.instance.disableAnimations) {
19 | // _navigationBarPageController.jumpToPage(index);
20 | // } else {
21 | // _navigationBarPageController.animateToPage(index,
22 | // duration: Duration(milliseconds: 400), curve: Curves.easeOutQuad);
23 | // }
24 | notifyListeners();
25 | }
26 | }
27 |
28 | int get activePageIndex => _activePageIndex;
29 | PageController get navigationBarPageController =>
30 | _navigationBarPageController;
31 | List get appPages => _appPages;
32 | }
33 |
--------------------------------------------------------------------------------
/lib/providers/AudioProvider.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 | import 'dart:io';
3 |
4 | import 'package:audio_recorder/audio_recorder.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:path_provider/path_provider.dart';
7 | import 'package:uuid/uuid.dart';
8 | import 'package:soundpool/soundpool.dart';
9 |
10 | //Recording and playing sounds
11 | class AudioProvider extends ChangeNotifier {
12 | final bubbleMessagePool = Soundpool();
13 |
14 | //Split into play/pause/stop?
15 | Future playBubbleUserMessageVoice(String path) async {
16 | bubbleMessagePool.release();
17 | final bubbleMessageContent = await File(path).readAsBytes();
18 | final soundId = await bubbleMessagePool.loadUint8List(bubbleMessageContent);
19 | bubbleMessagePool.play(soundId);
20 | }
21 |
22 | Future playBubbleBotMessageVoice(String audio) async {
23 | bubbleMessagePool.release();
24 | final soundId = await bubbleMessagePool.loadUint8List(base64Decode(audio));
25 | bubbleMessagePool.play(soundId);
26 | }
27 |
28 | //Updating recordID everytime new record is created
29 | Future getRecordingPath() async {
30 | var directory = await getTemporaryDirectory();
31 | return directory.path + '/recordings/' + Uuid().v1();
32 | }
33 |
34 | bool _hasPermission = true;
35 | bool get hasPermission => _hasPermission;
36 | Future _checkPermission() async {
37 | _hasPermission = await AudioRecorder.hasPermissions;
38 | return _hasPermission;
39 | }
40 |
41 | bool _isRecording = false;
42 | bool get isRecording => _isRecording;
43 |
44 | Future start() async {
45 | if (!await _checkPermission()) return;
46 |
47 | var path = await getRecordingPath();
48 | print(path);
49 | print("started!!!!!!!!");
50 | await AudioRecorder.start(
51 | path: path, audioOutputFormat: AudioOutputFormat.WAV);
52 | _isRecording = await AudioRecorder.isRecording;
53 | notifyListeners();
54 | }
55 |
56 | Future stop() async {
57 | var recorrding = await AudioRecorder.stop();
58 | _isRecording = await AudioRecorder.isRecording;
59 | notifyListeners();
60 |
61 | return recorrding;
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/lib/providers/ChatInfoProvider.dart:
--------------------------------------------------------------------------------
1 | import 'package:chatapp/generated/l10n.dart';
2 | import 'package:chatapp/models/Message.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter/scheduler.dart';
5 | import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
6 |
7 | class ChatInfoProvider extends ChangeNotifier {
8 | //favorite shelf
9 | var _favoriteShelfOpen = true;
10 | void toggleFavoriteShelf() {
11 | _favoriteShelfOpen = !_favoriteShelfOpen;
12 | notifyListeners();
13 | }
14 |
15 | var _listKey = GlobalKey();
16 | List _messages = [
17 | Message(
18 | heading: "Hello",
19 | body:
20 | 'Voice and chat commands are disabled by default in this app version. You can issue commands in controller and map pages. Your actions will show below',
21 | sender: Sender.system,
22 | actions: [
23 | // IconWithDescription(
24 | // onTap: () {
25 | // print('aaa');
26 | // },
27 | // icon: MdiIcons.textShort,
28 | // description:
29 | // 'Naciśnij ikonę tekstu lub kliknij pole "Polecenie"'),
30 | // IconWithDescription(
31 | // onTap: () {
32 | // print('aaa');
33 | // },
34 | // icon: Icons.mic,
35 | // description:
36 | // 'Trzymaj ikonę mikrofonu aby nagrać wiadomość głosową'),
37 | ])
38 | ];
39 |
40 | var _controller = TextEditingController();
41 | var _isControllerEmpty = true;
42 |
43 | ChatInfoProvider() : super() {
44 | _controller.addListener(_textUpdate);
45 | }
46 |
47 | void clearController() {
48 | SchedulerBinding.instance.addPostFrameCallback((_) {
49 | _controller.clear();
50 | });
51 | }
52 |
53 | void _textUpdate() {
54 | if (_isControllerEmpty != _controller.text.isEmpty) {
55 | _isControllerEmpty = _controller.text.isEmpty;
56 | notifyListeners();
57 | }
58 | }
59 |
60 | void addMessage({@required Message message}) {
61 | if (_listKey.currentWidget != null) {
62 | print("Animowanie");
63 | _listKey.currentState.insertItem(_messages.length,
64 | duration: const Duration(milliseconds: 150));
65 | clearController();
66 | }
67 | _messages.add(message);
68 | notifyListeners();
69 | }
70 |
71 | // Works as speech to text from dialogflow
72 | void updateLastVoiceMessageDescription(String description) {
73 | if (_messages[_messages.length - 2].body ==
74 | "Wiadomość głosowa bez transkrypcji") {
75 | _messages[_messages.length - 2].body = description;
76 | notifyListeners();
77 | }
78 | }
79 |
80 | bool get favoriteShelfOpen => _favoriteShelfOpen;
81 | bool get isControllerEmpty => _isControllerEmpty;
82 | TextEditingController get chatTextController => _controller;
83 | GlobalKey get listKey => _listKey;
84 | List get messages => _messages;
85 | }
86 |
--------------------------------------------------------------------------------
/lib/providers/DialogflowProvider.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 | import 'dart:core';
3 | import 'dart:io';
4 |
5 | import 'package:flutter/material.dart';
6 | import 'package:flutter_dialogflow/dialogflow_v2.dart';
7 |
8 | //audiotesting
9 |
10 | import 'package:soundpool/soundpool.dart';
11 |
12 | extension MapExtensions on Map {
13 | Map getMap(K key) {
14 | var keyFound = this.containsKey(key);
15 | if (!keyFound) {
16 | return null;
17 | }
18 |
19 | var value = this[key];
20 | if (value is Map) {
21 | return value;
22 | }
23 | return null;
24 | }
25 |
26 | V getValue(K key) => this[key];
27 | }
28 |
29 | class CustomAIResponse extends AIResponse {
30 | List