flip_store_alloc.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  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. // Widget
  55. if(!easy_flipper_set_widget(
  56. &app->widget,
  57. FlipStoreViewAbout,
  58. "Welcome to the FlipStore!\n------\nDownload apps via WiFi and\nrun them on your Flipper!\n------\nwww.github.com/jblanked",
  59. callback_to_submenu,
  60. &app->view_dispatcher)) {
  61. return NULL;
  62. }
  63. // Popup
  64. if(!easy_flipper_set_popup(
  65. &app->popup,
  66. FlipStoreViewPopup,
  67. "Failed",
  68. 0,
  69. 0,
  70. "You are not connected to Wifi.\n\nIf you have the FlipperHTTP\nflash installed, then update\nyour WiFi credentials.",
  71. 0,
  72. 10,
  73. popup_callback,
  74. callback_to_submenu,
  75. &app->view_dispatcher,
  76. app)) {
  77. FURI_LOG_E(TAG, "Failed to create popup");
  78. }
  79. // Dialog
  80. if(!easy_flipper_set_dialog_ex(
  81. &app->dialog_delete,
  82. FlipStoreViewAppDelete,
  83. "Delete App",
  84. 0,
  85. 0,
  86. "Are you sure you want to delete this app?",
  87. 0,
  88. 10,
  89. "No",
  90. "Yes",
  91. NULL,
  92. dialog_callback,
  93. callback_to_app_list,
  94. &app->view_dispatcher,
  95. app)) {
  96. return NULL;
  97. }
  98. // Text Input
  99. if(!easy_flipper_set_uart_text_input(
  100. &app->uart_text_input_ssid,
  101. FlipStoreViewTextInputSSID,
  102. "Enter SSID",
  103. app->uart_text_input_temp_buffer_ssid,
  104. app->uart_text_input_buffer_size_ssid,
  105. flip_store_text_updated_ssid,
  106. callback_to_submenu,
  107. &app->view_dispatcher,
  108. app)) {
  109. return NULL;
  110. }
  111. if(!easy_flipper_set_uart_text_input(
  112. &app->uart_text_input_pass,
  113. FlipStoreViewTextInputPass,
  114. "Enter Password",
  115. app->uart_text_input_temp_buffer_pass,
  116. app->uart_text_input_buffer_size_pass,
  117. flip_store_text_updated_pass,
  118. callback_to_submenu,
  119. &app->view_dispatcher,
  120. app)) {
  121. return NULL;
  122. }
  123. // Variable Item List
  124. if(!easy_flipper_set_variable_item_list(
  125. &app->variable_item_list,
  126. FlipStoreViewSettings,
  127. settings_item_selected,
  128. callback_to_submenu,
  129. &app->view_dispatcher,
  130. app)) {
  131. return NULL;
  132. }
  133. app->variable_item_ssid =
  134. variable_item_list_add(app->variable_item_list, "SSID", 0, NULL, NULL);
  135. app->variable_item_pass =
  136. variable_item_list_add(app->variable_item_list, "Password", 0, NULL, NULL);
  137. // Submenu
  138. if(!easy_flipper_set_submenu(
  139. &app->submenu,
  140. FlipStoreViewSubmenu,
  141. "FlipStore v0.3",
  142. callback_exit_app,
  143. &app->view_dispatcher)) {
  144. return NULL;
  145. }
  146. if(!easy_flipper_set_submenu(
  147. &app->submenu_app_list,
  148. FlipStoreViewAppList,
  149. "App Catalog",
  150. callback_to_submenu,
  151. &app->view_dispatcher)) {
  152. return NULL;
  153. }
  154. if(!easy_flipper_set_submenu(
  155. &app->submenu_app_list_bluetooth,
  156. FlipStoreViewAppListBluetooth,
  157. "Bluetooth",
  158. callback_to_app_list,
  159. &app->view_dispatcher)) {
  160. return NULL;
  161. }
  162. if(!easy_flipper_set_submenu(
  163. &app->submenu_app_list_games,
  164. FlipStoreViewAppListGames,
  165. "Games",
  166. callback_to_app_list,
  167. &app->view_dispatcher)) {
  168. return NULL;
  169. }
  170. if(!easy_flipper_set_submenu(
  171. &app->submenu_app_list_gpio,
  172. FlipStoreViewAppListGPIO,
  173. "GPIO",
  174. callback_to_app_list,
  175. &app->view_dispatcher)) {
  176. return NULL;
  177. }
  178. if(!easy_flipper_set_submenu(
  179. &app->submenu_app_list_infrared,
  180. FlipStoreViewAppListInfrared,
  181. "Infrared",
  182. callback_to_app_list,
  183. &app->view_dispatcher)) {
  184. return NULL;
  185. }
  186. if(!easy_flipper_set_submenu(
  187. &app->submenu_app_list_ibutton,
  188. FlipStoreViewAppListiButton,
  189. "iButton",
  190. callback_to_app_list,
  191. &app->view_dispatcher)) {
  192. return NULL;
  193. }
  194. if(!easy_flipper_set_submenu(
  195. &app->submenu_app_list_media,
  196. FlipStoreViewAppListMedia,
  197. "Media",
  198. callback_to_app_list,
  199. &app->view_dispatcher)) {
  200. return NULL;
  201. }
  202. if(!easy_flipper_set_submenu(
  203. &app->submenu_app_list_nfc,
  204. FlipStoreViewAppListNFC,
  205. "NFC",
  206. callback_to_app_list,
  207. &app->view_dispatcher)) {
  208. return NULL;
  209. }
  210. if(!easy_flipper_set_submenu(
  211. &app->submenu_app_list_rfid,
  212. FlipStoreViewAppListRFID,
  213. "RFID",
  214. callback_to_app_list,
  215. &app->view_dispatcher)) {
  216. return NULL;
  217. }
  218. if(!easy_flipper_set_submenu(
  219. &app->submenu_app_list_subghz,
  220. FlipStoreViewAppListSubGHz,
  221. "Sub-GHz",
  222. callback_to_app_list,
  223. &app->view_dispatcher)) {
  224. return NULL;
  225. }
  226. if(!easy_flipper_set_submenu(
  227. &app->submenu_app_list_tools,
  228. FlipStoreViewAppListTools,
  229. "Tools",
  230. callback_to_app_list,
  231. &app->view_dispatcher)) {
  232. return NULL;
  233. }
  234. if(!easy_flipper_set_submenu(
  235. &app->submenu_app_list_usb,
  236. FlipStoreViewAppListUSB,
  237. "USB",
  238. callback_to_app_list,
  239. &app->view_dispatcher)) {
  240. return NULL;
  241. }
  242. submenu_add_item(
  243. app->submenu, "Catalog", FlipStoreSubmenuIndexAppList, callback_submenu_choices, app);
  244. submenu_add_item(
  245. app->submenu, "About", FlipStoreSubmenuIndexAbout, callback_submenu_choices, app);
  246. submenu_add_item(
  247. app->submenu, "Settings", FlipStoreSubmenuIndexSettings, callback_submenu_choices, app);
  248. //
  249. submenu_add_item(
  250. app->submenu_app_list,
  251. "Bluetooth",
  252. FlipStoreSubmenuIndexAppListBluetooth,
  253. callback_submenu_choices,
  254. app);
  255. submenu_add_item(
  256. app->submenu_app_list,
  257. "Games",
  258. FlipStoreSubmenuIndexAppListGames,
  259. callback_submenu_choices,
  260. app);
  261. submenu_add_item(
  262. app->submenu_app_list,
  263. "GPIO",
  264. FlipStoreSubmenuIndexAppListGPIO,
  265. callback_submenu_choices,
  266. app);
  267. submenu_add_item(
  268. app->submenu_app_list,
  269. "Infrared",
  270. FlipStoreSubmenuIndexAppListInfrared,
  271. callback_submenu_choices,
  272. app);
  273. submenu_add_item(
  274. app->submenu_app_list,
  275. "iButton",
  276. FlipStoreSubmenuIndexAppListiButton,
  277. callback_submenu_choices,
  278. app);
  279. submenu_add_item(
  280. app->submenu_app_list,
  281. "Media",
  282. FlipStoreSubmenuIndexAppListMedia,
  283. callback_submenu_choices,
  284. app);
  285. submenu_add_item(
  286. app->submenu_app_list,
  287. "NFC",
  288. FlipStoreSubmenuIndexAppListNFC,
  289. callback_submenu_choices,
  290. app);
  291. submenu_add_item(
  292. app->submenu_app_list,
  293. "RFID",
  294. FlipStoreSubmenuIndexAppListRFID,
  295. callback_submenu_choices,
  296. app);
  297. submenu_add_item(
  298. app->submenu_app_list,
  299. "Sub-GHz",
  300. FlipStoreSubmenuIndexAppListSubGHz,
  301. callback_submenu_choices,
  302. app);
  303. submenu_add_item(
  304. app->submenu_app_list,
  305. "Tools",
  306. FlipStoreSubmenuIndexAppListTools,
  307. callback_submenu_choices,
  308. app);
  309. submenu_add_item(
  310. app->submenu_app_list,
  311. "USB",
  312. FlipStoreSubmenuIndexAppListUSB,
  313. callback_submenu_choices,
  314. app);
  315. //
  316. // dont add any items to the app list submenu of each category yet
  317. // load settings
  318. if(load_settings(
  319. app->uart_text_input_buffer_ssid,
  320. app->uart_text_input_buffer_size_ssid,
  321. app->uart_text_input_buffer_pass,
  322. app->uart_text_input_buffer_size_pass)) {
  323. // Update variable items
  324. if(app->variable_item_ssid)
  325. variable_item_set_current_value_text(
  326. app->variable_item_ssid, app->uart_text_input_buffer_ssid);
  327. // do not display the password
  328. // Copy items into their temp buffers with safety checks
  329. if(app->uart_text_input_buffer_ssid && app->uart_text_input_temp_buffer_ssid) {
  330. strncpy(
  331. app->uart_text_input_temp_buffer_ssid,
  332. app->uart_text_input_buffer_ssid,
  333. app->uart_text_input_buffer_size_ssid - 1);
  334. app->uart_text_input_temp_buffer_ssid[app->uart_text_input_buffer_size_ssid - 1] =
  335. '\0';
  336. }
  337. if(app->uart_text_input_buffer_pass && app->uart_text_input_temp_buffer_pass) {
  338. strncpy(
  339. app->uart_text_input_temp_buffer_pass,
  340. app->uart_text_input_buffer_pass,
  341. app->uart_text_input_buffer_size_pass - 1);
  342. app->uart_text_input_temp_buffer_pass[app->uart_text_input_buffer_size_pass - 1] =
  343. '\0';
  344. }
  345. }
  346. // Switch to the main view
  347. view_dispatcher_switch_to_view(app->view_dispatcher, FlipStoreViewSubmenu);
  348. return app;
  349. }