hwc2: Do not flush on empty layer stack.

-- Some applications can take time to queue buffers during switches ie;
   HDR to Non-HDR, Secure to Non-secure etc; Even though layer stack
   is empty it is OK to display previous frame.

-- Composer Client explicitly clears layers upon SurfaceFlinger death.
   Since client isn't active, chances of getting a new frame is very unlikey.
   Trigger flush so that content gets cleared.

Change-Id: If91135b3d5ea6d0f8842c7ef75547a68002c70ff
CRs-Fixed: 2489780
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index ba98ef7..177af7a 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -367,6 +367,7 @@
   virtual void ClearPendingPowerMode() {
     pending_power_mode_ = current_power_mode_;
   };
+  virtual void NotifyClientStatus(bool connected) { client_connected_ = connected; }
 
  protected:
   static uint32_t throttling_refresh_rate_;
@@ -450,6 +451,7 @@
   bool skip_commit_ = false;
   std::map<uint32_t, DisplayConfigVariableInfo> variable_config_map_;
   std::vector<uint32_t> hwc_config_map_;
+  bool client_connected_ = true;
 
  private:
   void DumpInputBuffers(void);
diff --git a/composer/hwc_display_builtin.cpp b/composer/hwc_display_builtin.cpp
index b4c2290..63bd2d8 100644
--- a/composer/hwc_display_builtin.cpp
+++ b/composer/hwc_display_builtin.cpp
@@ -203,7 +203,7 @@
 
   if (layer_set_.empty()) {
     // Avoid flush for Command mode panel.
-    flush_ = !IsDisplayCommandMode();
+    flush_ = !client_connected_;
     validated_ = true;
     return status;
   }
diff --git a/composer/hwc_display_pluggable.cpp b/composer/hwc_display_pluggable.cpp
index b04e931..8c98a2a 100644
--- a/composer/hwc_display_pluggable.cpp
+++ b/composer/hwc_display_pluggable.cpp
@@ -128,7 +128,7 @@
   BuildLayerStack();
 
   if (layer_set_.empty()) {
-    flush_ = true;
+    flush_ = !client_connected_;
     validated_ = true;
     return status;
   }
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index 03f31ba..fd2377d 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -775,6 +775,9 @@
         callbacks_.Hotplug(client_id, HWC2::Connection::Connected);
       }
     }
+    client_connected_ = !!pointer;
+    // Notfify all displays.
+    NotifyClientStatus(client_connected_);
   }
   need_invalidate_ = false;
 }
@@ -3182,4 +3185,14 @@
   return INT32(error);
 }
 
+void HWCSession::NotifyClientStatus(bool connected) {
+  for (uint32_t i = 0; i < HWCCallbacks::kNumDisplays; i++) {
+    if (!hwc_display_[i]) {
+      continue;
+    }
+    SCOPE_LOCK(locker_[i]);
+    hwc_display_[i]->NotifyClientStatus(connected);
+  }
+}
+
 }  // namespace sdm
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index 0315401..b02895d 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -439,6 +439,7 @@
   bool IsPluggableDisplayConnected();
   hwc2_display_t GetActiveBuiltinDisplay();
   void HandlePendingRefresh();
+  void NotifyClientStatus(bool connected);
 
   CoreInterface *core_intf_ = nullptr;
   HWCDisplay *hwc_display_[HWCCallbacks::kNumDisplays] = {nullptr};