├── .fvmrc
├── .github
└── file
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── org
│ │ │ │ └── thingsboard
│ │ │ │ └── app
│ │ │ │ ├── KeepAliveService.kt
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── TbWebAuthHandler.kt
│ │ │ │ └── TbWebCallbackActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── launcher_icon.png
│ │ │ └── thingsboard.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── launcher_icon.png
│ │ │ └── thingsboard.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── launcher_icon.png
│ │ │ └── thingsboard.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── launcher_icon.png
│ │ │ └── thingsboard.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── launcher_icon.png
│ │ │ └── thingsboard.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ ├── values
│ │ │ └── styles.xml
│ │ │ └── xml
│ │ │ ├── network_security_config.xml
│ │ │ └── provider_paths.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── settings.gradle
└── settings_aar.gradle
├── assets
└── images
│ ├── apple-logo.svg
│ ├── connect_mobile.svg
│ ├── dashboard-placeholder.svg
│ ├── device-not-connected.svg
│ ├── device-profile-placeholder.svg
│ ├── device_not_found.svg
│ ├── facebook-logo.svg
│ ├── github-logo.svg
│ ├── google-logo.svg
│ ├── mobile-connection-error.svg
│ ├── no-data.svg
│ ├── provisioning-done.svg
│ ├── provisioning.svg
│ ├── provisioning_error.svg
│ ├── qr_code_scanner.svg
│ ├── qr_code_scanner2.svg
│ ├── thingsboard.png
│ ├── thingsboard.svg
│ ├── thingsboard_big_logo.svg
│ ├── thingsboard_center.svg
│ ├── thingsboard_outer.svg
│ └── thingsboard_with_title.svg
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── 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-Debug.plist
│ ├── Info-Release.plist
│ ├── Runner-Bridging-Header.h
│ ├── Runner.entitlements
│ └── TbWebAuthHandler.swift
├── l10n.yaml
├── lib
├── app_bloc_observer.dart
├── config
│ ├── routes
│ │ └── router.dart
│ └── themes
│ │ └── tb_theme.dart
├── constants
│ ├── app_constants.dart
│ ├── assets_path.dart
│ ├── database_keys.dart
│ ├── enviroment_variables.dart
│ └── hive_type_adapter_ids.dart
├── core
│ ├── auth
│ │ ├── auth_routes.dart
│ │ ├── login
│ │ │ ├── bloc
│ │ │ │ ├── auth_bloc.dart
│ │ │ │ ├── auth_events.dart
│ │ │ │ ├── auth_states.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── choose_region_screen.dart
│ │ │ ├── login_page.dart
│ │ │ ├── login_page_background.dart
│ │ │ ├── region.dart
│ │ │ ├── region.g.dart
│ │ │ ├── region_widget.dart
│ │ │ ├── reset_password_request_page.dart
│ │ │ ├── select_region_screen.dart
│ │ │ └── two_factor_authentication_page.dart
│ │ ├── noauth
│ │ │ ├── data
│ │ │ │ ├── datasource
│ │ │ │ │ └── remote
│ │ │ │ │ │ ├── i_noauth_remote_datasource.dart
│ │ │ │ │ │ └── noauth_remote_datasource.dart
│ │ │ │ └── repository
│ │ │ │ │ └── noauth_repository.dart
│ │ │ ├── di
│ │ │ │ └── noauth_di.dart
│ │ │ ├── domain
│ │ │ │ ├── repository
│ │ │ │ │ └── i_noauth_repository.dart
│ │ │ │ └── usecases
│ │ │ │ │ └── switch_endpoint_usecase.dart
│ │ │ ├── presentation
│ │ │ │ ├── bloc
│ │ │ │ │ ├── bloc.dart
│ │ │ │ │ ├── noauth_bloc.dart
│ │ │ │ │ ├── noauth_events.dart
│ │ │ │ │ └── noauth_states.dart
│ │ │ │ ├── view
│ │ │ │ │ └── switch_endpoint_noauth_view.dart
│ │ │ │ └── widgets
│ │ │ │ │ ├── endpoint_name_widget.dart
│ │ │ │ │ └── noauth_loading_widget.dart
│ │ │ └── routes
│ │ │ │ └── noauth_routes.dart
│ │ ├── oauth2
│ │ │ ├── app_secret_provider.dart
│ │ │ └── tb_oauth2_client.dart
│ │ └── web
│ │ │ └── tb_web_auth.dart
│ ├── context
│ │ ├── has_tb_context.dart
│ │ ├── tb_context.dart
│ │ └── tb_context_widget.dart
│ ├── entity
│ │ ├── entities_base.dart
│ │ ├── entities_grid.dart
│ │ ├── entities_list.dart
│ │ ├── entities_list_widget.dart
│ │ ├── entity_details_page.dart
│ │ ├── entity_grid_card.dart
│ │ └── entity_list_card.dart
│ ├── init
│ │ ├── init_app.dart
│ │ ├── init_routes.dart
│ │ └── inti_region_app.dart
│ ├── logger
│ │ ├── tb_log_output.dart
│ │ ├── tb_logger.dart
│ │ └── tb_logs_filter.dart
│ └── usecases
│ │ └── user_details_usecase.dart
├── firebase_options.dart
├── l10n
│ ├── intl_ar.arb
│ ├── intl_en.arb
│ ├── intl_zh.arb
│ ├── intl_zh_CN.arb
│ └── intl_zh_TW.arb
├── locator.dart
├── main.dart
├── modules
│ ├── alarm
│ │ ├── alarm_routes.dart
│ │ ├── alarms_base.dart
│ │ ├── alarms_list.dart
│ │ ├── data
│ │ │ ├── datasource
│ │ │ │ ├── alarm_types
│ │ │ │ │ ├── alarm_types_datasource.dart
│ │ │ │ │ └── i_alarm_types_datasource.dart
│ │ │ │ ├── alarms
│ │ │ │ │ ├── alarms_datasource.dart
│ │ │ │ │ └── i_alarms_datasource.dart
│ │ │ │ ├── assignee
│ │ │ │ │ ├── assignee_datasource.dart
│ │ │ │ │ └── i_assignee_datasource.dart
│ │ │ │ └── details
│ │ │ │ │ ├── alarm_details_datasource.dart
│ │ │ │ │ └── i_alarm_details_datasource.dart
│ │ │ └── repository
│ │ │ │ ├── alarm_types
│ │ │ │ └── alarm_types_repository.dart
│ │ │ │ ├── alarms
│ │ │ │ └── alarms_repository.dart
│ │ │ │ ├── assignee
│ │ │ │ └── assignee_repository.dart
│ │ │ │ └── details
│ │ │ │ └── alarm_details_repository.dart
│ │ ├── di
│ │ │ ├── alarm_details_di.dart
│ │ │ ├── alarm_types_di.dart
│ │ │ ├── alarms_di.dart
│ │ │ └── assignee_di.dart
│ │ ├── domain
│ │ │ ├── entities
│ │ │ │ ├── alarm_comment_entity.dart
│ │ │ │ ├── alarm_filters_entity.dart
│ │ │ │ ├── assignee_entity.dart
│ │ │ │ └── filter_data_entity.dart
│ │ │ ├── pagination
│ │ │ │ ├── activity
│ │ │ │ │ ├── alarm_activity_pagination_repository.dart
│ │ │ │ │ └── alarm_activity_query_ctrl.dart
│ │ │ │ ├── alarm_types
│ │ │ │ │ ├── alarm_types_pagination_repository.dart
│ │ │ │ │ └── alarm_types_query_ctrl.dart
│ │ │ │ ├── alarms
│ │ │ │ │ ├── alarms_pagination_repository.dart
│ │ │ │ │ └── alarms_query_ctrl.dart
│ │ │ │ └── assignee
│ │ │ │ │ ├── alarm_assignee_pagiation_repository.dart
│ │ │ │ │ ├── alarm_assignee_query_ctrl.dart
│ │ │ │ │ ├── assignee_pagination_repository.dart
│ │ │ │ │ └── assignee_query_ctrl.dart
│ │ │ ├── repository
│ │ │ │ ├── alarm_types
│ │ │ │ │ └── i_alarm_types_repository.dart
│ │ │ │ ├── alarms
│ │ │ │ │ └── i_alarms_repository.dart
│ │ │ │ ├── assignee
│ │ │ │ │ └── i_assigne_repository.dart
│ │ │ │ └── details
│ │ │ │ │ └── i_alarm_details_repository.dart
│ │ │ └── usecases
│ │ │ │ ├── alarm_types
│ │ │ │ └── fetch_alarm_types_usecase.dart
│ │ │ │ ├── alarms
│ │ │ │ ├── fetch_alarm_usecase.dart
│ │ │ │ └── fetch_alarms_usecase.dart
│ │ │ │ ├── assignee
│ │ │ │ ├── assign_alarm_usecase.dart
│ │ │ │ ├── fetch_alarm_assignee_usecase.dart
│ │ │ │ ├── fetch_assignee_usecase.dart
│ │ │ │ └── unassign_alarm_usecase.dart
│ │ │ │ └── details
│ │ │ │ ├── acknowledge_alarm_usecase.dart
│ │ │ │ ├── clear_alarm_usecase.dart
│ │ │ │ ├── delete_alarm_comment_usecase.dart
│ │ │ │ ├── fetch_alarm_comments_usecase.dart
│ │ │ │ └── post_alarm_comments_usecase.dart
│ │ └── presentation
│ │ │ ├── bloc
│ │ │ ├── activity
│ │ │ │ ├── alarm_activity_bloc.dart
│ │ │ │ ├── alarm_activity_events.dart
│ │ │ │ ├── alarm_activity_states.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── alarm_assignee
│ │ │ │ ├── alarm_assignee_bloc.dart
│ │ │ │ ├── alarm_assignee_event.dart
│ │ │ │ ├── alarm_assignee_state.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── alarm_details
│ │ │ │ ├── alarm_details_bloc.dart
│ │ │ │ ├── alarm_details_events.dart
│ │ │ │ ├── alarm_details_states.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── alarm_types
│ │ │ │ ├── alarm_types_bloc.dart
│ │ │ │ ├── alarm_types_event.dart
│ │ │ │ ├── alarm_types_state.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── alarms_bloc.dart
│ │ │ ├── alarms_events.dart
│ │ │ ├── alarms_states.dart
│ │ │ ├── assignee
│ │ │ │ ├── assignee_bloc.dart
│ │ │ │ ├── assignee_event.dart
│ │ │ │ ├── assignee_state.dart
│ │ │ │ └── bloc.dart
│ │ │ ├── bloc.dart
│ │ │ └── filters
│ │ │ │ ├── alarm_filters_service.dart
│ │ │ │ ├── filters
│ │ │ │ ├── alarm_assignee_filter.dart
│ │ │ │ ├── alarm_severity_filter.dart
│ │ │ │ ├── alarm_status_filter.dart
│ │ │ │ ├── alarm_type_filter.dart
│ │ │ │ └── i_alarm_filter.dart
│ │ │ │ └── i_alarm_filters_service.dart
│ │ │ ├── view
│ │ │ ├── alarm_details_page.dart
│ │ │ ├── alarms_filter_page.dart
│ │ │ ├── alarms_page.dart
│ │ │ └── alarms_search_page.dart
│ │ │ └── widgets
│ │ │ ├── activity
│ │ │ ├── activity_builder_widget.dart
│ │ │ ├── alarm_activity_widget.dart
│ │ │ ├── alarm_comment_textfield.dart
│ │ │ ├── alarm_edit_comment_textfield.dart
│ │ │ ├── system_activity_widget.dart
│ │ │ └── user_comment_widget.dart
│ │ │ ├── alarm_assignee
│ │ │ ├── alarm_assignee_list_widget.dart
│ │ │ └── alarm_assignee_widget.dart
│ │ │ ├── alarm_control_filters_button.dart
│ │ │ ├── alarm_filter_widget.dart
│ │ │ ├── alarm_types
│ │ │ ├── alarm_types_widget.dart
│ │ │ └── types_list_widget.dart
│ │ │ ├── alarms_card.dart
│ │ │ ├── assignee
│ │ │ ├── alarm_assignee_widget.dart
│ │ │ ├── assignee_list_widget.dart
│ │ │ ├── user_info_avatar_widget.dart
│ │ │ └── user_info_widget.dart
│ │ │ ├── details
│ │ │ ├── alarm_cotroll_buttons.dart
│ │ │ ├── alarm_details_content_widget.dart
│ │ │ ├── alarm_details_widget.dart
│ │ │ └── alarm_status_button.dart
│ │ │ ├── filter_toggle_block_widget.dart
│ │ │ └── tb_error_widget.dart
│ ├── asset
│ │ ├── asset_details_page.dart
│ │ ├── asset_routes.dart
│ │ ├── assets_base.dart
│ │ ├── assets_list.dart
│ │ ├── assets_list_widget.dart
│ │ └── assets_page.dart
│ ├── audit_log
│ │ ├── audit_log_details_page.dart
│ │ ├── audit_logs_base.dart
│ │ ├── audit_logs_list.dart
│ │ ├── audit_logs_page.dart
│ │ └── audit_logs_routes.dart
│ ├── customer
│ │ ├── customer_details_page.dart
│ │ ├── customer_routes.dart
│ │ ├── customers_base.dart
│ │ ├── customers_list.dart
│ │ └── customers_page.dart
│ ├── dashboard
│ │ ├── dashboard_routes.dart
│ │ ├── di
│ │ │ └── dashboards_di.dart
│ │ ├── domain
│ │ │ ├── entites
│ │ │ │ └── dashboard_arguments.dart
│ │ │ ├── pagination
│ │ │ │ ├── dashboards_pagination_repository.dart
│ │ │ │ └── dashboards_query_ctrl.dart
│ │ │ └── usecases
│ │ │ │ └── fetch_dashboards_usecase.dart
│ │ ├── main_dashboard_page.dart
│ │ └── presentation
│ │ │ ├── controller
│ │ │ ├── dashboard_controller.dart
│ │ │ └── dashboard_page_controller.dart
│ │ │ ├── view
│ │ │ ├── dashboards_page.dart
│ │ │ ├── fullscreen_dashboard_page.dart
│ │ │ ├── home_dashboard_page.dart
│ │ │ └── single_dashboard_view.dart
│ │ │ └── widgets
│ │ │ ├── dashboard_grid_card.dart
│ │ │ ├── dashboard_widget.dart
│ │ │ ├── dashboards_appbar.dart
│ │ │ └── dashboards_grid.dart
│ ├── device
│ │ ├── device_details_page.dart
│ │ ├── device_profiles_base.dart
│ │ ├── device_profiles_grid.dart
│ │ ├── device_routes.dart
│ │ ├── devices_base.dart
│ │ ├── devices_list.dart
│ │ ├── devices_list_page.dart
│ │ ├── devices_list_widget.dart
│ │ ├── devices_main_page.dart
│ │ ├── devices_page.dart
│ │ └── provisioning
│ │ │ ├── ble
│ │ │ ├── bloc
│ │ │ │ ├── bloc.dart
│ │ │ │ ├── eps_ble_provisioning_bloc.dart
│ │ │ │ ├── events.dart
│ │ │ │ └── states.dart
│ │ │ ├── di
│ │ │ │ └── esp_ble_di.dart
│ │ │ └── view
│ │ │ │ ├── ble_devices_empty_view.dart
│ │ │ │ ├── ble_devices_view.dart
│ │ │ │ ├── cannot_establish_session_view.dart
│ │ │ │ ├── eps_ble_provisioning_view.dart
│ │ │ │ └── esp_wifi_network_view.dart
│ │ │ ├── bloc
│ │ │ ├── bloc.dart
│ │ │ ├── device_provisioning_bloc.dart
│ │ │ ├── device_provisioning_events.dart
│ │ │ └── device_provisioning_states.dart
│ │ │ ├── route
│ │ │ └── esp_provisioning_route.dart
│ │ │ ├── soft_ap
│ │ │ ├── bloc
│ │ │ │ ├── bloc.dart
│ │ │ │ ├── esp_softap_bloc.dart
│ │ │ │ ├── esp_softap_events.dart
│ │ │ │ └── esp_softap_states.dart
│ │ │ ├── di
│ │ │ │ └── esp_softap_di.dart
│ │ │ └── view
│ │ │ │ ├── esp_softap_error_view.dart
│ │ │ │ ├── esp_softap_view.dart
│ │ │ │ └── widgets
│ │ │ │ ├── manually_connect_to_wifi.dart
│ │ │ │ └── wifi_list.dart
│ │ │ ├── view
│ │ │ ├── device_provisioning_done.dart
│ │ │ ├── device_provisioning_view.dart
│ │ │ └── states
│ │ │ │ ├── claiming_error.dart
│ │ │ │ ├── claiming_wip.dart
│ │ │ │ ├── confirming_wifi_connection.dart
│ │ │ │ ├── connection_state_row.dart
│ │ │ │ ├── manually_reconnect_to_wifi.dart
│ │ │ │ ├── provision_error.dart
│ │ │ │ ├── provision_states.dart
│ │ │ │ ├── provision_success.dart
│ │ │ │ └── sending_wifi_credentials.dart
│ │ │ └── widgets
│ │ │ ├── dotted_point_widget.dart
│ │ │ ├── enter_password_dialog.dart
│ │ │ ├── exit_confirmation_dialog.dart
│ │ │ ├── help_message_widget.dart
│ │ │ ├── return_to_dashboard_button.dart
│ │ │ ├── scan_list_widget.dart
│ │ │ └── try_again_button.dart
│ ├── home
│ │ ├── home_page.dart
│ │ └── home_routes.dart
│ ├── layout_pages
│ │ └── bloc
│ │ │ ├── bloc.dart
│ │ │ ├── layout_pages_bloc.dart
│ │ │ ├── layout_pages_event.dart
│ │ │ └── layout_pages_state.dart
│ ├── main
│ │ ├── main_item_widget.dart
│ │ ├── main_navigation_item.dart
│ │ ├── main_page.dart
│ │ ├── main_routes.dart
│ │ └── tb_navigation_bar_widget.dart
│ ├── more
│ │ ├── more_menu_item_widget.dart
│ │ ├── more_page.dart
│ │ └── more_routes.dart
│ ├── notification
│ │ ├── controllers
│ │ │ └── notification_query_ctrl.dart
│ │ ├── notification_page.dart
│ │ ├── repository
│ │ │ ├── i_notification_query_repository.dart
│ │ │ ├── notification_pagination_repository.dart
│ │ │ └── notification_repository.dart
│ │ ├── routes
│ │ │ └── notification_routes.dart
│ │ ├── service
│ │ │ ├── i_notifications_local_service.dart
│ │ │ └── notifications_local_service.dart
│ │ └── widgets
│ │ │ ├── filter_segmented_button.dart
│ │ │ ├── no_notifications_found_widget.dart
│ │ │ ├── notification_icon.dart
│ │ │ ├── notification_list.dart
│ │ │ ├── notification_slidable_widget.dart
│ │ │ └── notification_widget.dart
│ ├── profile
│ │ ├── change_password_page.dart
│ │ ├── profile_page.dart
│ │ └── profile_routes.dart
│ ├── tenant
│ │ ├── tenant_details_page.dart
│ │ ├── tenant_routes.dart
│ │ ├── tenants_base.dart
│ │ ├── tenants_list.dart
│ │ ├── tenants_page.dart
│ │ └── tenants_widget.dart
│ ├── url
│ │ ├── url_page.dart
│ │ └── url_routes.dart
│ └── version
│ │ ├── bloc
│ │ ├── bloc.dart
│ │ ├── version_info_bloc.dart
│ │ ├── version_info_events.dart
│ │ └── version_info_states.dart
│ │ ├── route
│ │ ├── version_route.dart
│ │ └── version_route_arguments.dart
│ │ └── view
│ │ ├── update_required_page.dart
│ │ └── widgets
│ │ ├── version_compare_widget.dart
│ │ ├── version_empty_widget.dart
│ │ └── version_single_widget.dart
├── thingsboard_app.dart
├── thingsboard_client.dart
├── utils
│ ├── services
│ │ ├── _tb_app_storage.dart
│ │ ├── _tb_secure_storage.dart
│ │ ├── _tb_web_local_storage.dart
│ │ ├── communication
│ │ │ ├── communication_service.dart
│ │ │ ├── events.dart
│ │ │ └── i_communication_service.dart
│ │ ├── device_profile_cache.dart
│ │ ├── endpoint
│ │ │ ├── endpoint_service.dart
│ │ │ └── i_endpoint_service.dart
│ │ ├── entity_query_api.dart
│ │ ├── firebase
│ │ │ ├── firebase_service.dart
│ │ │ └── i_firebase_service.dart
│ │ ├── layouts
│ │ │ ├── i_layout_service.dart
│ │ │ └── layout_service.dart
│ │ ├── local_database
│ │ │ ├── i_local_database_service.dart
│ │ │ └── local_database_service.dart
│ │ ├── notification_service.dart
│ │ ├── pagination_repository.dart
│ │ ├── provisioning
│ │ │ ├── eps_ble
│ │ │ │ ├── i_wifi_provisioning_service.dart
│ │ │ │ └── wifi_provisioning_service.dart
│ │ │ ├── esp_smartconfig
│ │ │ │ ├── esp_smartconfig_service.dart
│ │ │ │ └── i_esp_smartconfig_service.dart
│ │ │ └── soft_ap
│ │ │ │ ├── i_soft_ap_service.dart
│ │ │ │ └── soft_ap_service.dart
│ │ ├── tb_app_storage.dart
│ │ ├── user
│ │ │ ├── i_user_service.dart
│ │ │ └── user_service.dart
│ │ └── widget_action_handler.dart
│ ├── string_utils.dart
│ ├── transition
│ │ └── page_transitions.dart
│ ├── ui
│ │ ├── back_button_widget.dart
│ │ ├── pagination_list_widget.dart
│ │ ├── pagination_widgets
│ │ │ ├── first_page_exception_widget.dart
│ │ │ ├── first_page_progress_builder.dart
│ │ │ ├── new_page_progress_builder.dart
│ │ │ └── pagination_grid_widget.dart
│ │ ├── qr_code_scanner.dart
│ │ ├── tb_alert_dialog.dart
│ │ ├── tb_text_styles.dart
│ │ ├── text_extension.dart
│ │ └── ui_utils.dart
│ ├── ui_utils_routes.dart
│ ├── usecase.dart
│ └── utils.dart
└── widgets
│ ├── tb_app_bar.dart
│ ├── tb_progress_indicator.dart
│ ├── two_page_view.dart
│ └── two_value_listenable_builder.dart
├── pubspec.lock
├── pubspec.yaml
└── test
├── core
└── noauth
│ └── switch_endpoint_test.dart
└── mocks.dart
/.fvmrc:
--------------------------------------------------------------------------------
1 | {
2 | "flutter": "3.24.4"
3 | }
--------------------------------------------------------------------------------
/.github/file:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.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 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | # Android Studio will place build artifacts here
44 | /android/app/debug
45 | /android/app/profile
46 | /android/app/release
47 |
48 | # FVM Version Cache
49 | .fvm/
--------------------------------------------------------------------------------
/.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: adc687823a831bbebe28bdccfac1a628ca621513
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2021 The ThingsBoard Authors
2 |
3 | Redistribution and use in source and binary forms, with or without modification,
4 | are permitted provided that the following conditions are met:
5 |
6 | * Redistributions of source code must retain the above copyright
7 | notice, this list of conditions and the following disclaimer.
8 | * Redistributions in binary form must reproduce the above
9 | copyright notice, this list of conditions and the following
10 | disclaimer in the documentation and/or other materials provided
11 | with the distribution.
12 | * Neither the name of Google Inc. nor the names of its
13 | contributors may be used to endorse or promote products derived
14 | from this software without specific prior written permission.
15 |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## [ThingsBoard Mobile Application](https://thingsboard.io/products/mobile/) is an open-source project based on [Flutter](https://flutter.dev/)
2 | Powered by [ThingsBoard](https://thingsboard.io) IoT Platform
3 |
4 | Build your own IoT mobile application **with minimum coding efforts**
5 |
6 | ## Please be informed the Web platform is not supported, because it's a part of our main platform!
7 |
8 | ## Resources
9 |
10 | - [Getting started](https://thingsboard.io/docs/mobile/getting-started/) - learn how to set up and run your first IoT mobile app
11 | - [Customize your app](https://thingsboard.io/docs/mobile/customization/) - learn how to customize the app
12 | - [Publish your app](https://thingsboard.io/docs/mobile/release/) - learn how to publish app to Google Play or App Store
13 |
14 | ## Live demo app
15 |
16 | To be familiar with common app features try out our ThingsBoard Live mobile application available on Google Play and App Store
17 | - [Get it on Google Play](https://play.google.com/store/apps/details?id=org.thingsboard.demo.app&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1)
18 | - [Download on the App Store](https://apps.apple.com/us/app/thingsboard-live/id1594355695?itsct=apps_box_badge&itscg=30200)
19 |
--------------------------------------------------------------------------------
/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 | require_trailing_commas: true
25 | prefer_single_quotes: true
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 |
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # The espressif library needs to have all their names and fields preserved.
2 | -keep,allowoptimization class espressif.* { *; }
3 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
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 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/org/thingsboard/app/KeepAliveService.kt:
--------------------------------------------------------------------------------
1 | package org.thingsboard.app
2 |
3 | import android.app.Service
4 | import android.content.Intent
5 | import android.os.Binder
6 | import android.os.IBinder
7 |
8 | class KeepAliveService: Service() {
9 | companion object {
10 | val binder = Binder()
11 | }
12 |
13 | override fun onBind(intent: Intent): IBinder {
14 | return binder
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/org/thingsboard/app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package org.thingsboard.app
2 |
3 | import androidx.annotation.NonNull
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugin.common.MethodChannel
7 |
8 | class MainActivity: FlutterActivity() {
9 |
10 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
11 | super.configureFlutterEngine(flutterEngine)
12 | registerTbWebAuth(flutterEngine)
13 | }
14 |
15 | fun registerTbWebAuth(flutterEngine: FlutterEngine) {
16 | val channel = MethodChannel(flutterEngine.dartExecutor, "tb_web_auth")
17 | channel.setMethodCallHandler(TbWebAuthHandler(this))
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/org/thingsboard/app/TbWebCallbackActivity.kt:
--------------------------------------------------------------------------------
1 | package org.thingsboard.app
2 |
3 | import android.app.Activity
4 | import android.net.Uri
5 | import android.os.Bundle
6 |
7 | class TbWebCallbackActivity: Activity() {
8 | override fun onCreate(savedInstanceState: Bundle?) {
9 | super.onCreate(savedInstanceState)
10 |
11 | val url = intent?.data
12 | val scheme = url?.scheme
13 |
14 | if (scheme != null) {
15 | TbWebAuthHandler.callbacks.remove(scheme)?.success(url.toString())
16 | }
17 |
18 | finish()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | -
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | -
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-hdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-hdpi/thingsboard.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-mdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-mdpi/thingsboard.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xhdpi/thingsboard.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xxhdpi/thingsboard.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/android/app/src/main/res/mipmap-xxxhdpi/thingsboard.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
19 |
20 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
19 |
20 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/network_security_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
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 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | allprojects {
2 | repositories {
3 | google()
4 | jcenter()
5 | mavenCentral()
6 | maven { url ("https://jitpack.io/") }
7 | }
8 | }
9 |
10 | rootProject.buildDir = '../build'
11 | subprojects {
12 | project.buildDir = "${rootProject.buildDir}/${project.name}"
13 | }
14 | subprojects {
15 | afterEvaluate { project ->
16 | if (project.plugins.hasPlugin("com.android.application") ||
17 | project.plugins.hasPlugin("com.android.library")) {
18 | project.android {
19 | compileSdkVersion 34
20 | buildToolsVersion "34.0.0"
21 | }
22 | }
23 | }
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | tasks.register("clean", Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/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-7.5.1-all.zip
7 |
--------------------------------------------------------------------------------
/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 |
10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11 |
12 | repositories {
13 | google()
14 | mavenCentral()
15 | gradlePluginPortal()
16 | }
17 | }
18 |
19 | plugins {
20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0"
21 | id "com.android.application" version "7.2.2" apply false
22 | id "org.jetbrains.kotlin.android" version "1.9.0" apply false
23 | }
24 |
25 | include ":app"
--------------------------------------------------------------------------------
/android/settings_aar.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/assets/images/apple-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/assets/images/device-profile-placeholder.svg:
--------------------------------------------------------------------------------
1 |
15 |
--------------------------------------------------------------------------------
/assets/images/facebook-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/assets/images/github-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
5 |
--------------------------------------------------------------------------------
/assets/images/google-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/assets/images/qr_code_scanner.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/assets/images/thingsboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/assets/images/thingsboard.png
--------------------------------------------------------------------------------
/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 | 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/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.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 |
11 | self.registerTbWebAuth()
12 |
13 | if #available(iOS 10.0, *) {
14 | UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
15 | }
16 |
17 | GeneratedPluginRegistrant.register(with: self)
18 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
19 | }
20 |
21 | private func registerTbWebAuth() {
22 | let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
23 | let channel = FlutterMethodChannel(name: "tb_web_auth", binaryMessenger: controller.binaryMessenger)
24 | let instance = TbWebAuthHandler()
25 | channel.setMethodCallHandler({
26 | (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
27 | instance.handle(call, result: result)
28 | })
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/thingsboard/flutter_thingsboard_app/ef5449e45711060f9944bf9213cb40c4dab6c311/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/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 | com.apple.developer.associated-domains
8 |
9 | applinks:demo.thingsboard.io
10 |
11 | com.apple.developer.networking.HotspotConfiguration
12 |
13 | com.apple.developer.networking.wifi-info
14 |
15 | com.apple.security.network.client
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/l10n.yaml:
--------------------------------------------------------------------------------
1 | arb-dir: lib/l10n
2 | template-arb-file: intl_en.arb
3 | output-localization-file: messages.dart
4 | output-class: S
5 | preferred-supported-locales: [ en ]
6 | nullable-getter: false
7 |
--------------------------------------------------------------------------------
/lib/app_bloc_observer.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_bloc/flutter_bloc.dart';
2 | import 'package:thingsboard_app/core/logger/tb_logger.dart';
3 |
4 | class AppBlocObserver extends BlocObserver {
5 | const AppBlocObserver(this.logger);
6 |
7 | final TbLogger logger;
8 |
9 | @override
10 | void onCreate(BlocBase bloc) {
11 | super.onCreate(bloc);
12 | logger.info('AppBlocObserver::onCreate(${bloc.runtimeType})');
13 | }
14 |
15 | @override
16 | void onEvent(Bloc bloc, Object? event) {
17 | super.onEvent(bloc, event);
18 | logger.info('AppBlocObserver::onEvent(${bloc.runtimeType}, $event)');
19 | }
20 |
21 | @override
22 | void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
23 | super.onError(bloc, error, stackTrace);
24 | logger.info(
25 | 'AppBlocObserver::onError(${bloc.runtimeType}, $error, $stackTrace)',
26 | );
27 | }
28 |
29 | @override
30 | void onClose(BlocBase bloc) {
31 | super.onClose(bloc);
32 | logger.info('AppBlocObserver::onClose(${bloc.runtimeType})');
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/lib/constants/app_constants.dart:
--------------------------------------------------------------------------------
1 | abstract class ThingsboardAppConstants {
2 | static const thingsBoardApiEndpoint = 'http://localhost:8080';
3 | static const thingsboardOAuth2CallbackUrlScheme = 'org.thingsboard.app.auth';
4 |
5 | static const thingsboardIOSAppSecret = 'Your app secret here';
6 | static const thingsboardAndroidAppSecret = 'Your app secret here';
7 | }
8 |
--------------------------------------------------------------------------------
/lib/constants/database_keys.dart:
--------------------------------------------------------------------------------
1 | abstract final class DatabaseKeys {
2 | static const thingsBoardApiEndpointKey = 'thingsBoardApiEndpoint';
3 | static const initialAppLink = 'initialAppLink';
4 | static const selectedRegion = 'selectedRegion';
5 | }
6 |
--------------------------------------------------------------------------------
/lib/constants/enviroment_variables.dart:
--------------------------------------------------------------------------------
1 | abstract final class EnvironmentVariables {
2 | static const apiCalls =
3 | bool.fromEnvironment('API_CALLS', defaultValue: false);
4 | static const verbose = bool.fromEnvironment('VERBOSE', defaultValue: false);
5 | }
6 |
--------------------------------------------------------------------------------
/lib/constants/hive_type_adapter_ids.dart:
--------------------------------------------------------------------------------
1 | abstract final class HiveTypeAdapterIds {
2 | static const regionAdapterId = 1;
3 | }
4 |
--------------------------------------------------------------------------------
/lib/core/auth/login/bloc/auth_events.dart:
--------------------------------------------------------------------------------
1 | import 'package:equatable/equatable.dart';
2 | import 'package:thingsboard_app/thingsboard_client.dart' show PlatformType;
3 |
4 | sealed class AuthEvent extends Equatable {
5 | const AuthEvent();
6 |
7 | @override
8 | List