From a7c84660a05734ba363b7c8310a6fe279942b20c Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 20 Oct 2023 02:41:05 +0200 Subject: [PATCH] Added map view and telemetry configuration --- sbapp/main.py | 244 +++++++++++++++++-- sbapp/sideband/core.py | 93 +++++++ sbapp/ui/conversations.py | 15 +- sbapp/ui/layouts.py | 492 +++++++++++++++++++++++++++++++++++--- 4 files changed, 787 insertions(+), 57 deletions(-) diff --git a/sbapp/main.py b/sbapp/main.py index fc9cd50..c792c80 100644 --- a/sbapp/main.py +++ b/sbapp/main.py @@ -1,6 +1,6 @@ __debug_build__ = False __disable_shaders__ = False -__version__ = "0.6.2" +__version__ = "0.6.3" __variant__ = "beta" import sys @@ -30,7 +30,9 @@ if RNS.vendor.platformutils.get_platform() != "android": local = os.path.dirname(__file__) sys.path.append(local) +from typing import Union from kivymd.app import MDApp +from kivymd.icon_definitions import md_icons from kivy.core.window import Window from kivy.core.clipboard import Clipboard from kivy.base import EventLoop @@ -39,6 +41,9 @@ from kivy.lang.builder import Builder from kivy.effects.scroll import ScrollEffect from kivy.uix.screenmanager import ScreenManager from kivy.uix.screenmanager import FadeTransition, NoTransition +from kivymd.uix.list import OneLineIconListItem +from kivy.properties import StringProperty +from kivymd.uix.pickers import MDColorPicker if RNS.vendor.platformutils.get_platform() == "android": from sideband.core import SidebandCore @@ -111,6 +116,7 @@ class SidebandApp(MDApp): self.conversations_view = None self.sync_dialog = None self.settings_ready = False + self.telemetry_ready = False self.connectivity_ready = False self.hardware_ready = False self.repository_ready = False @@ -683,7 +689,7 @@ class SidebandApp(MDApp): if self.root.ids.screen_manager.current == "conversations_screen": self.quit_action(self) else: - self.open_conversations() + self.open_conversations(direction="right") if len(modifiers) > 0 and modifiers[0] == 'ctrl' and (text == "s" or text == "d"): if self.root.ids.screen_manager.current == "messages_screen": self.message_send_action() @@ -2802,6 +2808,220 @@ class SidebandApp(MDApp): c_dialog.open() + ### Telemetry Screen + ###################################### + + def telemetry_init(self): + if not self.telemetry_ready: + self.root.ids.telemetry_collector.bind(focus=self.telemetry_save) + if self.sideband.config["telemetry_collector"] == None: + self.root.ids.telemetry_collector.text = "" + else: + self.root.ids.telemetry_collector.text = RNS.hexrep(self.sideband.config["telemetry_collector"], delimit=False) + + self.root.ids.telemetry_icon_preview.icon_color = self.sideband.config["telemetry_fg"] + self.root.ids.telemetry_icon_preview.md_bg_color = self.sideband.config["telemetry_bg"] + self.root.ids.telemetry_icon_preview.icon = self.sideband.config["telemetry_icon"] + + self.root.ids.telemetry_enabled.active = self.sideband.config["telemetry_enabled"] + self.root.ids.telemetry_enabled.bind(active=self.telemetry_save) + + self.root.ids.telemetry_send_to_collector.active = self.sideband.config["telemetry_send_to_collector"] + self.root.ids.telemetry_send_to_collector.bind(active=self.telemetry_save) + + self.root.ids.telemetry_send_to_trusted.active = self.sideband.config["telemetry_send_to_trusted"] + self.root.ids.telemetry_send_to_trusted.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_location.active = self.sideband.config["telemetry_s_location"] + self.root.ids.telemetry_s_location.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_orientation.active = self.sideband.config["telemetry_s_orientation"] + self.root.ids.telemetry_s_orientation.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_battery.active = self.sideband.config["telemetry_s_battery"] + self.root.ids.telemetry_s_battery.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_barometer.active = self.sideband.config["telemetry_s_barometer"] + self.root.ids.telemetry_s_barometer.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_temperature.active = self.sideband.config["telemetry_s_temperature"] + self.root.ids.telemetry_s_temperature.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_humidity.active = self.sideband.config["telemetry_s_humidity"] + self.root.ids.telemetry_s_humidity.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_compass.active = self.sideband.config["telemetry_s_compass"] + self.root.ids.telemetry_s_compass.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_light.active = self.sideband.config["telemetry_s_light"] + self.root.ids.telemetry_s_light.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_gravity.active = self.sideband.config["telemetry_s_gravity"] + self.root.ids.telemetry_s_gravity.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_gyroscope.active = self.sideband.config["telemetry_s_gyroscope"] + self.root.ids.telemetry_s_gyroscope.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_accelerometer.active = self.sideband.config["telemetry_s_accelerometer"] + self.root.ids.telemetry_s_accelerometer.bind(active=self.telemetry_save) + + self.root.ids.telemetry_s_proximity.active = self.sideband.config["telemetry_s_proximity"] + self.root.ids.telemetry_s_proximity.bind(active=self.telemetry_save) + + self.telemetry_ready = True + + def telemetry_set_icon(self, text="", search=False): + if text in md_icons.keys(): + self.root.ids.telemetry_icon_preview.icon = text + else: + self.root.ids.telemetry_icon_preview.icon = "alpha-p-circle-outline" + + self.sideband.config["telemetry_icon"] = self.root.ids.telemetry_icon_preview.icon + self.sideband.save_configuration() + + + def telemetry_save(self, sender=None, event=None): + if len(self.root.ids.telemetry_collector.text) != 32: + self.root.ids.telemetry_collector.text = "" + self.sideband.config["telemetry_collector"] = None + else: + try: + self.sideband.config["telemetry_collector"] = bytes.fromhex(self.root.ids.telemetry_collector.text) + except: + self.root.ids.telemetry_collector.text = "" + self.sideband.config["telemetry_collector"] = None + + self.sideband.config["telemetry_enabled"] = self.root.ids.telemetry_enabled.active + self.sideband.config["telemetry_send_to_collector"] = self.root.ids.telemetry_send_to_collector.active + self.sideband.config["telemetry_send_to_trusted"] = self.root.ids.telemetry_send_to_trusted.active + + self.sideband.config["telemetry_s_location"] = self.root.ids.telemetry_s_location.active + self.sideband.config["telemetry_s_orientation"] = self.root.ids.telemetry_s_orientation.active + self.sideband.config["telemetry_s_battery"] = self.root.ids.telemetry_s_battery.active + self.sideband.config["telemetry_s_barometer"] = self.root.ids.telemetry_s_barometer.active + self.sideband.config["telemetry_s_temperature"] = self.root.ids.telemetry_s_temperature.active + self.sideband.config["telemetry_s_humidity"] = self.root.ids.telemetry_s_humidity.active + self.sideband.config["telemetry_s_compass"] = self.root.ids.telemetry_s_compass.active + self.sideband.config["telemetry_s_light"] = self.root.ids.telemetry_s_light.active + self.sideband.config["telemetry_s_gravity"] = self.root.ids.telemetry_s_gravity.active + self.sideband.config["telemetry_s_gyroscope"] = self.root.ids.telemetry_s_gyroscope.active + self.sideband.config["telemetry_s_accelerometer"] = self.root.ids.telemetry_s_accelerometer.active + self.sideband.config["telemetry_s_proximity"] = self.root.ids.telemetry_s_proximity.active + + self.sideband.save_configuration() + + def telemetry_action(self, sender=None, direction="left"): + self.telemetry_init() + self.root.ids.telemetry_scrollview.effect_cls = ScrollEffect + info = "\nSideband allows you to securely share telemetry, such as location and sensor data, with people, custom programs, machines or other system over LXMF. You have complete control over what kind of telemetry to send, and who you share it with. Telemetry data is never sent to, via or processed by any external services or servers, but is carried exclusively within encrypted LXMF messages over Reticulum.\n\nWhen telemetry is enabled, it is possible to embed telemetry data in normal messages on a per-peer basis. You can control this from the [b]Conversations[/b] list, by selecting the [b]Edit[/b] option for the relevant peer.\n\nYou can also define a [b]Telemetry Collector[/b], that Sideband will automatically send telemetry to on a periodic basis - for example your Nomad Network home node.\n" + info3 = "\nTo include a specific type of telemetry data while sending, it must be enabled below. Please note that some sensor types are not supported on all devices. Sideband will only be able to read a specific type of sensor if your device actually includes hardware for it.\n" + if self.theme_cls.theme_style == "Dark": + info = "[color=#"+dark_theme_text_color+"]"+info+"[/color]" + # info2 = "[color=#"+dark_theme_text_color+"]"+info2+"[/color]" + info3 = "[color=#"+dark_theme_text_color+"]"+info3+"[/color]" + + self.root.ids.telemetry_info.text = info + # self.root.ids.telemetry_info2.text = info2 + self.root.ids.telemetry_info3.text = info3 + self.root.ids.screen_manager.transition.direction = direction + self.root.ids.screen_manager.current = "telemetry_screen" + self.root.ids.nav_drawer.set_state("closed") + self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) + + def telemetry_fg_color(self, sender=None): + color_picker = MDColorPicker(size_hint=(0.85, 0.85)) + color_picker.open() + color_picker.bind( + on_release=self.telemetry_fg_select, + ) + self.color_picker = color_picker + + def telemetry_fg_select(self, instance_color_picker: MDColorPicker, type_color: str, selected_color: Union[list, str]): + color = selected_color[:-1] + [1] + self.root.ids.telemetry_icon_preview.icon_color = color + self.sideband.config["telemetry_fg"] = color + self.sideband.save_configuration() + if hasattr(self, "color_picker") and self.color_picker != None: + self.color_picker.dismiss() + self.color_picker = None + + def telemetry_bg_color(self, sender=None): + color_picker = MDColorPicker(size_hint=(0.85, 0.85)) + color_picker.open() + color_picker.bind( + on_release=self.telemetry_bg_select, + ) + self.color_picker = color_picker + + def telemetry_bg_select(self, instance_color_picker: MDColorPicker, type_color: str, selected_color: Union[list, str]): + color = selected_color[:-1] + [1] + self.root.ids.telemetry_icon_preview.md_bg_color = color + self.sideband.config["telemetry_bg"] = color + if hasattr(self, "color_picker") and self.color_picker != None: + self.color_picker.dismiss() + self.color_picker = None + + def close_sub_telemetry_action(self, sender=None): + self.telemetry_action(direction="right") + + ### Icons Screen + ###################################### + + def icons_action(self, sender=None): + self.icons_filter() + self.root.ids.screen_manager.transition.direction = "left" + self.root.ids.screen_manager.current = "icons_screen" + self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) + + def icons_selected(self, selected=None): + RNS.log("Selected: "+str(selected)) + if selected == None: + selected = "alpha-p-circle-outline" + self.telemetry_set_icon(selected) + self.close_sub_telemetry_action() + + + def icons_filter(self, text="", search=False): + def add_icon_item(name_icon): + def select_factory(x): + def f(): + self.root.ids.screen_manager.app.icons_selected(x) + return f + + self.root.ids.icons_rv.data.append( + { + "viewclass": "CustomOneLineIconListItem", + "icon": name_icon, + "text": name_icon, + "callback": lambda x: x, + "on_release": select_factory(name_icon) + } + ) + + self.root.ids.icons_rv.data = [] + for name_icon in md_icons.keys(): + if search: + if text in name_icon: + add_icon_item(name_icon) + else: + add_icon_item(name_icon) + + ### Map Screen + ###################################### + + def map_action(self, sender=None): + if not hasattr(self.root.ids.map_layout, "map") or self.root.ids.map_layout.map == None: + from mapview import MapView + mapview = MapView(zoom=11, lat=50.6394, lon=3.057) + mapview.snap_to_zoom = False + mapview.double_tap_zoom = False + self.root.ids.map_layout.map = mapview + self.root.ids.map_layout.add_widget(self.root.ids.map_layout.map) + + self.root.ids.screen_manager.transition.direction = "left" + self.root.ids.screen_manager.current = "map_screen" + self.root.ids.nav_drawer.set_state("closed") + self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) ### Guide screen ###################################### @@ -2892,27 +3112,10 @@ Thank you very much for using Free Communications Systems. self.root.ids.nav_drawer.set_state("closed") self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) - ################################################# # Unimplemented Screens # ################################################# - def map_action(self, sender=None): - def link_exec(sender=None, event=None): - import webbrowser - webbrowser.open("https://unsigned.io/donate") - - self.root.ids.map_scrollview.effect_cls = ScrollEffect - info = "The [b]Local Area[/b] feature is not yet implemented in Sideband.\n\nWant it faster? Go to [u][ref=link]https://unsigned.io/donate[/ref][/u] to support the project." - if self.theme_cls.theme_style == "Dark": - info = "[color=#"+dark_theme_text_color+"]"+info+"[/color]" - self.root.ids.map_info.text = info - self.root.ids.map_info.bind(on_ref_press=link_exec) - self.root.ids.screen_manager.transition.direction = "left" - self.root.ids.screen_manager.current = "map_screen" - self.root.ids.nav_drawer.set_state("closed") - self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) - def broadcasts_action(self, sender=None): def link_exec(sender=None, event=None): import webbrowser @@ -2929,7 +3132,8 @@ Thank you very much for using Free Communications Systems. self.root.ids.nav_drawer.set_state("closed") self.sideband.setstate("app.displaying", self.root.ids.screen_manager.current) - +class CustomOneLineIconListItem(OneLineIconListItem): + icon = StringProperty() def run(): SidebandApp().run() diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py index f0188ad..2fa913b 100644 --- a/sbapp/sideband/core.py +++ b/sbapp/sideband/core.py @@ -11,6 +11,7 @@ import RNS.vendor.umsgpack as msgpack import RNS.Interfaces.Interface as Interface from .res import sideband_fb_data +from .sense import Telemeter if RNS.vendor.platformutils.get_platform() == "android": from jnius import autoclass, cast @@ -96,6 +97,7 @@ class SidebandCore(): self.owner_app = owner_app self.reticulum = None self.webshare_server = None + self.telemeter = None self.app_dir = plyer.storagepath.get_home_dir()+"/.config/sideband" if self.app_dir.startswith("file://"): @@ -267,6 +269,7 @@ class SidebandCore(): self.config["connect_ifmode_modem"] = "full" self.config["connect_ifmode_serial"] = "full" self.config["connect_ifmode_bluetooth"] = "full" + # Hardware self.config["hw_rnode_frequency"] = None self.config["hw_rnode_modulation"] = "LoRa" @@ -293,6 +296,12 @@ class SidebandCore(): self.config["hw_serial_stopbits"] = 1 self.config["hw_serial_parity"] = "none" + # Telemetry + self.config["telemetry_enabled"] = False + self.config["telemetry_icon"] = "alpha-p-circle-outline" + self.config["telemetry_send_to_trusted"] = False + self.config["telemetry_send_to_collector"] = False + if not os.path.isfile(self.db_path): self.__db_init() else: @@ -427,6 +436,47 @@ class SidebandCore(): if not "hw_serial_parity" in self.config: self.config["hw_serial_parity"] = "none" + if not "telemetry_enabled" in self.config: + self.config["telemetry_enabled"] = False + if not "telemetry_collector" in self.config: + self.config["telemetry_collector"] = None + if not "telemetry_send_to_trusted" in self.config: + self.config["telemetry_send_to_trusted"] = False + if not "telemetry_send_to_collector" in self.config: + self.config["telemetry_send_to_collector"] = False + + if not "telemetry_icon" in self.config: + self.config["telemetry_icon"] = "alpha-p-circle-outline" + if not "telemetry_fg" in self.config: + self.config["telemetry_fg"] = [0,0,0,1] + if not "telemetry_bg" in self.config: + self.config["telemetry_bg"] = [1,1,1,1] + + if not "telemetry_s_location" in self.config: + self.config["telemetry_s_location"] = False + if not "telemetry_s_orientation" in self.config: + self.config["telemetry_s_orientation"] = False + if not "telemetry_s_battery" in self.config: + self.config["telemetry_s_battery"] = False + if not "telemetry_s_barometer" in self.config: + self.config["telemetry_s_barometer"] = False + if not "telemetry_s_temperature" in self.config: + self.config["telemetry_s_temperature"] = False + if not "telemetry_s_humidity" in self.config: + self.config["telemetry_s_humidity"] = False + if not "telemetry_s_compass" in self.config: + self.config["telemetry_s_compass"] = False + if not "telemetry_s_light" in self.config: + self.config["telemetry_s_light"] = False + if not "telemetry_s_gravity" in self.config: + self.config["telemetry_s_gravity"] = False + if not "telemetry_s_gyroscope" in self.config: + self.config["telemetry_s_gyroscope"] = False + if not "telemetry_s_accelerometer" in self.config: + self.config["telemetry_s_accelerometer"] = False + if not "telemetry_s_proximity" in self.config: + self.config["telemetry_s_proximity"] = False + # Make sure we have a database if not os.path.isfile(self.db_path): self.__db_init() @@ -547,6 +597,22 @@ class SidebandCore(): RNS.log("Error while checking trust for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) return False + def should_send_telemetry(self, context_dest): + try: + existing_conv = self._db_conversation(context_dest) + if existing_conv != None: + cd = existing_conv["data"] + if cd != None and "telemetry" in cd and cd["telemetry"] == True: + return True + else: + return False + else: + return False + + except Exception as e: + RNS.log("Error while checking telemetry sending for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + return False + def raw_display_name(self, context_dest): try: existing_conv = self._db_conversation(context_dest) @@ -621,6 +687,12 @@ class SidebandCore(): def untrusted_conversation(self, context_dest): self._db_conversation_set_trusted(context_dest, False) + def send_telemetry_in_conversation(self, context_dest): + self._db_conversation_set_telemetry(context_dest, True) + + def no_telemetry_in_conversation(self, context_dest): + self._db_conversation_set_telemetry(context_dest, False) + def named_conversation(self, name, context_dest): self._db_conversation_set_name(context_dest, name) @@ -920,6 +992,24 @@ class SidebandCore(): result = dbc.fetchall() db.commit() + def _db_conversation_set_telemetry(self, context_dest, send_telemetry=False): + conv = self._db_conversation(context_dest) + data_dict = conv["data"] + if data_dict == None: + data_dict = {} + + data_dict["telemetry"] = send_telemetry + packed_dict = msgpack.packb(data_dict) + + db = self.__db_connect() + dbc = db.cursor() + + query = "UPDATE conv set data = ? where dest_context = ?" + data = (packed_dict, context_dest) + dbc.execute(query, data) + result = dbc.fetchall() + db.commit() + def _db_conversation_set_trusted(self, context_dest, trusted): db = self.__db_connect() dbc = db.cursor() @@ -1322,6 +1412,9 @@ class SidebandCore(): # TODO: The "start_announce" config entry should be # renamed to "auto_announce", which is its current # meaning. + if self.config["telemetry_enabled"] == True: + pass + if self.config["start_announce"] == True: needs_if_change_announce = False diff --git a/sbapp/ui/conversations.py b/sbapp/ui/conversations.py index 8c8aac5..b9c12e3 100644 --- a/sbapp/ui/conversations.py +++ b/sbapp/ui/conversations.py @@ -25,6 +25,7 @@ class ConvSettings(BoxLayout): disp_name = StringProperty() context_dest = StringProperty() trusted = BooleanProperty() + telemetry = BooleanProperty() class Conversations(): def __init__(self, app): @@ -116,10 +117,11 @@ class Conversations(): try: disp_name = self.app.sideband.raw_display_name(dest) is_trusted = self.app.sideband.is_trusted(dest) + send_telemetry = self.app.sideband.should_send_telemetry(dest) yes_button = MDRectangleFlatButton(text="Save",font_size=dp(18), theme_text_color="Custom", line_color=self.app.color_accept, text_color=self.app.color_accept) no_button = MDRectangleFlatButton(text="Cancel",font_size=dp(18)) - dialog_content = ConvSettings(disp_name=disp_name, context_dest=RNS.hexrep(dest, delimit=False), trusted=is_trusted) + dialog_content = ConvSettings(disp_name=disp_name, context_dest=RNS.hexrep(dest, delimit=False), trusted=is_trusted, telemetry=send_telemetry) dialog = MDDialog( title="Edit Conversation", text= "With "+RNS.prettyhexrep(dest), @@ -133,14 +135,17 @@ class Conversations(): try: name = dialog.d_content.ids["name_field"].text trusted = dialog.d_content.ids["trusted_switch"].active + telemetry = dialog.d_content.ids["telemetry_switch"].active if trusted: - RNS.log("Setting Trusted "+str(trusted)) self.app.sideband.trusted_conversation(dest) else: - RNS.log("Setting Untrusted "+str(trusted)) self.app.sideband.untrusted_conversation(dest) - RNS.log("Name="+name) + if telemetry: + self.app.sideband.send_telemetry_in_conversation(dest) + else: + self.app.sideband.no_telemetry_in_conversation(dest) + self.app.sideband.named_conversation(name, dest) except Exception as e: @@ -159,7 +164,7 @@ class Conversations(): no_button.bind(on_release=dl_no) item.dmenu.dismiss() dialog.open() - RNS.log("Generated edit dialog in "+str(RNS.prettytime(time.time()-t_s))) + RNS.log("Generated edit dialog in "+str(RNS.prettytime(time.time()-t_s)), RNS.LOG_DEBUG) except Exception as e: RNS.log("Error while creating conversation settings: "+str(e), RNS.LOG_ERROR) diff --git a/sbapp/ui/layouts.py b/sbapp/ui/layouts.py index 45dddf4..3f6014c 100644 --- a/sbapp/ui/layouts.py +++ b/sbapp/ui/layouts.py @@ -1,6 +1,7 @@ root_layout = """ #: import NoTransition kivy.uix.screenmanager.NoTransition #: import SlideTransition kivy.uix.screenmanager.SlideTransition +#:import images_path kivymd.images_path MDNavigationLayout: md_bg_color: app.theme_cls.bg_darkest @@ -816,7 +817,27 @@ MDNavigationLayout: orientation: "vertical" MDTopAppBar: - title: "Local Area Map" + title: "Situation Map" + anchor_title: "left" + elevation: 0 + left_action_items: + [['menu', lambda x: nav_drawer.set_state("open")]] + right_action_items: + [ + ['close', lambda x: root.ids.screen_manager.app.close_any_action(self)], + ] + + MDBoxLayout: + id: map_layout + + MDScreen: + name: "telemetry_screen" + + BoxLayout: + orientation: "vertical" + + MDTopAppBar: + title: "Telemetry" anchor_title: "left" elevation: 0 left_action_items: @@ -827,24 +848,426 @@ MDNavigationLayout: ] ScrollView: - id:map_scrollview + id: telemetry_scrollview MDBoxLayout: orientation: "vertical" - spacing: "24dp" size_hint_y: None height: self.minimum_height - padding: [dp(35), dp(35), dp(35), dp(35)] - + padding: [dp(28), dp(48), dp(28), dp(16)] MDLabel: - id: map_info + text: "Telemetry Over LXMF" + font_style: "H6" + + MDLabel: + id: telemetry_info markup: True text: "" size_hint_y: None text_size: self.width, None height: self.texture_size[1] - + + MDBoxLayout: + id: telemetry_enabled_fields + orientation: "vertical" + size_hint_y: None + height: self.minimum_height + padding: [0, 0, 0, dp(0)] + + MDTextField: + id: telemetry_collector + max_text_length: 32 + hint_text: "Telemetry Collector Address" + text: "" + font_size: dp(24) + + MDBoxLayout: + orientation: "horizontal" + padding: [0,0,dp(24),0] + size_hint_y: None + height: dp(48) + + MDLabel: + id: telemetry_enabled_label + text: "Enable Telemetry" + font_style: "H6" + + MDSwitch: + id: telemetry_enabled + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Automatically send to collector" + font_style: "H6" + + MDSwitch: + id: telemetry_send_to_collector + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Send to all trusted peers" + font_style: "H6" + + MDSwitch: + id: telemetry_send_to_trusted + pos_hint: {"center_y": 0.3} + active: False + + MDLabel: + markup: True + text: "\\n\\n" + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDLabel: + text: "Display Options" + font_style: "H6" + + MDLabel: + id: telemetry_info4 + markup: True + text: "\\nYou can customise the display style of your telemetry data when viewed by others, by setting an icon and color options. This is usually used by clients to display your telemetry entry on a map or in lists and overviews. If left unset, the receiver will decide how to display the data.\\n\\n" + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDBoxLayout: + orientation: "vertical" + size_hint_y: None + size_hint_x: None + # height: dp(96) + # width: dp(64) + spacing: dp(0) + padding: [dp(0), dp(24), dp(0), dp(24)] + pos_hint: {"center_x": .5} + + MDIconButton: + pos_hint: {"center_x": .5, "center_y": .5} + id: telemetry_icon_preview + icon: "alpha-p-circle-outline" + type: "large" + theme_icon_color: "Custom" + icon_color: [0, 0, 0, 1] + md_bg_color: [1, 1, 1, 1] + icon_size: dp(64) + # width: dp(64) + # height: dp(64) + + + MDRectangleFlatIconButton: + id: telemetry_icons_button + icon: "list-box-outline" + text: "Select From Available Icons" + padding: [dp(0), dp(14), dp(0), dp(14)] + icon_size: dp(24) + font_size: dp(16) + size_hint: [1.0, None] + on_release: root.ids.screen_manager.app.icons_action(self) + disabled: False + + MDBoxLayout: + orientation: "vertical" + size_hint_y: None + padding: [dp(0),dp(24),dp(0),dp(0)] + height: dp(74) + + MDBoxLayout: + orientation: "horizontal" + #size_hint_y: None + spacing: dp(24) + # padding: [0,0,dp(24),dp(0)] + # height: dp(48) + + MDRectangleFlatIconButton: + id: telemetry_icons_button + icon: "list-box-outline" + text: "Set Foreground Color" + padding: [dp(0), dp(14), dp(0), dp(14)] + icon_size: dp(24) + font_size: dp(16) + size_hint: [1.0, None] + on_release: root.ids.screen_manager.app.telemetry_fg_color(self) + disabled: False + + MDRectangleFlatIconButton: + id: telemetry_icons_button + icon: "list-box-outline" + text: "Set Background Color" + padding: [dp(0), dp(14), dp(0), dp(14)] + icon_size: dp(24) + font_size: dp(16) + size_hint: [1.0, None] + on_release: root.ids.screen_manager.app.telemetry_bg_color(self) + disabled: False + + MDLabel: + markup: True + text: "\\n\\n\\n" + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDLabel: + text: "Sensor Types" + font_style: "H6" + + MDLabel: + id: telemetry_info3 + markup: True + text: "" + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Location" + font_style: "H6" + + MDSwitch: + id: telemetry_s_location + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Orientation" + font_style: "H6" + + MDSwitch: + id: telemetry_s_orientation + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Battery State" + font_style: "H6" + + MDSwitch: + id: telemetry_s_battery + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Barometer" + font_style: "H6" + + MDSwitch: + id: telemetry_s_barometer + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Temperature" + font_style: "H6" + + MDSwitch: + id: telemetry_s_temperature + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Humidity" + font_style: "H6" + + MDSwitch: + id: telemetry_s_humidity + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Compass" + font_style: "H6" + + MDSwitch: + id: telemetry_s_compass + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Ambient Light" + font_style: "H6" + + MDSwitch: + id: telemetry_s_light + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Gravity" + font_style: "H6" + + MDSwitch: + id: telemetry_s_gravity + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Gyroscope" + font_style: "H6" + + MDSwitch: + id: telemetry_s_gyroscope + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Accelerometer" + font_style: "H6" + + MDSwitch: + id: telemetry_s_accelerometer + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,0,dp(24),dp(0)] + height: dp(48) + + MDLabel: + text: "Proximity" + font_style: "H6" + + MDSwitch: + id: telemetry_s_proximity + pos_hint: {"center_y": 0.3} + active: False + + MDLabel: + markup: True + text: "\\n" + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDScreen: + name: "icons_screen" + + BoxLayout: + orientation: "vertical" + + MDTopAppBar: + title: "Available Icons" + anchor_title: "left" + elevation: 0 + left_action_items: + [['menu', lambda x: nav_drawer.set_state("open")]] + right_action_items: + [ + ['close', lambda x: root.ids.screen_manager.app.close_sub_telemetry_action(self)], + ] + + MDBoxLayout: + orientation: 'vertical' + spacing: dp(10) + padding: dp(20) + + MDBoxLayout: + adaptive_height: True + + MDIconButton: + icon: 'magnify' + + MDTextField: + id: icons_search_field + hint_text: 'Search icon' + on_text: root.ids.screen_manager.app.icons_filter(self.text, True) + + RecycleView: + id: icons_rv + key_viewclass: 'viewclass' + key_size: 'height' + + RecycleBoxLayout: + padding: dp(10) + default_size: None, dp(48) + default_size_hint: 1, None + size_hint_y: None + height: self.minimum_height + orientation: 'vertical' + MDScreen: name: "keys_screen" @@ -1032,14 +1455,6 @@ MDNavigationLayout: max_text_length: 32 font_size: dp(24) - MDTextField: - id: settings_home_node_address - hint_text: "Nomad Network Home Node" - disabled: False - text: "" - max_text_length: 32 - font_size: dp(24) - MDTextField: id: settings_print_command hint_text: "Print Command" @@ -1235,22 +1650,6 @@ MDNavigationLayout: active: False disabled: True - MDBoxLayout: - orientation: "horizontal" - size_hint_y: None - padding: [0,0,dp(24),dp(0)] - height: dp(48) - - MDLabel: - text: "Send Telemetry to Home Node" - font_style: "H6" - - MDSwitch: - id: settings_telemetry_to_home_node - pos_hint: {"center_y": 0.3} - disabled: True - active: False - MDBoxLayout: orientation: "horizontal" size_hint_y: None @@ -1974,7 +2373,7 @@ MDNavigationLayout: OneLineIconListItem: - text: "Local Area Map" + text: "Situation Map" on_release: root.ids.screen_manager.app.map_action(self) IconLeftWidget: @@ -1982,6 +2381,15 @@ MDNavigationLayout: on_release: root.ids.screen_manager.app.map_action(self) + OneLineIconListItem: + text: "Telemetry" + on_release: root.ids.screen_manager.app.telemetry_action(self) + + IconLeftWidget: + icon: "axis-arrow-lock" + on_release: root.ids.screen_manager.app.telemetry_action(self) + + OneLineIconListItem: text: "Preferences" on_release: root.ids.screen_manager.app.settings_action(self) @@ -2146,6 +2554,22 @@ MDNavigationLayout: pos_hint: {"center_y": 0.43} active: root.trusted + MDBoxLayout: + orientation: "horizontal" + # spacing: "24dp" + size_hint_y: None + padding: [0,0,dp(8),0] + height: dp(48) + MDLabel: + id: telemetry_switch_label + text: "Include Telemetry" + font_style: "H6" + + MDSwitch: + id: telemetry_switch + pos_hint: {"center_y": 0.43} + active: root.telemetry + orientation: "vertical" spacing: "24dp" @@ -2181,4 +2605,8 @@ MDNavigationLayout: id: n_trusted pos_hint: {"center_y": 0.3} active: False + + + IconLeftWidget: + icon: root.icon """ \ No newline at end of file