flip_store_alloc.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. #include <alloc/flip_store_alloc.h>
  2. // Function to allocate resources for the FlipStoreApp
  3. FlipStoreApp* flip_store_app_alloc() {
  4. FlipStoreApp* app = (FlipStoreApp*)malloc(sizeof(FlipStoreApp));
  5. Gui* gui = furi_record_open(RECORD_GUI);
  6. if(!flipper_http_init(flipper_http_rx_callback, app)) {
  7. FURI_LOG_E(TAG, "Failed to initialize flipper http");
  8. return NULL;
  9. }
  10. // Allocate the text input buffer
  11. app->uart_text_input_buffer_size_ssid = 64;
  12. app->uart_text_input_buffer_size_pass = 64;
  13. if(!easy_flipper_set_buffer(
  14. &app->uart_text_input_buffer_ssid, app->uart_text_input_buffer_size_ssid)) {
  15. return NULL;
  16. }
  17. if(!easy_flipper_set_buffer(
  18. &app->uart_text_input_temp_buffer_ssid, app->uart_text_input_buffer_size_ssid)) {
  19. return NULL;
  20. }
  21. if(!easy_flipper_set_buffer(
  22. &app->uart_text_input_buffer_pass, app->uart_text_input_buffer_size_pass)) {
  23. return NULL;
  24. }
  25. if(!easy_flipper_set_buffer(
  26. &app->uart_text_input_temp_buffer_pass, app->uart_text_input_buffer_size_pass)) {
  27. return NULL;
  28. }
  29. // Allocate ViewDispatcher
  30. if(!easy_flipper_set_view_dispatcher(&app->view_dispatcher, gui, app)) {
  31. return NULL;
  32. }
  33. // Main view
  34. if(!easy_flipper_set_view(
  35. &app->view_main,
  36. FlipStoreViewMain,
  37. flip_store_view_draw_callback_main,
  38. NULL,
  39. callback_to_app_list,
  40. &app->view_dispatcher,
  41. app)) {
  42. return NULL;
  43. }
  44. if(!easy_flipper_set_view(
  45. &app->view_app_info,
  46. FlipStoreViewAppInfo,
  47. flip_store_view_draw_callback_app_list,
  48. flip_store_input_callback,
  49. callback_to_app_list,
  50. &app->view_dispatcher,
  51. app)) {
  52. return NULL;
  53. }
  54. if(!easy_flipper_set_view(
  55. &app->view_firmware_download,
  56. FlipStoreViewFirmwareDownload,
  57. flip_store_view_draw_callback_firmware,
  58. NULL,
  59. callback_to_firmware_list,
  60. &app->view_dispatcher,
  61. app)) {
  62. return NULL;
  63. }
  64. // Widget
  65. if(!easy_flipper_set_widget(
  66. &app->widget,
  67. FlipStoreViewAbout,
  68. "Welcome to the FlipStore!\n------\nDownload apps via WiFi and\nrun them on your Flipper!\n------\nwww.github.com/jblanked",
  69. callback_to_submenu,
  70. &app->view_dispatcher)) {
  71. return NULL;
  72. }
  73. // Popup
  74. if(!easy_flipper_set_popup(
  75. &app->popup,
  76. FlipStoreViewPopup,
  77. "Failed",
  78. 0,
  79. 0,
  80. "You are not connected to Wifi.\n\nIf you have the FlipperHTTP\nflash installed, then update\nyour WiFi credentials.",
  81. 0,
  82. 10,
  83. popup_callback,
  84. callback_to_submenu,
  85. &app->view_dispatcher,
  86. app)) {
  87. FURI_LOG_E(TAG, "Failed to create popup");
  88. }
  89. // Dialog
  90. if(!easy_flipper_set_dialog_ex(
  91. &app->dialog_delete,
  92. FlipStoreViewAppDelete,
  93. "Delete App",
  94. 0,
  95. 0,
  96. "Are you sure you want to delete this app?",
  97. 0,
  98. 10,
  99. "No",
  100. "Yes",
  101. NULL,
  102. dialog_delete_callback,
  103. callback_to_app_list,
  104. &app->view_dispatcher,
  105. app)) {
  106. return NULL;
  107. }
  108. if(!easy_flipper_set_dialog_ex(
  109. &app->dialog_firmware,
  110. FlipStoreViewFirmwareDialog,
  111. "Download Firmware",
  112. 0,
  113. 0,
  114. "Are you sure you want to\ndownload this firmware?",
  115. 0,
  116. 10,
  117. "No",
  118. "Yes",
  119. NULL,
  120. dialog_firmware_callback,
  121. callback_to_firmware_list,
  122. &app->view_dispatcher,
  123. app)) {
  124. return NULL;
  125. }
  126. // Text Input
  127. if(!easy_flipper_set_uart_text_input(
  128. &app->uart_text_input_ssid,
  129. FlipStoreViewTextInputSSID,
  130. "Enter SSID",
  131. app->uart_text_input_temp_buffer_ssid,
  132. app->uart_text_input_buffer_size_ssid,
  133. flip_store_text_updated_ssid,
  134. callback_to_submenu,
  135. &app->view_dispatcher,
  136. app)) {
  137. return NULL;
  138. }
  139. if(!easy_flipper_set_uart_text_input(
  140. &app->uart_text_input_pass,
  141. FlipStoreViewTextInputPass,
  142. "Enter Password",
  143. app->uart_text_input_temp_buffer_pass,
  144. app->uart_text_input_buffer_size_pass,
  145. flip_store_text_updated_pass,
  146. callback_to_submenu,
  147. &app->view_dispatcher,
  148. app)) {
  149. return NULL;
  150. }
  151. // Variable Item List
  152. if(!easy_flipper_set_variable_item_list(
  153. &app->variable_item_list,
  154. FlipStoreViewSettings,
  155. settings_item_selected,
  156. callback_to_submenu,
  157. &app->view_dispatcher,
  158. app)) {
  159. return NULL;
  160. }
  161. app->variable_item_ssid =
  162. variable_item_list_add(app->variable_item_list, "SSID", 0, NULL, NULL);
  163. app->variable_item_pass =
  164. variable_item_list_add(app->variable_item_list, "Password", 0, NULL, NULL);
  165. // Submenu
  166. if(!easy_flipper_set_submenu(
  167. &app->submenu_main,
  168. FlipStoreViewSubmenu,
  169. "FlipStore v0.6",
  170. callback_exit_app,
  171. &app->view_dispatcher)) {
  172. return NULL;
  173. }
  174. if(!easy_flipper_set_submenu(
  175. &app->submenu_options,
  176. FlipStoreViewSubmenuOptions,
  177. "Browse",
  178. callback_to_submenu,
  179. &app->view_dispatcher)) {
  180. return NULL;
  181. }
  182. if(!easy_flipper_set_submenu(
  183. &app->submenu_app_list,
  184. FlipStoreViewAppList,
  185. "App Catalog",
  186. callback_to_submenu_options,
  187. &app->view_dispatcher)) {
  188. return NULL;
  189. }
  190. if(!easy_flipper_set_submenu(
  191. &app->submenu_firmwares,
  192. FlipStoreViewFirmwares,
  193. "ESP32 Firmwares",
  194. callback_to_submenu_options,
  195. &app->view_dispatcher)) {
  196. return NULL;
  197. }
  198. if(!easy_flipper_set_submenu(
  199. &app->submenu_app_list_bluetooth,
  200. FlipStoreViewAppListBluetooth,
  201. "Bluetooth",
  202. callback_to_app_list,
  203. &app->view_dispatcher)) {
  204. return NULL;
  205. }
  206. if(!easy_flipper_set_submenu(
  207. &app->submenu_app_list_games,
  208. FlipStoreViewAppListGames,
  209. "Games",
  210. callback_to_app_list,
  211. &app->view_dispatcher)) {
  212. return NULL;
  213. }
  214. if(!easy_flipper_set_submenu(
  215. &app->submenu_app_list_gpio,
  216. FlipStoreViewAppListGPIO,
  217. "GPIO",
  218. callback_to_app_list,
  219. &app->view_dispatcher)) {
  220. return NULL;
  221. }
  222. if(!easy_flipper_set_submenu(
  223. &app->submenu_app_list_infrared,
  224. FlipStoreViewAppListInfrared,
  225. "Infrared",
  226. callback_to_app_list,
  227. &app->view_dispatcher)) {
  228. return NULL;
  229. }
  230. if(!easy_flipper_set_submenu(
  231. &app->submenu_app_list_ibutton,
  232. FlipStoreViewAppListiButton,
  233. "iButton",
  234. callback_to_app_list,
  235. &app->view_dispatcher)) {
  236. return NULL;
  237. }
  238. if(!easy_flipper_set_submenu(
  239. &app->submenu_app_list_media,
  240. FlipStoreViewAppListMedia,
  241. "Media",
  242. callback_to_app_list,
  243. &app->view_dispatcher)) {
  244. return NULL;
  245. }
  246. if(!easy_flipper_set_submenu(
  247. &app->submenu_app_list_nfc,
  248. FlipStoreViewAppListNFC,
  249. "NFC",
  250. callback_to_app_list,
  251. &app->view_dispatcher)) {
  252. return NULL;
  253. }
  254. if(!easy_flipper_set_submenu(
  255. &app->submenu_app_list_rfid,
  256. FlipStoreViewAppListRFID,
  257. "RFID",
  258. callback_to_app_list,
  259. &app->view_dispatcher)) {
  260. return NULL;
  261. }
  262. if(!easy_flipper_set_submenu(
  263. &app->submenu_app_list_subghz,
  264. FlipStoreViewAppListSubGHz,
  265. "Sub-GHz",
  266. callback_to_app_list,
  267. &app->view_dispatcher)) {
  268. return NULL;
  269. }
  270. if(!easy_flipper_set_submenu(
  271. &app->submenu_app_list_tools,
  272. FlipStoreViewAppListTools,
  273. "Tools",
  274. callback_to_app_list,
  275. &app->view_dispatcher)) {
  276. return NULL;
  277. }
  278. if(!easy_flipper_set_submenu(
  279. &app->submenu_app_list_usb,
  280. FlipStoreViewAppListUSB,
  281. "USB",
  282. callback_to_app_list,
  283. &app->view_dispatcher)) {
  284. return NULL;
  285. }
  286. //
  287. submenu_add_item(
  288. app->submenu_main, "Browse", FlipStoreSubmenuIndexOptions, callback_submenu_choices, app);
  289. submenu_add_item(
  290. app->submenu_main, "About", FlipStoreSubmenuIndexAbout, callback_submenu_choices, app);
  291. submenu_add_item(
  292. app->submenu_main,
  293. "Settings",
  294. FlipStoreSubmenuIndexSettings,
  295. callback_submenu_choices,
  296. app);
  297. //
  298. submenu_add_item(
  299. app->submenu_options,
  300. "App Catalog",
  301. FlipStoreSubmenuIndexAppList,
  302. callback_submenu_choices,
  303. app);
  304. submenu_add_item(
  305. app->submenu_options,
  306. "ESP32 Firmwares",
  307. FlipStoreSubmenuIndexFirmwares,
  308. callback_submenu_choices,
  309. app);
  310. //
  311. submenu_add_item(
  312. app->submenu_app_list,
  313. "Bluetooth",
  314. FlipStoreSubmenuIndexAppListBluetooth,
  315. callback_submenu_choices,
  316. app);
  317. submenu_add_item(
  318. app->submenu_app_list,
  319. "Games",
  320. FlipStoreSubmenuIndexAppListGames,
  321. callback_submenu_choices,
  322. app);
  323. submenu_add_item(
  324. app->submenu_app_list,
  325. "GPIO",
  326. FlipStoreSubmenuIndexAppListGPIO,
  327. callback_submenu_choices,
  328. app);
  329. submenu_add_item(
  330. app->submenu_app_list,
  331. "Infrared",
  332. FlipStoreSubmenuIndexAppListInfrared,
  333. callback_submenu_choices,
  334. app);
  335. submenu_add_item(
  336. app->submenu_app_list,
  337. "iButton",
  338. FlipStoreSubmenuIndexAppListiButton,
  339. callback_submenu_choices,
  340. app);
  341. submenu_add_item(
  342. app->submenu_app_list,
  343. "Media",
  344. FlipStoreSubmenuIndexAppListMedia,
  345. callback_submenu_choices,
  346. app);
  347. submenu_add_item(
  348. app->submenu_app_list,
  349. "NFC",
  350. FlipStoreSubmenuIndexAppListNFC,
  351. callback_submenu_choices,
  352. app);
  353. submenu_add_item(
  354. app->submenu_app_list,
  355. "RFID",
  356. FlipStoreSubmenuIndexAppListRFID,
  357. callback_submenu_choices,
  358. app);
  359. submenu_add_item(
  360. app->submenu_app_list,
  361. "Sub-GHz",
  362. FlipStoreSubmenuIndexAppListSubGHz,
  363. callback_submenu_choices,
  364. app);
  365. submenu_add_item(
  366. app->submenu_app_list,
  367. "Tools",
  368. FlipStoreSubmenuIndexAppListTools,
  369. callback_submenu_choices,
  370. app);
  371. submenu_add_item(
  372. app->submenu_app_list,
  373. "USB",
  374. FlipStoreSubmenuIndexAppListUSB,
  375. callback_submenu_choices,
  376. app);
  377. //
  378. // dont add any items to the app list submenu of each category yet
  379. // load settings
  380. if(load_settings(
  381. app->uart_text_input_buffer_ssid,
  382. app->uart_text_input_buffer_size_ssid,
  383. app->uart_text_input_buffer_pass,
  384. app->uart_text_input_buffer_size_pass)) {
  385. // Update variable items
  386. if(app->variable_item_ssid)
  387. variable_item_set_current_value_text(
  388. app->variable_item_ssid, app->uart_text_input_buffer_ssid);
  389. // do not display the password
  390. // Copy items into their temp buffers with safety checks
  391. if(app->uart_text_input_buffer_ssid && app->uart_text_input_temp_buffer_ssid) {
  392. strncpy(
  393. app->uart_text_input_temp_buffer_ssid,
  394. app->uart_text_input_buffer_ssid,
  395. app->uart_text_input_buffer_size_ssid - 1);
  396. app->uart_text_input_temp_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] =
  397. '\0';
  398. }
  399. if(app->uart_text_input_buffer_pass && app->uart_text_input_temp_buffer_pass) {
  400. strncpy(
  401. app->uart_text_input_temp_buffer_pass,
  402. app->uart_text_input_buffer_pass,
  403. app->uart_text_input_buffer_size_pass - 1);
  404. app->uart_text_input_temp_buffer_pass[app->uart_text_input_buffer_size_pass - 1] =
  405. '\0';
  406. }
  407. }
  408. // Switch to the main view
  409. view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSubmenu);
  410. return app;
  411. }