Merge "[ATSPI] recover ForceUp failure" into devel/master
authorShinwoo Kim <cinoo.kim@samsung.com>
Mon, 27 Dec 2021 01:55:14 +0000 (01:55 +0000)
committerjoogab.yun <joogab.yun@samsung.com>
Fri, 31 Dec 2021 05:19:52 +0000 (14:19 +0900)
Change-Id: Icd90efca4f1bd5a9f2d4d1392ccb30cb1392453d

dali/devel-api/adaptor-framework/accessibility-bridge.h
dali/internal/accessibility/bridge/bridge-base.cpp
dali/internal/accessibility/bridge/bridge-impl.cpp

index 05c4f65..ba26501 100644 (file)
@@ -51,7 +51,8 @@ struct DALI_ADAPTOR_API Bridge
   enum class ForceUpResult
   {
     JUST_STARTED,
-    ALREADY_UP
+    ALREADY_UP,
+    FAILED
   };
 
   /**
index 816194a..9f88d3c 100644 (file)
@@ -116,7 +116,8 @@ void BridgeBase::UpdateRegisteredEvents()
 
 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;
   }
@@ -125,7 +126,8 @@ BridgeBase::ForceUpResult BridgeBase::ForceUp()
 
   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));
index 1a7ca8b..0d48895 100644 (file)
@@ -82,6 +82,7 @@ class BridgeImpl : public virtual BridgeBase,
   Dali::Timer                                                   mInitializeTimer;
   Dali::Timer                                                   mReadIsEnabledTimer;
   Dali::Timer                                                   mReadScreenReaderEnabledTimer;
+  Dali::Timer                                                   mForceUpTimer;
 
 public:
   BridgeImpl()
@@ -233,23 +234,33 @@ public:
     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();
     }
   }
 
@@ -264,7 +275,6 @@ public:
       mData->mHighlightActor            = {};
     }
     ForceDown();
-    StopTimer();
     if((NULL != mIdleCallback) && Dali::Adaptor::IsAvailable())
     {
       Dali::Adaptor::Get().RemoveIdle(mIdleCallback);
@@ -274,14 +284,34 @@ public:
     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();
@@ -456,6 +486,18 @@ public:
     ReadScreenReaderEnabledProperty();
   }
 
+  void SwitchBridge()
+  {
+    if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
+    {
+      ForceUp();
+    }
+    else
+    {
+      ForceDown();
+    }
+  }
+
   bool ReadIsEnabledTimerCallback()
   {
     ReadIsEnabledProperty();
@@ -479,15 +521,15 @@ public:
         }
         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();
     });
   }
 
@@ -495,14 +537,7 @@ public:
   {
     mAccessibilityStatusClient.addPropertyChangedEvent<bool>("IsEnabled", [this](bool res) {
       mIsEnabled = res;
-      if(mIsScreenReaderEnabled || mIsEnabled)
-      {
-        ForceUp();
-      }
-      else
-      {
-        ForceDown();
-      }
+      SwitchBridge();
     });
   }
 
@@ -535,15 +570,15 @@ public:
         }
         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();
     });
   }
 
@@ -551,14 +586,7 @@ public:
   {
     mAccessibilityStatusClient.addPropertyChangedEvent<bool>("ScreenReaderEnabled", [this](bool res) {
       mIsScreenReaderEnabled = res;
-      if((!mIsScreenReaderSuppressed && mIsScreenReaderEnabled) || mIsEnabled)
-      {
-        ForceUp();
-      }
-      else
-      {
-        ForceDown();
-      }
+      SwitchBridge();
     });
   }