InfiniTime.git

commit 0aead42fdf5137becefb11f056fe8e567e2f454a

Author: JF <JF002@users.noreply.github.com>

navigation: Add is available (#1847)

Navigation app now needs 2 images to be loaded from the resources on the external filesystem. This PR adds an 'enabled' field to the Applications struct. This field is true for all applications expect for Navigation which calls Navigation::IsAvailable(). This methods returns true if the 2 files are available in the resources.

The application list disables the application (draws it in grey, disables the touch callback) if the enable flag is not set.

 src/displayapp/DisplayApp.cpp | 2 
 src/displayapp/screens/ApplicationList.cpp | 6 ++--
 src/displayapp/screens/ApplicationList.h | 31 +++++++++++++----------
 src/displayapp/screens/Navigation.cpp | 16 ++++++++++++
 src/displayapp/screens/Navigation.h | 2 +
 src/displayapp/screens/Tile.cpp | 2 
 src/displayapp/screens/Tile.h | 1 


diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index a930fe961cd2492039b52c33094cee2de09bcbe8..cd941f16ccdcff573ba3aad3392d6c5818ac9c77 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -404,7 +404,7 @@
   switch (app) {
     case Apps::Launcher:
       currentScreen =
-        std::make_unique<Screens::ApplicationList>(this, settingsController, batteryController, bleController, dateTimeController);
+        std::make_unique<Screens::ApplicationList>(this, settingsController, batteryController, bleController, dateTimeController, filesystem);
       break;
     case Apps::Motion:
       // currentScreen = std::make_unique<Screens::Motion>(motionController);




diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp
index 0a65a5d472452ded0cd6d970da7a885143e7c112..6014cf53e0b18205fb0f3b128ba9f9cb49408707 100644
--- a/src/displayapp/screens/ApplicationList.cpp
+++ b/src/displayapp/screens/ApplicationList.cpp
@@ -6,8 +6,6 @@ #include "displayapp/DisplayApp.h"
 
 using namespace Pinetime::Applications::Screens;
 
-constexpr std::array<Tile::Applications, ApplicationList::applications.size()> ApplicationList::applications;
-
 auto ApplicationList::CreateScreenList() const {
   std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
   for (size_t i = 0; i < screens.size(); i++) {
@@ -22,12 +20,14 @@ ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app,
                                  Pinetime::Controllers::Settings& settingsController,
                                  const Pinetime::Controllers::Battery& batteryController,
                                  const Pinetime::Controllers::Ble& bleController,
-                                 Controllers::DateTime& dateTimeController)
+                                 Controllers::DateTime& dateTimeController,
+                                 Pinetime::Controllers::FS& filesystem)
   : app {app},
     settingsController {settingsController},
     batteryController {batteryController},
     bleController {bleController},
     dateTimeController {dateTimeController},
+    filesystem{filesystem},
     screens {app, settingsController.GetAppMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} {
 }
 




diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h
index 7bdd1154081bb3e00ec721bec77a2dbac1b3bb13..371ee710b5db929405b5889a6039a2985f4cacba 100644
--- a/src/displayapp/screens/ApplicationList.h
+++ b/src/displayapp/screens/ApplicationList.h
@@ -10,6 +10,7 @@ #include "components/settings/Settings.h"
 #include "components/battery/BatteryController.h"
 #include "displayapp/screens/Symbols.h"
 #include "displayapp/screens/Tile.h"
+#include "displayapp/screens/Navigation.h"
 
 namespace Pinetime {
   namespace Applications {
@@ -20,7 +21,8 @@         explicit ApplicationList(DisplayApp* app,
                                  Pinetime::Controllers::Settings& settingsController,
                                  const Pinetime::Controllers::Battery& batteryController,
                                  const Pinetime::Controllers::Ble& bleController,
-                                 Controllers::DateTime& dateTimeController);
+                                 Controllers::DateTime& dateTimeController,
+                                 Pinetime::Controllers::FS& filesystem);
         ~ApplicationList() override;
         bool OnTouchEvent(TouchEvents event) override;
 
@@ -33,26 +35,27 @@         Controllers::Settings& settingsController;
         const Pinetime::Controllers::Battery& batteryController;
         const Pinetime::Controllers::Ble& bleController;
         Controllers::DateTime& dateTimeController;
+        Pinetime::Controllers::FS& filesystem;
 
         static constexpr int appsPerScreen = 6;
 
         // Increment this when more space is needed
         static constexpr int nScreens = 2;
 
-        static constexpr std::array<Tile::Applications, appsPerScreen * nScreens> applications {{
-          {Symbols::stopWatch, Apps::StopWatch},
-          {Symbols::clock, Apps::Alarm},
-          {Symbols::hourGlass, Apps::Timer},
-          {Symbols::shoe, Apps::Steps},
-          {Symbols::heartBeat, Apps::HeartRate},
-          {Symbols::music, Apps::Music},
+        std::array<Tile::Applications, appsPerScreen * nScreens> applications {{
+          {Symbols::stopWatch, Apps::StopWatch, true},
+          {Symbols::clock, Apps::Alarm, true},
+          {Symbols::hourGlass, Apps::Timer, true},
+          {Symbols::shoe, Apps::Steps, true},
+          {Symbols::heartBeat, Apps::HeartRate, true},
+          {Symbols::music, Apps::Music, true},
 
-          {Symbols::paintbrush, Apps::Paint},
-          {Symbols::paddle, Apps::Paddle},
-          {"2", Apps::Twos},
-          {Symbols::drum, Apps::Metronome},
-          {Symbols::map, Apps::Navigation},
-          {Symbols::none, Apps::None},
+          {Symbols::paintbrush, Apps::Paint, true},
+          {Symbols::paddle, Apps::Paddle, true},
+          {"2", Apps::Twos, true},
+          {Symbols::drum, Apps::Metronome, true},
+          {Symbols::map, Apps::Navigation, Applications::Screens::Navigation::IsAvailable(filesystem)},
+          {Symbols::none, Apps::None, false},
 
           // {"M", Apps::Motion},
         }};




diff --git a/src/displayapp/screens/Navigation.cpp b/src/displayapp/screens/Navigation.cpp
index fe2f1eb6a0d0d957d7935eba3eb2f82d46acab65..799ac8a9fa306e331af22b415028802544e727b4 100644
--- a/src/displayapp/screens/Navigation.cpp
+++ b/src/displayapp/screens/Navigation.cpp
@@ -265,3 +265,19 @@       lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, Colors::orange);
     }
   }
 }
+
+bool Navigation::IsAvailable(Pinetime::Controllers::FS& filesystem) {
+  lfs_file file = {};
+
+  if (filesystem.FileOpen(&file, "/images/navigation0.bin", LFS_O_RDONLY) < 0) {
+    return false;
+  }
+  filesystem.FileClose(&file);
+
+  if (filesystem.FileOpen(&file, "/images/navigation1.bin", LFS_O_RDONLY) < 0) {
+    return false;
+  }
+  filesystem.FileClose(&file);
+
+  return true;
+}




diff --git a/src/displayapp/screens/Navigation.h b/src/displayapp/screens/Navigation.h
index ab81d48c737ece39b4859b64f75985b1f324df73..eb243b011a23a9efabf2e54fbf1733eb989531d7 100644
--- a/src/displayapp/screens/Navigation.h
+++ b/src/displayapp/screens/Navigation.h
@@ -26,6 +26,7 @@
 namespace Pinetime {
   namespace Controllers {
     class NavigationService;
+    class FS;
   }
 
   namespace Applications {
@@ -36,6 +37,7 @@         explicit Navigation(Pinetime::Controllers::NavigationService& nav);
         ~Navigation() override;
 
         void Refresh() override;
+        static bool IsAvailable(Pinetime::Controllers::FS& filesystem);
 
       private:
         lv_obj_t* imgFlag;




diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp
index 1266f379f80d4fb228583da2fbe9d7cd2a1d1049..343755e3f0b38f62cd3f63e5a85a1b07f9a2cc6b 100644
--- a/src/displayapp/screens/Tile.cpp
+++ b/src/displayapp/screens/Tile.cpp
@@ -76,7 +76,7 @@   lv_obj_set_style_local_pad_inner(btnm1, LV_BTNMATRIX_PART_BG, LV_STATE_DEFAULT, 10);
 
   for (uint8_t i = 0; i < 6; i++) {
     lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_CLICK_TRIG);
-    if (applications[i].application == Apps::None) {
+    if (applications[i].application == Apps::None || !applications[i].enabled) {
       lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED);
     }
   }




diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h
index 91acb26c7b0458bf18f19f4275292f9d7360b0e9..8c1cd12cdc9422c1e8be1764a90f6137082dd975 100644
--- a/src/displayapp/screens/Tile.h
+++ b/src/displayapp/screens/Tile.h
@@ -19,6 +19,7 @@       public:
         struct Applications {
           const char* icon;
           Pinetime::Applications::Apps application;
+          bool enabled;
         };
 
         explicit Tile(uint8_t screenID,