Resolves tdf#131550 - Suppress Donate/Involve infobar if another is visible

Change-Id: I013f0a1f0aa020f10d6beb21940959508eba4547
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164082
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
(cherry picked from commit 607740654f2264e13469e4da1d020448217d7222)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164115
Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx
index 4bfb58a..e6f81d5 100644
--- a/sfx2/source/view/viewfrm.cxx
+++ b/sfx2/source/view/viewfrm.cxx
@@ -1450,88 +1450,8 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
                rBind.Invalidate( SID_RELOAD );
                rBind.Invalidate( SID_EDITDOC );

#if !ENABLE_WASM_STRIP_PINGUSER
                bool bIsHeadlessOrUITest = SfxApplication::IsHeadlessOrUITest(); //uitest.uicheck fails when the dialog is open
                bool bIsInfobarShown(false);

                //what's new infobar
                if (utl::isProductVersionUpgraded(true) && !bIsHeadlessOrUITest)
                {
                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("whatsnew", "", SfxResId(STR_WHATSNEW_TEXT), InfobarType::INFO);
                    if (pInfoBar)
                    {
                        weld::Button& rWhatsNewButton = pInfoBar->addButton();
                        rWhatsNewButton.set_label(SfxResId(STR_WHATSNEW_BUTTON));
                        rWhatsNewButton.connect_clicked(LINK(this, SfxViewFrame, WhatsNewHandler));
                    }
                }

                // show tip-of-the-day dialog if it due, but not if there is the impress modal template dialog
                // open where SdModule::ExecuteNewDocument will launch it instead when that dialog is dismissed
                if (SfxApplication::IsTipOfTheDayDue() && !bIsHeadlessOrUITest && !IsInModalMode())
                {
                    // tdf#127946 pass in argument for dialog parent
                    SfxUnoFrameItem aDocFrame(SID_FILLFRAME, GetFrame().GetFrameInterface());
                    GetDispatcher()->ExecuteList(SID_TIPOFTHEDAY, SfxCallMode::SLOT, {}, { &aDocFrame });
                }

                // inform about the community involvement
                const auto t0 = std::chrono::system_clock::now().time_since_epoch();
                const sal_Int64 nLastGetInvolvedShown = officecfg::Setup::Product::LastTimeGetInvolvedShown::get();
                const sal_Int64 nNow = std::chrono::duration_cast<std::chrono::seconds>(t0).count();
                const sal_Int64 nPeriodSec(60 * 60 * 24 * 180); // 180 days in seconds
                bool bUpdateLastTimeGetInvolvedShown = false;

                if (nLastGetInvolvedShown == 0)
                    bUpdateLastTimeGetInvolvedShown = true;
                else if (nPeriodSec < nNow && nLastGetInvolvedShown < (nNow + nPeriodSec/2) - nPeriodSec) // 90d alternating with donation
                {
                    bUpdateLastTimeGetInvolvedShown = true;

                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("getinvolved", "", SfxResId(STR_GET_INVOLVED_TEXT), InfobarType::INFO);

                    if (pInfoBar)
                    {
                        weld::Button& rGetInvolvedButton = pInfoBar->addButton();
                        rGetInvolvedButton.set_label(SfxResId(STR_GET_INVOLVED_BUTTON));
                        rGetInvolvedButton.connect_clicked(LINK(this, SfxViewFrame, GetInvolvedHandler));
                    }
                }

                if (bUpdateLastTimeGetInvolvedShown
                    && !officecfg::Setup::Product::LastTimeGetInvolvedShown::isReadOnly())
                {
                    std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
                    officecfg::Setup::Product::LastTimeGetInvolvedShown::set(nNow, batch);
                    batch->commit();
                }

                // inform about donations
                const sal_Int64 nLastDonateShown = officecfg::Setup::Product::LastTimeDonateShown::get();
                bool bUpdateLastTimeDonateShown = false;

                if (nLastDonateShown == 0)
                    bUpdateLastTimeDonateShown = true;
                else if (nPeriodSec < nNow && nLastDonateShown < nNow - nPeriodSec) // 90d alternating with getinvolved
                {
                    bUpdateLastTimeDonateShown = true;

                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("donate", "", SfxResId(STR_DONATE_TEXT), InfobarType::INFO);
                    if (pInfoBar)
                    {
                        weld::Button& rDonateButton = pInfoBar->addButton();
                        rDonateButton.set_label(SfxResId(STR_DONATE_BUTTON));
                        rDonateButton.connect_clicked(LINK(this, SfxViewFrame, DonationHandler));
                    }
                }

                if (bUpdateLastTimeDonateShown
                    && !officecfg::Setup::Product::LastTimeDonateShown::isReadOnly())
                {
                    std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
                    officecfg::Setup::Product::LastTimeDonateShown::set(nNow, batch);
                    batch->commit();
                }
#endif
                if (officecfg::Office::Common::Passwords::HasMaster::get() &&
                    officecfg::Office::Common::Passwords::StorageVersion::get() == 0)
                {
@@ -1539,6 +1459,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
                    VclPtr<SfxInfoBarWindow> pOldMasterPasswordInfoBar =
                        AppendInfoBar("oldmasterpassword", "",
                                      SfxResId(STR_REFRESH_MASTER_PASSWORD), InfobarType::DANGER, false);
                    bIsInfobarShown = true;
                    if (pOldMasterPasswordInfoBar)
                    {
                        weld::Button& rButton = pOldMasterPasswordInfoBar->addButton();
@@ -1565,10 +1486,14 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
                        (( pVSh = m_xObjSh->GetViewShell()) && (pFSh = pVSh->GetFormShell()) && pFSh->IsDesignMode())))
                {
                    AppendReadOnlyInfobar();
                    bIsInfobarShown = true;
                }

                if (!bEmbedded && m_xObjSh->Get_Impl()->getCurrentMacroExecMode() == css::document::MacroExecMode::NEVER_EXECUTE)
                {
                    AppendContainsMacrosInfobar();
                    bIsInfobarShown = true;
                }

                if (vcl::CommandInfoProvider::GetModuleIdentifier(GetFrame().GetFrameInterface()) == "com.sun.star.text.TextDocument")
                    sfx2::SfxNotebookBar::ReloadNotebookBar(u"modules/swriter/ui/");
@@ -1609,6 +1534,7 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
                            AppendInfoBar(aInfobarData.msId, aInfobarData.msPrimaryMessage,
                                  aInfobarData.msSecondaryMessage, aInfobarData.maInfobarType,
                                  aInfobarData.mbShowCloseButton);
                        bIsInfobarShown = true;

                        // tdf#148913 don't extend this condition to keep it thread-safe
                        if (pInfoBar)
@@ -1634,11 +1560,96 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
                        AppendInfoBar(aInfobarData.msId, aInfobarData.msPrimaryMessage,
                                  aInfobarData.msSecondaryMessage, aInfobarData.maInfobarType,
                                  aInfobarData.mbShowCloseButton);
                        bIsInfobarShown = true;
                    }

                    aPendingInfobars.pop_back();
                }

#if !ENABLE_WASM_STRIP_PINGUSER
                bool bIsHeadlessOrUITest = SfxApplication::IsHeadlessOrUITest(); //uitest.uicheck fails when the dialog is open

                //what's new infobar
                if (!bIsInfobarShown && utl::isProductVersionUpgraded(true) && !bIsHeadlessOrUITest)
                {
                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("whatsnew", "", SfxResId(STR_WHATSNEW_TEXT), InfobarType::INFO);
                    bIsInfobarShown = true;
                    if (pInfoBar)
                    {
                        weld::Button& rWhatsNewButton = pInfoBar->addButton();
                        rWhatsNewButton.set_label(SfxResId(STR_WHATSNEW_BUTTON));
                        rWhatsNewButton.connect_clicked(LINK(this, SfxViewFrame, WhatsNewHandler));
                    }
                }

                // show tip-of-the-day dialog if it due, but not if there is the impress modal template dialog
                // open where SdModule::ExecuteNewDocument will launch it instead when that dialog is dismissed
                if (SfxApplication::IsTipOfTheDayDue() && !bIsHeadlessOrUITest && !IsInModalMode())
                {
                    // tdf#127946 pass in argument for dialog parent
                    SfxUnoFrameItem aDocFrame(SID_FILLFRAME, GetFrame().GetFrameInterface());
                    GetDispatcher()->ExecuteList(SID_TIPOFTHEDAY, SfxCallMode::SLOT, {}, { &aDocFrame });
                }

                // inform about the community involvement
                const auto t0 = std::chrono::system_clock::now().time_since_epoch();
                const sal_Int64 nLastGetInvolvedShown = officecfg::Setup::Product::LastTimeGetInvolvedShown::get();
                const sal_Int64 nNow = std::chrono::duration_cast<std::chrono::seconds>(t0).count();
                const sal_Int64 nPeriodSec(60 * 60 * 24 * 180); // 180 days in seconds
                bool bUpdateLastTimeGetInvolvedShown = false;

                if (nLastGetInvolvedShown == 0)
                    bUpdateLastTimeGetInvolvedShown = true;
                else if (!bIsInfobarShown && nPeriodSec < nNow && nLastGetInvolvedShown < (nNow + nPeriodSec/2) - nPeriodSec) // 90d alternating with donation
                {
                    bUpdateLastTimeGetInvolvedShown = true;

                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("getinvolved", "", SfxResId(STR_GET_INVOLVED_TEXT), InfobarType::INFO);
                    bIsInfobarShown = true;
                    if (pInfoBar)
                    {
                        weld::Button& rGetInvolvedButton = pInfoBar->addButton();
                        rGetInvolvedButton.set_label(SfxResId(STR_GET_INVOLVED_BUTTON));
                        rGetInvolvedButton.connect_clicked(LINK(this, SfxViewFrame, GetInvolvedHandler));
                    }
                }

                if (bUpdateLastTimeGetInvolvedShown
                    && !officecfg::Setup::Product::LastTimeGetInvolvedShown::isReadOnly())
                {
                    std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
                    officecfg::Setup::Product::LastTimeGetInvolvedShown::set(nNow, batch);
                    batch->commit();
                }

                // inform about donations
                const sal_Int64 nLastDonateShown = officecfg::Setup::Product::LastTimeDonateShown::get();
                bool bUpdateLastTimeDonateShown = false;

                if (nLastDonateShown == 0)
                    bUpdateLastTimeDonateShown = true;
                else if (!bIsInfobarShown && nPeriodSec < nNow && nLastDonateShown < nNow - nPeriodSec) // 90d alternating with getinvolved
                {
                    bUpdateLastTimeDonateShown = true;

                    VclPtr<SfxInfoBarWindow> pInfoBar = AppendInfoBar("donate", "", SfxResId(STR_DONATE_TEXT), InfobarType::INFO);
                    if (pInfoBar)
                    {
                        weld::Button& rDonateButton = pInfoBar->addButton();
                        rDonateButton.set_label(SfxResId(STR_DONATE_BUTTON));
                        rDonateButton.connect_clicked(LINK(this, SfxViewFrame, DonationHandler));
                    }
                }

                if (bUpdateLastTimeDonateShown
                    && !officecfg::Setup::Product::LastTimeDonateShown::isReadOnly())
                {
                    std::shared_ptr<comphelper::ConfigurationChanges> batch(comphelper::ConfigurationChanges::create());
                    officecfg::Setup::Product::LastTimeDonateShown::set(nNow, batch);
                    batch->commit();
                }
#endif

                break;
            }
            default: break;