Plugins support WIP
This commit is contained in:
committed by
TamtamHero
parent
3d40be2db0
commit
38da718b00
173
src/eth_plugin_ui.c
Normal file
173
src/eth_plugin_ui.c
Normal file
@@ -0,0 +1,173 @@
|
||||
#include "shared_context.h"
|
||||
#ifdef HAVE_UX_FLOW
|
||||
#include "ui_flow.h"
|
||||
#endif
|
||||
#include "ui_callbacks.h"
|
||||
#include "eth_plugin_handler.h"
|
||||
|
||||
typedef enum {
|
||||
|
||||
PLUGIN_UI_INSIDE = 0,
|
||||
PLUGIN_UI_OUTSIDE
|
||||
|
||||
} plugin_ui_state_t;
|
||||
|
||||
void computeFees(char *displayBuffer, uint32_t displayBufferSize);
|
||||
|
||||
void plugin_ui_get_id() {
|
||||
ethQueryContractID_t pluginQueryContractID;
|
||||
eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, strings.tmp.tmp, sizeof(strings.tmp.tmp), strings.tmp.tmp2, sizeof(strings.tmp.tmp2));
|
||||
// Query the original contract for ID if it's not an internal alias
|
||||
if (!eth_plugin_call(
|
||||
(dataContext.tokenContext.pluginName[0] == '-' ? NULL : tmpContent.txContent.destination),
|
||||
ETH_PLUGIN_QUERY_CONTRACT_ID, (void*)&pluginQueryContractID)) {
|
||||
PRINTF("Plugin query contract ID call failed\n");
|
||||
io_seproxyhal_touch_tx_cancel(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void plugin_ui_get_item() {
|
||||
ethQueryContractUI_t pluginQueryContractUI;
|
||||
eth_plugin_prepare_query_contract_UI(&pluginQueryContractUI, dataContext.tokenContext.pluginUiCurrentItem, strings.tmp.tmp, sizeof(strings.tmp.tmp), strings.tmp.tmp2, sizeof(strings.tmp.tmp2));
|
||||
if (!eth_plugin_call(NULL, ETH_PLUGIN_QUERY_CONTRACT_UI, (void*)&pluginQueryContractUI)) {
|
||||
PRINTF("Plugin query contract UI call failed\n");
|
||||
io_seproxyhal_touch_tx_cancel(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void display_next_plugin_item(bool entering) {
|
||||
if (entering) {
|
||||
if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) {
|
||||
dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE;
|
||||
dataContext.tokenContext.pluginUiCurrentItem = 0;
|
||||
plugin_ui_get_item();
|
||||
ux_flow_next();
|
||||
}
|
||||
else {
|
||||
if (dataContext.tokenContext.pluginUiCurrentItem > 0) {
|
||||
dataContext.tokenContext.pluginUiCurrentItem--;
|
||||
plugin_ui_get_item();
|
||||
ux_flow_next();
|
||||
}
|
||||
else {
|
||||
dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE;
|
||||
dataContext.tokenContext.pluginUiCurrentItem = 0;
|
||||
ux_flow_prev();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (dataContext.tokenContext.pluginUiState == PLUGIN_UI_OUTSIDE) {
|
||||
dataContext.tokenContext.pluginUiState = PLUGIN_UI_INSIDE;
|
||||
plugin_ui_get_item();
|
||||
ux_flow_prev();
|
||||
// Reset multi page layout to the first page
|
||||
G_ux.layout_paging.current = 0;
|
||||
ux_layout_paging_redisplay(G_ux.stack_count-1);
|
||||
}
|
||||
else {
|
||||
if (dataContext.tokenContext.pluginUiCurrentItem < dataContext.tokenContext.pluginUiMaxItems - 1) {
|
||||
dataContext.tokenContext.pluginUiCurrentItem++;
|
||||
plugin_ui_get_item();
|
||||
ux_flow_prev();
|
||||
// Reset multi page layout to the first page
|
||||
G_ux.layout_paging.current = 0;
|
||||
ux_layout_paging_redisplay(G_ux.stack_count-1);
|
||||
}
|
||||
else {
|
||||
dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE;
|
||||
ux_flow_next();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void plugin_ui_compute_fees() {
|
||||
computeFees(strings.common.maxFee, sizeof(strings.common.maxFee));
|
||||
}
|
||||
|
||||
UX_FLOW_DEF_NOCB(
|
||||
ux_plugin_approval_intro_step,
|
||||
pnn,
|
||||
{
|
||||
&C_icon_eye,
|
||||
"Review",
|
||||
"contract call",
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_plugin_approval_id_step,
|
||||
bnnn_paging,
|
||||
plugin_ui_get_id(),
|
||||
{
|
||||
.title = strings.tmp.tmp,
|
||||
.text = strings.tmp.tmp2
|
||||
});
|
||||
|
||||
UX_STEP_INIT(
|
||||
ux_plugin_approval_before_step,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
display_next_plugin_item(true);
|
||||
});
|
||||
|
||||
UX_FLOW_DEF_NOCB(
|
||||
ux_plugin_approval_display_step,
|
||||
bnnn_paging,
|
||||
{
|
||||
.title = strings.tmp.tmp,
|
||||
.text = strings.tmp.tmp2
|
||||
});
|
||||
|
||||
UX_STEP_INIT(
|
||||
ux_plugin_approval_after_step,
|
||||
NULL,
|
||||
NULL,
|
||||
{
|
||||
display_next_plugin_item(false);
|
||||
});
|
||||
|
||||
UX_STEP_NOCB_INIT(
|
||||
ux_plugin_approval_fees_step,
|
||||
bnnn_paging,
|
||||
plugin_ui_compute_fees(),
|
||||
{
|
||||
.title = "Max fees",
|
||||
.text = strings.common.maxFee
|
||||
});
|
||||
|
||||
UX_FLOW_DEF_VALID(
|
||||
ux_plugin_approval_ok_step,
|
||||
pbb,
|
||||
io_seproxyhal_touch_tx_ok(NULL),
|
||||
{
|
||||
&C_icon_validate_14,
|
||||
"Accept",
|
||||
"and send",
|
||||
});
|
||||
UX_FLOW_DEF_VALID(
|
||||
ux_plugin_approval_cancel_step,
|
||||
pb,
|
||||
io_seproxyhal_touch_tx_cancel(NULL),
|
||||
{
|
||||
&C_icon_crossmark,
|
||||
"Reject",
|
||||
});
|
||||
|
||||
const ux_flow_step_t * const ux_plugin_approval_flow [] = {
|
||||
&ux_plugin_approval_intro_step,
|
||||
&ux_plugin_approval_id_step,
|
||||
&ux_plugin_approval_before_step,
|
||||
&ux_plugin_approval_display_step,
|
||||
&ux_plugin_approval_after_step,
|
||||
&ux_plugin_approval_fees_step,
|
||||
&ux_plugin_approval_ok_step,
|
||||
&ux_plugin_approval_cancel_step
|
||||
};
|
||||
|
||||
void plugin_ui_start() {
|
||||
dataContext.tokenContext.pluginUiState = PLUGIN_UI_OUTSIDE;
|
||||
dataContext.tokenContext.pluginUiCurrentItem = 0;
|
||||
ux_flow_init(0, ux_plugin_approval_flow, NULL);
|
||||
}
|
||||
Reference in New Issue
Block a user