Skip to content

Commit 4256baa

Browse files
Better context cleaning in NBGL use cases to avoid issue with spinner
1 parent 77bb040 commit 4256baa

File tree

1 file changed

+47
-48
lines changed

1 file changed

+47
-48
lines changed

lib_nbgl/src/nbgl_use_case.c

Lines changed: 47 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static void useCaseHomeExt(const char *appName,
389389
nbgl_callback_t quitCallback);
390390
static void displayDetails(const char *tag, const char *value, bool wrapping);
391391

392-
static void reset_callbacks(void)
392+
static void reset_callbacks_and_context(void)
393393
{
394394
onQuit = NULL;
395395
onContinue = NULL;
@@ -398,10 +398,10 @@ static void reset_callbacks(void)
398398
onControls = NULL;
399399
onContentAction = NULL;
400400
onChoice = NULL;
401-
onModalConfirm = NULL;
402401
#ifdef NBGL_KEYPAD
403402
onValidatePin = NULL;
404403
#endif
404+
memset(&genericContext, 0, sizeof(genericContext));
405405
}
406406

407407
// Helper to set genericContext page info
@@ -648,6 +648,7 @@ static void pageModalCallback(int token, uint8_t index)
648648
if (index == 0) {
649649
if (onModalConfirm != NULL) {
650650
onModalConfirm();
651+
onModalConfirm = NULL;
651652
}
652653
}
653654
else {
@@ -1810,7 +1811,7 @@ static void keypadGenericUseCase(const char *title,
18101811
return;
18111812
}
18121813

1813-
reset_callbacks();
1814+
reset_callbacks_and_context();
18141815
// reset the keypad context
18151816
memset(&keypadContext, 0, sizeof(KeypadContext_t));
18161817

@@ -2650,8 +2651,7 @@ static void useCaseReview(nbgl_operationType_t operationType,
26502651
bool isLight,
26512652
bool playNotifSound)
26522653
{
2653-
reset_callbacks();
2654-
memset(&genericContext, 0, sizeof(genericContext));
2654+
reset_callbacks_and_context();
26552655

26562656
bundleNavContext.review.operationType = operationType;
26572657
bundleNavContext.review.choiceCallback = choiceCallback;
@@ -2715,8 +2715,7 @@ static void useCaseReviewStreamingStart(nbgl_operationType_t operationType
27152715
nbgl_choiceCallback_t choiceCallback,
27162716
bool playNotifSound)
27172717
{
2718-
reset_callbacks();
2719-
memset(&genericContext, 0, sizeof(genericContext));
2718+
reset_callbacks_and_context();
27202719

27212720
bundleNavContext.reviewStreaming.operationType = operationType;
27222721
bundleNavContext.reviewStreaming.choiceCallback = choiceCallback;
@@ -2780,8 +2779,6 @@ static void useCaseHomeExt(const char *appName,
27802779
nbgl_callback_t topRightCallback,
27812780
nbgl_callback_t quitCallback)
27822781
{
2783-
reset_callbacks();
2784-
27852782
nbgl_pageInfoDescription_t info = {.centeredInfo.icon = appIcon,
27862783
.centeredInfo.text1 = appName,
27872784
.centeredInfo.text3 = NULL,
@@ -2793,6 +2790,8 @@ static void useCaseHomeExt(const char *appName,
27932790
.topRightStyle = withSettings ? SETTINGS_ICON : INFO_ICON,
27942791
.topRightToken = CONTINUE_TOKEN,
27952792
.tuneId = TUNE_TAP_CASUAL};
2793+
reset_callbacks_and_context();
2794+
27962795
if ((homeAction->text != NULL) || (homeAction->icon != NULL)) {
27972796
// trick to use ACTION_BUTTON_TOKEN for action and quit, with index used to distinguish
27982797
info.bottomButtonsToken = ACTION_BUTTON_TOKEN;
@@ -3212,7 +3211,7 @@ void nbgl_useCaseNavigableContent(const char *title,
32123211
nbgl_navCallback_t navCallback,
32133212
nbgl_layoutTouchCallback_t controlsCallback)
32143213
{
3215-
reset_callbacks();
3214+
reset_callbacks_and_context();
32163215

32173216
// memorize context
32183217
onQuit = quitCallback;
@@ -3263,8 +3262,7 @@ void nbgl_useCaseGenericSettings(const char *appName,
32633262
const nbgl_contentInfoList_t *infosList,
32643263
nbgl_callback_t quitCallback)
32653264
{
3266-
reset_callbacks();
3267-
memset(&genericContext, 0, sizeof(genericContext));
3265+
reset_callbacks_and_context();
32683266

32693267
// memorize context
32703268
onQuit = quitCallback;
@@ -3340,6 +3338,8 @@ void nbgl_useCaseHomeAndSettings(
33403338
{
33413339
nbgl_homeAndSettingsContext_t *context = &bundleNavContext.homeAndSettings;
33423340

3341+
reset_callbacks_and_context();
3342+
33433343
context->appName = appName;
33443344
context->appIcon = appIcon;
33453345
context->tagline = tagline;
@@ -3370,12 +3370,12 @@ void nbgl_useCaseHomeAndSettings(
33703370
*/
33713371
void nbgl_useCaseStatus(const char *message, bool isSuccess, nbgl_callback_t quitCallback)
33723372
{
3373-
reset_callbacks();
3374-
33753373
nbgl_screenTickerConfiguration_t ticker = {.tickerCallback = &tickerCallback,
33763374
.tickerIntervale = 0, // not periodic
33773375
.tickerValue = STATUS_SCREEN_DURATION};
33783376

3377+
reset_callbacks_and_context();
3378+
33793379
onQuit = quitCallback;
33803380
if (isSuccess) {
33813381
#ifdef HAVE_PIEZO_SOUND
@@ -3474,23 +3474,22 @@ void nbgl_useCaseChoice(const nbgl_icon_details_t *icon,
34743474
const char *cancelText,
34753475
nbgl_choiceCallback_t callback)
34763476
{
3477-
reset_callbacks();
3478-
3479-
nbgl_pageConfirmationDescription_t info = {.cancelText = cancelText,
3480-
.centeredInfo.text1 = message,
3481-
.centeredInfo.text2 = subMessage,
3482-
.centeredInfo.text3 = NULL,
3483-
.centeredInfo.style = LARGE_CASE_INFO,
3484-
.centeredInfo.icon = icon,
3485-
.centeredInfo.offsetY = 0,
3486-
.confirmationText = confirmText,
3487-
.confirmationToken = CHOICE_TOKEN,
3488-
.tuneId = TUNE_TAP_CASUAL,
3489-
.modal = false};
3477+
nbgl_pageConfirmationDescription_t info = {0};
34903478
// check params
34913479
if ((confirmText == NULL) || (cancelText == NULL)) {
34923480
return;
34933481
}
3482+
reset_callbacks_and_context();
3483+
3484+
info.cancelText = cancelText;
3485+
info.centeredInfo.text1 = message;
3486+
info.centeredInfo.text2 = subMessage;
3487+
info.centeredInfo.style = LARGE_CASE_INFO;
3488+
info.centeredInfo.icon = icon;
3489+
info.confirmationText = confirmText;
3490+
info.confirmationToken = CHOICE_TOKEN;
3491+
info.tuneId = TUNE_TAP_CASUAL;
3492+
34943493
onChoice = callback;
34953494
pageContext = nbgl_pageDrawConfirmation(&pageCallback, &info);
34963495
nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
@@ -3553,6 +3552,7 @@ void nbgl_useCaseAction(const nbgl_icon_details_t *icon,
35533552
{
35543553
nbgl_pageContent_t content = {0};
35553554

3555+
reset_callbacks_and_context();
35563556
// memorize callback
35573557
onAction = callback;
35583558

@@ -3585,8 +3585,6 @@ void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
35853585
nbgl_callback_t continueCallback,
35863586
nbgl_callback_t rejectCallback)
35873587
{
3588-
reset_callbacks();
3589-
35903588
nbgl_pageInfoDescription_t info = {.footerText = rejectText,
35913589
.footerToken = QUIT_TOKEN,
35923590
.tapActionText = NULL,
@@ -3595,14 +3593,17 @@ void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
35953593
.topRightStyle = NO_BUTTON_STYLE,
35963594
.actionButtonText = NULL,
35973595
.tuneId = TUNE_TAP_CASUAL};
3598-
info.centeredInfo.icon = icon;
3599-
info.centeredInfo.text1 = reviewTitle;
3600-
info.centeredInfo.text2 = reviewSubTitle;
3601-
info.centeredInfo.text3 = "Swipe to review";
3602-
info.centeredInfo.style = LARGE_CASE_GRAY_INFO;
3603-
info.centeredInfo.offsetY = 0;
3604-
onQuit = rejectCallback;
3605-
onContinue = continueCallback;
3596+
3597+
reset_callbacks_and_context();
3598+
3599+
info.centeredInfo.icon = icon;
3600+
info.centeredInfo.text1 = reviewTitle;
3601+
info.centeredInfo.text2 = reviewSubTitle;
3602+
info.centeredInfo.text3 = "Swipe to review";
3603+
info.centeredInfo.style = LARGE_CASE_GRAY_INFO;
3604+
info.centeredInfo.offsetY = 0;
3605+
onQuit = rejectCallback;
3606+
onContinue = continueCallback;
36063607

36073608
#ifdef HAVE_PIEZO_SOUND
36083609
// Play notification sound
@@ -3624,7 +3625,7 @@ void nbgl_useCaseRegularReview(uint8_t initPage,
36243625
nbgl_navCallback_t navCallback,
36253626
nbgl_choiceCallback_t choiceCallback)
36263627
{
3627-
reset_callbacks();
3628+
reset_callbacks_and_context();
36283629

36293630
// memorize context
36303631
onChoice = choiceCallback;
@@ -3659,8 +3660,7 @@ void nbgl_useCaseStaticReview(const nbgl_contentTagValueList_t *tagValueList,
36593660
{
36603661
uint8_t offset = 0;
36613662

3662-
reset_callbacks();
3663-
memset(&genericContext, 0, sizeof(genericContext));
3663+
reset_callbacks_and_context();
36643664

36653665
// memorize context
36663666
onChoice = callback;
@@ -3716,8 +3716,7 @@ void nbgl_useCaseStaticReviewLight(const nbgl_contentTagValueList_t *tagValueLis
37163716
{
37173717
uint8_t offset = 0;
37183718

3719-
reset_callbacks();
3720-
memset(&genericContext, 0, sizeof(genericContext));
3719+
reset_callbacks_and_context();
37213720

37223721
// memorize context
37233722
onChoice = callback;
@@ -3860,7 +3859,9 @@ void nbgl_useCaseAdvancedReview(nbgl_operationType_t operationType,
38603859
const nbgl_warning_t *warning,
38613860
nbgl_choiceCallback_t choiceCallback)
38623861
{
3862+
reset_callbacks_and_context();
38633863
memset(&reviewWithWarnCtx, 0, sizeof(reviewWithWarnCtx));
3864+
38643865
// memorize tipBox because it can be in the call stack of the caller
38653866
if (tipBox != NULL) {
38663867
memcpy(&activeTipBox, tipBox, sizeof(activeTipBox));
@@ -3970,8 +3971,7 @@ void nbgl_useCaseGenericReview(const nbgl_genericContents_t *contents,
39703971
const char *rejectText,
39713972
nbgl_callback_t rejectCallback)
39723973
{
3973-
reset_callbacks();
3974-
memset(&genericContext, 0, sizeof(genericContext));
3974+
reset_callbacks_and_context();
39753975

39763976
// memorize context
39773977
onQuit = rejectCallback;
@@ -4217,8 +4217,7 @@ void nbgl_useCaseAddressConfirmationExt(const char *addres
42174217
nbgl_choiceCallback_t callback,
42184218
const nbgl_contentTagValueList_t *tagValueList)
42194219
{
4220-
reset_callbacks();
4221-
memset(&genericContext, 0, sizeof(genericContext));
4220+
reset_callbacks_and_context();
42224221
memset(&addressConfirmationContext, 0, sizeof(addressConfirmationContext));
42234222

42244223
// save context
@@ -4268,8 +4267,8 @@ void nbgl_useCaseAddressReview(const char *address,
42684267
const char *reviewSubTitle,
42694268
nbgl_choiceCallback_t choiceCallback)
42704269
{
4271-
reset_callbacks();
4272-
memset(&genericContext, 0, sizeof(genericContext));
4270+
reset_callbacks_and_context();
4271+
42734272
// release a potential modal
42744273
if (addressConfirmationContext.modalLayout) {
42754274
nbgl_layoutRelease(addressConfirmationContext.modalLayout);

0 commit comments

Comments
 (0)