Skip to content

Commit b360269

Browse files
Merge pull request #1166 from LedgerHQ/better-context-cleaning-in-use-cases-24
Better context cleaning in use cases
2 parents 3d7d4e7 + 2b3bdb9 commit b360269

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;
@@ -3215,7 +3214,7 @@ void nbgl_useCaseNavigableContent(const char *title,
32153214
nbgl_navCallback_t navCallback,
32163215
nbgl_layoutTouchCallback_t controlsCallback)
32173216
{
3218-
reset_callbacks();
3217+
reset_callbacks_and_context();
32193218

32203219
// memorize context
32213220
onQuit = quitCallback;
@@ -3266,8 +3265,7 @@ void nbgl_useCaseGenericSettings(const char *appName,
32663265
const nbgl_contentInfoList_t *infosList,
32673266
nbgl_callback_t quitCallback)
32683267
{
3269-
reset_callbacks();
3270-
memset(&genericContext, 0, sizeof(genericContext));
3268+
reset_callbacks_and_context();
32713269

32723270
// memorize context
32733271
onQuit = quitCallback;
@@ -3343,6 +3341,8 @@ void nbgl_useCaseHomeAndSettings(
33433341
{
33443342
nbgl_homeAndSettingsContext_t *context = &bundleNavContext.homeAndSettings;
33453343

3344+
reset_callbacks_and_context();
3345+
33463346
context->appName = appName;
33473347
context->appIcon = appIcon;
33483348
context->tagline = tagline;
@@ -3373,12 +3373,12 @@ void nbgl_useCaseHomeAndSettings(
33733373
*/
33743374
void nbgl_useCaseStatus(const char *message, bool isSuccess, nbgl_callback_t quitCallback)
33753375
{
3376-
reset_callbacks();
3377-
33783376
nbgl_screenTickerConfiguration_t ticker = {.tickerCallback = &tickerCallback,
33793377
.tickerIntervale = 0, // not periodic
33803378
.tickerValue = STATUS_SCREEN_DURATION};
33813379

3380+
reset_callbacks_and_context();
3381+
33823382
onQuit = quitCallback;
33833383
if (isSuccess) {
33843384
#ifdef HAVE_PIEZO_SOUND
@@ -3477,23 +3477,22 @@ void nbgl_useCaseChoice(const nbgl_icon_details_t *icon,
34773477
const char *cancelText,
34783478
nbgl_choiceCallback_t callback)
34793479
{
3480-
reset_callbacks();
3481-
3482-
nbgl_pageConfirmationDescription_t info = {.cancelText = cancelText,
3483-
.centeredInfo.text1 = message,
3484-
.centeredInfo.text2 = subMessage,
3485-
.centeredInfo.text3 = NULL,
3486-
.centeredInfo.style = LARGE_CASE_INFO,
3487-
.centeredInfo.icon = icon,
3488-
.centeredInfo.offsetY = 0,
3489-
.confirmationText = confirmText,
3490-
.confirmationToken = CHOICE_TOKEN,
3491-
.tuneId = TUNE_TAP_CASUAL,
3492-
.modal = false};
3480+
nbgl_pageConfirmationDescription_t info = {0};
34933481
// check params
34943482
if ((confirmText == NULL) || (cancelText == NULL)) {
34953483
return;
34963484
}
3485+
reset_callbacks_and_context();
3486+
3487+
info.cancelText = cancelText;
3488+
info.centeredInfo.text1 = message;
3489+
info.centeredInfo.text2 = subMessage;
3490+
info.centeredInfo.style = LARGE_CASE_INFO;
3491+
info.centeredInfo.icon = icon;
3492+
info.confirmationText = confirmText;
3493+
info.confirmationToken = CHOICE_TOKEN;
3494+
info.tuneId = TUNE_TAP_CASUAL;
3495+
34973496
onChoice = callback;
34983497
pageContext = nbgl_pageDrawConfirmation(&pageCallback, &info);
34993498
nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
@@ -3556,6 +3555,7 @@ void nbgl_useCaseAction(const nbgl_icon_details_t *icon,
35563555
{
35573556
nbgl_pageContent_t content = {0};
35583557

3558+
reset_callbacks_and_context();
35593559
// memorize callback
35603560
onAction = callback;
35613561

@@ -3588,8 +3588,6 @@ void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
35883588
nbgl_callback_t continueCallback,
35893589
nbgl_callback_t rejectCallback)
35903590
{
3591-
reset_callbacks();
3592-
35933591
nbgl_pageInfoDescription_t info = {.footerText = rejectText,
35943592
.footerToken = QUIT_TOKEN,
35953593
.tapActionText = NULL,
@@ -3598,14 +3596,17 @@ void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
35983596
.topRightStyle = NO_BUTTON_STYLE,
35993597
.actionButtonText = NULL,
36003598
.tuneId = TUNE_TAP_CASUAL};
3601-
info.centeredInfo.icon = icon;
3602-
info.centeredInfo.text1 = reviewTitle;
3603-
info.centeredInfo.text2 = reviewSubTitle;
3604-
info.centeredInfo.text3 = "Swipe to review";
3605-
info.centeredInfo.style = LARGE_CASE_GRAY_INFO;
3606-
info.centeredInfo.offsetY = 0;
3607-
onQuit = rejectCallback;
3608-
onContinue = continueCallback;
3599+
3600+
reset_callbacks_and_context();
3601+
3602+
info.centeredInfo.icon = icon;
3603+
info.centeredInfo.text1 = reviewTitle;
3604+
info.centeredInfo.text2 = reviewSubTitle;
3605+
info.centeredInfo.text3 = "Swipe to review";
3606+
info.centeredInfo.style = LARGE_CASE_GRAY_INFO;
3607+
info.centeredInfo.offsetY = 0;
3608+
onQuit = rejectCallback;
3609+
onContinue = continueCallback;
36093610

36103611
#ifdef HAVE_PIEZO_SOUND
36113612
// Play notification sound
@@ -3627,7 +3628,7 @@ void nbgl_useCaseRegularReview(uint8_t initPage,
36273628
nbgl_navCallback_t navCallback,
36283629
nbgl_choiceCallback_t choiceCallback)
36293630
{
3630-
reset_callbacks();
3631+
reset_callbacks_and_context();
36313632

36323633
// memorize context
36333634
onChoice = choiceCallback;
@@ -3662,8 +3663,7 @@ void nbgl_useCaseStaticReview(const nbgl_contentTagValueList_t *tagValueList,
36623663
{
36633664
uint8_t offset = 0;
36643665

3665-
reset_callbacks();
3666-
memset(&genericContext, 0, sizeof(genericContext));
3666+
reset_callbacks_and_context();
36673667

36683668
// memorize context
36693669
onChoice = callback;
@@ -3719,8 +3719,7 @@ void nbgl_useCaseStaticReviewLight(const nbgl_contentTagValueList_t *tagValueLis
37193719
{
37203720
uint8_t offset = 0;
37213721

3722-
reset_callbacks();
3723-
memset(&genericContext, 0, sizeof(genericContext));
3722+
reset_callbacks_and_context();
37243723

37253724
// memorize context
37263725
onChoice = callback;
@@ -3863,7 +3862,9 @@ void nbgl_useCaseAdvancedReview(nbgl_operationType_t operationType,
38633862
const nbgl_warning_t *warning,
38643863
nbgl_choiceCallback_t choiceCallback)
38653864
{
3865+
reset_callbacks_and_context();
38663866
memset(&reviewWithWarnCtx, 0, sizeof(reviewWithWarnCtx));
3867+
38673868
// memorize tipBox because it can be in the call stack of the caller
38683869
if (tipBox != NULL) {
38693870
memcpy(&activeTipBox, tipBox, sizeof(activeTipBox));
@@ -3973,8 +3974,7 @@ void nbgl_useCaseGenericReview(const nbgl_genericContents_t *contents,
39733974
const char *rejectText,
39743975
nbgl_callback_t rejectCallback)
39753976
{
3976-
reset_callbacks();
3977-
memset(&genericContext, 0, sizeof(genericContext));
3977+
reset_callbacks_and_context();
39783978

39793979
// memorize context
39803980
onQuit = rejectCallback;
@@ -4220,8 +4220,7 @@ void nbgl_useCaseAddressConfirmationExt(const char *addres
42204220
nbgl_choiceCallback_t callback,
42214221
const nbgl_contentTagValueList_t *tagValueList)
42224222
{
4223-
reset_callbacks();
4224-
memset(&genericContext, 0, sizeof(genericContext));
4223+
reset_callbacks_and_context();
42254224
memset(&addressConfirmationContext, 0, sizeof(addressConfirmationContext));
42264225

42274226
// save context
@@ -4271,8 +4270,8 @@ void nbgl_useCaseAddressReview(const char *address,
42714270
const char *reviewSubTitle,
42724271
nbgl_choiceCallback_t choiceCallback)
42734272
{
4274-
reset_callbacks();
4275-
memset(&genericContext, 0, sizeof(genericContext));
4273+
reset_callbacks_and_context();
4274+
42764275
// release a potential modal
42774276
if (addressConfirmationContext.modalLayout) {
42784277
nbgl_layoutRelease(addressConfirmationContext.modalLayout);

0 commit comments

Comments
 (0)