composer: Implement QtiComposerClient as Singleton

Create QtiComposerClient instance for one time,
Second time, if instance is deleted previously,
create new instance else do not create the same
instance multiple times.

Change-Id: Idcd650a779b31c4c4985ca5f5ed980f0398f469f
CRs-Fixed: 2499403
diff --git a/composer/QtiComposer.cpp b/composer/QtiComposer.cpp
index db7024d..4d0013d 100644
--- a/composer/QtiComposer.cpp
+++ b/composer/QtiComposer.cpp
@@ -38,6 +38,8 @@
 namespace V2_0 {
 namespace implementation {
 
+QtiComposerClient* QtiComposerClient::qti_composerclient_instance_ = nullptr;
+
 QtiComposer::QtiComposer() {
   hwc_session_ = HWCSession::GetInstance();
 }
@@ -99,7 +101,7 @@
 
 Return<void> QtiComposer::createClient(createClient_cb _hidl_cb) {
   // TODO(user): Implement combinedly w.r.t createClient_2_3
-  sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+  sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
   if (!composer_client) {
     _hidl_cb(Error::NO_RESOURCES, nullptr);
     return Void();
@@ -112,7 +114,7 @@
 
 // Methods from ::android::hardware::graphics::composer::V2_3::IComposer follow.
 Return<void> QtiComposer::createClient_2_3(createClient_2_3_cb _hidl_cb) {
-  sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+  sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
   if (!composer_client) {
     _hidl_cb(Error::NO_RESOURCES, nullptr);
     return Void();
diff --git a/composer/QtiComposerClient.cpp b/composer/QtiComposerClient.cpp
index ea209ab..e3b330b 100644
--- a/composer/QtiComposerClient.cpp
+++ b/composer/QtiComposerClient.cpp
@@ -1845,7 +1845,7 @@
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
 IQtiComposerClient* HIDL_FETCH_IQtiComposerClient(const char* /* name */) {
-  return new QtiComposerClient();
+  return QtiComposerClient::CreateQtiComposerClientInstance();
 }
 
 }  // namespace implementation
diff --git a/composer/QtiComposerClient.h b/composer/QtiComposerClient.h
index 741dbf6..ed52eba 100644
--- a/composer/QtiComposerClient.h
+++ b/composer/QtiComposerClient.h
@@ -82,10 +82,11 @@
 };
 
 class QtiComposerClient : public IQtiComposerClient {
- public:
   QtiComposerClient();
   virtual ~QtiComposerClient();
+  static QtiComposerClient* qti_composerclient_instance_;
 
+ public:
   // Methods from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
   Return<void> registerCallback(const sp<composer_V2_1::IComposerCallback>& callback) override;
   Return<uint32_t> getMaxVirtualDisplayCount() override;
@@ -206,6 +207,20 @@
     return (mCapabilities.count(capability) > 0);
   }
 
+  static QtiComposerClient* CreateQtiComposerClientInstance() {
+    if (!qti_composerclient_instance_) {
+      qti_composerclient_instance_ = new QtiComposerClient();
+      return qti_composerclient_instance_;
+    }
+    return nullptr;
+  }
+
+  void onLastStrongRef(const void* id) {
+    if (qti_composerclient_instance_) {
+      qti_composerclient_instance_ = nullptr;
+    }
+  }
+
  private:
   struct LayerBuffers {
     std::vector<BufferCacheEntry> Buffers;