BridgeBase::ForceUpResult BridgeBase::ForceUp()
{
- if(Bridge::ForceUp() == ForceUpResult::ALREADY_UP)
+ //TODO: checking mBusName is enough? or a new variable to check bridge state?
+ if(Bridge::ForceUp() == ForceUpResult::ALREADY_UP && !GetBusName().empty())
{
return ForceUpResult::ALREADY_UP;
}
if(!addr)
{
- throw std::domain_error{std::string("failed at call '") + dbusLocators::atspi::GET_ADDRESS + "': " + addr.getError().message};
+ DALI_LOG_ERROR("failed at call '%s': %s\n", dbusLocators::atspi::GET_ADDRESS, addr.getError().message.c_str());
+ return ForceUpResult::FAILED;
}
mConnectionPtr = DBusWrapper::Installed()->eldbus_address_connection_get_impl(std::get<0>(addr));
Dali::Timer mInitializeTimer;
Dali::Timer mReadIsEnabledTimer;
Dali::Timer mReadScreenReaderEnabledTimer;
+ Dali::Timer mForceUpTimer;
public:
BridgeImpl()
mDirectReadingCallbacks.clear();
mApplication.mChildren.clear();
mApplication.mWindows.clear();
+ ClearTimer();
}
- void StopTimer()
+ void ClearTimer()
{
if(mInitializeTimer)
{
mInitializeTimer.Stop();
+ mInitializeTimer.Reset();
}
if(mReadIsEnabledTimer)
{
mReadIsEnabledTimer.Stop();
+ mReadIsEnabledTimer.Reset();
}
if(mReadScreenReaderEnabledTimer)
{
mReadScreenReaderEnabledTimer.Stop();
+ mReadScreenReaderEnabledTimer.Reset();
+ }
+
+ if(mForceUpTimer)
+ {
+ mForceUpTimer.Stop();
+ mForceUpTimer.Reset();
}
}
mData->mHighlightActor = {};
}
ForceDown();
- StopTimer();
if((NULL != mIdleCallback) && Dali::Adaptor::IsAvailable())
{
Dali::Adaptor::Get().RemoveIdle(mIdleCallback);
mConnectionPtr = {};
}
+ bool ForceUpTimerCallback()
+ {
+ if(ForceUp() != ForceUpResult::FAILED)
+ {
+ return false;
+ }
+ return true;
+ }
+
/**
* @copydoc Dali::Accessibility::Bridge::ForceUp()
*/
ForceUpResult ForceUp() override
{
- if(BridgeAccessible::ForceUp() == ForceUpResult::ALREADY_UP)
+ auto forceUpResult = BridgeAccessible::ForceUp();
+ if(forceUpResult == ForceUpResult::ALREADY_UP)
{
- return ForceUpResult::ALREADY_UP;
+ return forceUpResult;
+ }
+ else if(forceUpResult == ForceUpResult::FAILED)
+ {
+ if(!mForceUpTimer)
+ {
+ mForceUpTimer = Dali::Timer::New(RETRY_INTERVAL);
+ mForceUpTimer.TickSignal().Connect(this, &BridgeImpl::ForceUpTimerCallback);
+ mForceUpTimer.Start();
+ }
+ return forceUpResult;
}
BridgeObject::RegisterInterfaces();
ReadScreenReaderEnabledProperty();
}
+ void SwitchBridge()
+ {
+ if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
+ {
+ ForceUp();
+ }
+ else
+ {
+ ForceDown();
+ }
+ }
+
bool ReadIsEnabledTimerCallback()
{
ReadIsEnabledProperty();
}
return;
}
- mIsEnabled = std::get<0>(msg);
- if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
- {
- ForceUp();
- }
- else
+
+ if(mReadIsEnabledTimer)
{
- ForceDown();
+ mReadIsEnabledTimer.Stop();
+ mReadIsEnabledTimer.Reset();
}
+
+ mIsEnabled = std::get<0>(msg);
+ SwitchBridge();
});
}
{
mAccessibilityStatusClient.addPropertyChangedEvent<bool>("IsEnabled", [this](bool res) {
mIsEnabled = res;
- if(mIsScreenReaderEnabled || mIsEnabled)
- {
- ForceUp();
- }
- else
- {
- ForceDown();
- }
+ SwitchBridge();
});
}
}
return;
}
- mIsScreenReaderEnabled = std::get<0>(msg);
- if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
- {
- ForceUp();
- }
- else
+
+ if(mReadScreenReaderEnabledTimer)
{
- ForceDown();
+ mReadScreenReaderEnabledTimer.Stop();
+ mReadScreenReaderEnabledTimer.Reset();
}
+
+ mIsScreenReaderEnabled = std::get<0>(msg);
+ SwitchBridge();
});
}
{
mAccessibilityStatusClient.addPropertyChangedEvent<bool>("ScreenReaderEnabled", [this](bool res) {
mIsScreenReaderEnabled = res;
- if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
- {
- ForceUp();
- }
- else
- {
- ForceDown();
- }
+ SwitchBridge();
});
}