Update onStateChange notification flow am: 91bfb8cdd5 am: dd1611c7f4 am: 16f19c4a68

Original change: https://android-review.googlesource.com/c/platform/hardware/st/secure_element2/+/1677790

Change-Id: I72c33f32b958c2331413be347b9054839325e975
diff --git a/secure_element/1.0/GtoService.cpp b/secure_element/1.0/GtoService.cpp
index 897a004..a003c92 100644
--- a/secure_element/1.0/GtoService.cpp
+++ b/secure_element/1.0/GtoService.cpp
@@ -26,7 +26,7 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Thales Secure Element HAL for eSE1 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE1 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE1");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
diff --git a/secure_element/1.0/GtoService_ese2.cpp b/secure_element/1.0/GtoService_ese2.cpp
index 2fc55cb..4ababbd 100644
--- a/secure_element/1.0/GtoService_ese2.cpp
+++ b/secure_element/1.0/GtoService_ese2.cpp
@@ -26,7 +26,7 @@
 using android::status_t;
 
 int main() {
-  ALOGD("Thales Secure Element HAL for eSE2 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE2 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE2");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE2");
diff --git a/secure_element/1.0/SecureElement.cpp b/secure_element/1.0/SecureElement.cpp
index 471c6b6..0f02092 100644
--- a/secure_element/1.0/SecureElement.cpp
+++ b/secure_element/1.0/SecureElement.cpp
@@ -82,11 +82,16 @@
 sp<V1_0::ISecureElementHalCallback> SecureElement::internalClientCallback = nullptr;
 int SecureElement::initializeSE() {
 
-    //struct settings *settings;
     int n;
 
     ALOGD("SecureElement:%s start", __func__);
 
+    if (checkSeUp) {
+        ALOGD("SecureElement:%s Already initialized", __func__);
+        ALOGD("SecureElement:%s end", __func__);
+        return EXIT_SUCCESS;
+    }
+
     if (se_gto_new(&ctx) < 0) {
         ALOGE("SecureElement:%s se_gto_new FATAL:%s", __func__,strerror(errno));
 
@@ -103,14 +108,12 @@
     }
 
     if (resetSE() < 0) {
+        se_gto_close(ctx);
+        ctx = NULL;
         return EXIT_FAILURE;
     }
 
     checkSeUp = true;
-    turnOffSE = false;
-
-    internalClientCallback->onStateChange(true);
-    turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
@@ -121,7 +124,7 @@
 
     ALOGD("SecureElement:%s start", __func__);
     if (clientCallback == nullptr) {
-        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        ALOGE("SecureElement:%s clientCallback == nullptr", __func__);
         return Void();
     } else {
         internalClientCallback = clientCallback;
@@ -133,11 +136,11 @@
     if (initializeSE() != EXIT_SUCCESS) {
         ALOGE("SecureElement:%s initializeSE Failed", __func__);
         clientCallback->onStateChange(false);
+    } else {
+        ALOGD("SecureElement:%s initializeSE Success", __func__);
+        clientCallback->onStateChange(true);
     }
 
-    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-    }
     ALOGD("SecureElement:%s end", __func__);
 
     return Void();
@@ -204,6 +207,7 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            internalClientCallback->onStateChange(false);
             _hidl_cb(resApduBuff, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -355,6 +359,7 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            internalClientCallback->onStateChange(false);
             _hidl_cb(result, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -617,13 +622,14 @@
 }
 
 void SecureElement::serviceDied(uint64_t, const wp<IBase>&) {
-  ALOGE("SecureElement:%s SecureElement serviceDied", __func__);
+  ALOGD("SecureElement:%s SecureElement serviceDied", __func__);
   SecureElementStatus mSecureElementStatus = deinitializeSE();
   if (mSecureElementStatus != SecureElementStatus::SUCCESS) {
     ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
   }
   if (internalClientCallback != nullptr) {
     internalClientCallback->unlinkToDeath(this);
+    internalClientCallback = nullptr;
   }
 }
 
@@ -633,9 +639,10 @@
 
     ALOGD("SecureElement:%s start", __func__);
 
-    if(turnOffSE){
+    if(checkSeUp){
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
+            internalClientCallback->onStateChange(false);
         } else {
             ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -643,7 +650,6 @@
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
-        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/secure_element/1.0/SecureElement.h b/secure_element/1.0/SecureElement.h
index 69e308e..79720df 100644
--- a/secure_element/1.0/SecureElement.h
+++ b/secure_element/1.0/SecureElement.h
@@ -49,7 +49,6 @@
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
     bool checkSeUp = false;
-    bool turnOffSE = true;
     uint8_t atr[32];
     uint8_t atr_size;
     char config_filename[100];
diff --git a/secure_element/1.1/GtoService.cpp b/secure_element/1.1/GtoService.cpp
index a1157b7..5aeca90 100644
--- a/secure_element/1.1/GtoService.cpp
+++ b/secure_element/1.1/GtoService.cpp
@@ -27,7 +27,7 @@
 
 int main() {
   ALOGD("android::hardware::secure_element::V1_1 is starting.");
-  ALOGD("Thales Secure Element HAL for eSE2 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE2 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE1");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
diff --git a/secure_element/1.1/GtoService_ese2.cpp b/secure_element/1.1/GtoService_ese2.cpp
index 6f0efdf..2ff983e 100644
--- a/secure_element/1.1/GtoService_ese2.cpp
+++ b/secure_element/1.1/GtoService_ese2.cpp
@@ -27,7 +27,7 @@
 
 int main() {
   ALOGD("android::hardware::secure_element::V1_1 is starting.");
-  ALOGD("Thales Secure Element HAL for eSE2 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE2 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE2");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE2");
diff --git a/secure_element/1.1/SecureElement.cpp b/secure_element/1.1/SecureElement.cpp
index 6ad56ba..8e5bceb 100644
--- a/secure_element/1.1/SecureElement.cpp
+++ b/secure_element/1.1/SecureElement.cpp
@@ -83,11 +83,16 @@
 sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
-    //struct settings *settings;
     int n;
 
     ALOGD("SecureElement:%s start", __func__);
 
+    if (checkSeUp) {
+        ALOGD("SecureElement:%s Already initialized", __func__);
+        ALOGD("SecureElement:%s end", __func__);
+        return EXIT_SUCCESS;
+    }
+
     if (se_gto_new(&ctx) < 0) {
         ALOGE("SecureElement:%s se_gto_new FATAL:%s", __func__,strerror(errno));
 
@@ -104,17 +109,12 @@
     }
 
     if (resetSE() < 0) {
+        se_gto_close(ctx);
+        ctx = NULL;
         return EXIT_FAILURE;
     }
 
     checkSeUp = true;
-    turnOffSE = false;
-
-
-    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
-    else internalClientCallback->onStateChange(true);
-
-    turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
@@ -124,7 +124,7 @@
 
     ALOGD("SecureElement:%s start", __func__);
     if (clientCallback == nullptr) {
-        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        ALOGE("SecureElement:%s clientCallback == nullptr", __func__);
         return Void();
     } else {
         internalClientCallback = clientCallback;
@@ -137,11 +137,11 @@
     if (initializeSE() != EXIT_SUCCESS) {
         ALOGE("SecureElement:%s initializeSE Failed", __func__);
         clientCallback->onStateChange(false);
+    } else {
+        ALOGD("SecureElement:%s initializeSE Success", __func__);
+        clientCallback->onStateChange(true);
     }
 
-    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-    }
     ALOGD("SecureElement:%s end", __func__);
 
     return Void();
@@ -151,7 +151,7 @@
 
     ALOGD("SecureElement:%s start", __func__);
     if (clientCallback == nullptr) {
-        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        ALOGE("SecureElement:%s clientCallback == nullptr", __func__);
         return Void();
     } else {
         internalClientCallback = nullptr;
@@ -163,12 +163,12 @@
 
     if (initializeSE() != EXIT_SUCCESS) {
         ALOGE("SecureElement:%s initializeSE Failed", __func__);
-        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        clientCallback->onStateChange_1_1(false, "SE Initialized failed");
+    } else {
+        ALOGD("SecureElement:%s initializeSE Success", __func__);
+        clientCallback->onStateChange_1_1(true, "SE Initialized");
     }
 
-    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-    }
     ALOGD("SecureElement:%s end", __func__);
 
     return Void();
@@ -235,6 +235,12 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            if(internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            }
+            else {
+                internalClientCallback->onStateChange(false);
+            }
             _hidl_cb(resApduBuff, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -386,6 +392,12 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            if(internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            }
+            else {
+                internalClientCallback->onStateChange(false);
+            }
             _hidl_cb(result, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -648,7 +660,7 @@
 }
 
 void SecureElement::serviceDied(uint64_t, const wp<IBase>&) {
-  ALOGE("SecureElement:%s SecureElement serviceDied", __func__);
+  ALOGD("SecureElement:%s SecureElement serviceDied", __func__);
   SecureElementStatus mSecureElementStatus = deinitializeSE();
   if (mSecureElementStatus != SecureElementStatus::SUCCESS) {
     ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
@@ -669,9 +681,14 @@
 
     ALOGD("SecureElement:%s start", __func__);
 
-    if(turnOffSE){
+    if(checkSeUp){
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
+            if (internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            } else {
+                internalClientCallback->onStateChange(false);
+            }
         } else {
             ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -679,8 +696,6 @@
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
-        turnOffSE = false;
-
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
diff --git a/secure_element/1.1/SecureElement.h b/secure_element/1.1/SecureElement.h
index 2cf4380..52f9a23 100644
--- a/secure_element/1.1/SecureElement.h
+++ b/secure_element/1.1/SecureElement.h
@@ -52,7 +52,6 @@
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
     bool checkSeUp = false;
-    bool turnOffSE = true;
     uint8_t atr[32];
     uint8_t atr_size;
     char config_filename[100];
diff --git a/secure_element/1.2/GtoService.cpp b/secure_element/1.2/GtoService.cpp
index 69cc3f4..54d9732 100644
--- a/secure_element/1.2/GtoService.cpp
+++ b/secure_element/1.2/GtoService.cpp
@@ -27,7 +27,7 @@
 
 int main() {
   ALOGD("android::hardware::secure_element::V1_2 is starting.");
-  ALOGD("Thales Secure Element HAL for eSE1 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE1 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE1");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE1");
diff --git a/secure_element/1.2/GtoService_ese2.cpp b/secure_element/1.2/GtoService_ese2.cpp
index d718d8a..1a8eb84 100644
--- a/secure_element/1.2/GtoService_ese2.cpp
+++ b/secure_element/1.2/GtoService_ese2.cpp
@@ -27,7 +27,7 @@
 
 int main() {
   ALOGD("android::hardware::secure_element::V1_2 is starting.");
-  ALOGD("Thales Secure Element HAL for eSE2 Service 1.4.0 is starting. libse-gto v1.13");
+  ALOGD("Thales Secure Element HAL for eSE2 Service 1.5.0 is starting. libse-gto v1.13");
   sp<ISecureElement> se_service = new SecureElement("eSE2");
   configureRpcThreadpool(1, true);
   status_t status = se_service->registerAsService("eSE2");
diff --git a/secure_element/1.2/SecureElement.cpp b/secure_element/1.2/SecureElement.cpp
index 77972cb..8cda099 100644
--- a/secure_element/1.2/SecureElement.cpp
+++ b/secure_element/1.2/SecureElement.cpp
@@ -88,11 +88,16 @@
 sp<V1_1::ISecureElementHalCallback> SecureElement::internalClientCallback_v1_1 = nullptr;
 int SecureElement::initializeSE() {
 
-    //struct settings *settings;
     int n;
 
     ALOGD("SecureElement:%s start", __func__);
 
+    if (checkSeUp) {
+        ALOGD("SecureElement:%s Already initialized", __func__);
+        ALOGD("SecureElement:%s end", __func__);
+        return EXIT_SUCCESS;
+    }
+
     if (se_gto_new(&ctx) < 0) {
         ALOGE("SecureElement:%s se_gto_new FATAL:%s", __func__,strerror(errno));
 
@@ -109,17 +114,12 @@
     }
 
     if (resetSE() < 0) {
+        se_gto_close(ctx);
+        ctx = NULL;
         return EXIT_FAILURE;
     }
 
     checkSeUp = true;
-    turnOffSE = false;
-
-
-    if(internalClientCallback_v1_1 != nullptr) internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
-    else internalClientCallback->onStateChange(true);
-
-    turnOffSE = true;
 
     ALOGD("SecureElement:%s end", __func__);
     return EXIT_SUCCESS;
@@ -129,7 +129,7 @@
 
     ALOGD("SecureElement:%s start", __func__);
     if (clientCallback == nullptr) {
-        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        ALOGE("SecureElement:%s clientCallback == nullptr", __func__);
         return Void();
     } else {
         internalClientCallback = clientCallback;
@@ -142,11 +142,11 @@
     if (initializeSE() != EXIT_SUCCESS) {
         ALOGE("SecureElement:%s initializeSE Failed", __func__);
         clientCallback->onStateChange(false);
+    } else {
+        ALOGD("SecureElement:%s initializeSE Success", __func__);
+        clientCallback->onStateChange(true);
     }
 
-    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-    }
     ALOGD("SecureElement:%s end", __func__);
 
     return Void();
@@ -156,7 +156,7 @@
 
     ALOGD("SecureElement:%s start", __func__);
     if (clientCallback == nullptr) {
-        ALOGD("SecureElement:%s clientCallback == nullptr", __func__);
+        ALOGE("SecureElement:%s clientCallback == nullptr", __func__);
         return Void();
     } else {
         internalClientCallback = nullptr;
@@ -168,12 +168,12 @@
 
     if (initializeSE() != EXIT_SUCCESS) {
         ALOGE("SecureElement:%s initializeSE Failed", __func__);
-        clientCallback->onStateChange_1_1(false, "initializeSE Failed");
+        clientCallback->onStateChange_1_1(false, "SE Initialized failed");
+    } else {
+        ALOGD("SecureElement:%s initializeSE Success", __func__);
+        clientCallback->onStateChange_1_1(true, "SE Initialized");
     }
 
-    if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-        ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-    }
     ALOGD("SecureElement:%s end", __func__);
 
     return Void();
@@ -240,6 +240,12 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            if(internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            }
+            else {
+                internalClientCallback->onStateChange(false);
+            }
             _hidl_cb(resApduBuff, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -391,6 +397,12 @@
     if (!checkSeUp) {
         if (initializeSE() != EXIT_SUCCESS) {
             ALOGE("SecureElement:%s: Failed to re-initialise the eSE HAL", __func__);
+            if(internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            }
+            else {
+                internalClientCallback->onStateChange(false);
+            }
             _hidl_cb(result, SecureElementStatus::IOERROR);
             return Void();
         }
@@ -653,7 +665,7 @@
 }
 
 void SecureElement::serviceDied(uint64_t, const wp<IBase>&) {
-  ALOGE("SecureElement:%s SecureElement serviceDied", __func__);
+  ALOGD("SecureElement:%s SecureElement serviceDied", __func__);
   SecureElementStatus mSecureElementStatus = deinitializeSE();
   if (mSecureElementStatus != SecureElementStatus::SUCCESS) {
     ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
@@ -674,9 +686,14 @@
 
     ALOGD("SecureElement:%s start", __func__);
 
-    if(turnOffSE){
+    if(checkSeUp){
         if (se_gto_close(ctx) < 0) {
             mSecureElementStatus = SecureElementStatus::FAILED;
+            if (internalClientCallback_v1_1 != nullptr) {
+                internalClientCallback_v1_1->onStateChange_1_1(false, "SE Initialized failed");
+            } else {
+                internalClientCallback->onStateChange(false);
+            }
         } else {
             ctx = NULL;
             mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -684,7 +701,6 @@
             nbrOpenChannel = 0;
         }
         checkSeUp = false;
-        turnOffSE = false;
     }else{
         ALOGD("SecureElement:%s No need to deinitialize SE", __func__);
         mSecureElementStatus = SecureElementStatus::SUCCESS;
@@ -708,7 +724,7 @@
     }
 
     if (internalClientCallback_v1_1 != nullptr) {
-        internalClientCallback_v1_1->onStateChange_1_1(false, "SE deinitialized");
+        internalClientCallback_v1_1->onStateChange_1_1(false, "reset the SE");
     } else {
         internalClientCallback->onStateChange(false);
     }
@@ -725,10 +741,11 @@
             ALOGD("SecureElement:%s STResetTool Success", __func__);
             if (initializeSE() == EXIT_SUCCESS) {
                 status = SecureElementStatus::SUCCESS;
-            }
-            turnOffSE = true;
-            if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-                ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
+                if (internalClientCallback_v1_1 != nullptr) {
+                    internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+                } else {
+                    internalClientCallback->onStateChange(true);
+                }
             }
         } else {
             ALOGE("SecureElement:%s STResetTool Failed!", __func__);
@@ -737,12 +754,13 @@
         dlclose(stdll);
     } else {
         if (initializeSE() == EXIT_SUCCESS) {
+            if (internalClientCallback_v1_1 != nullptr) {
+                 internalClientCallback_v1_1->onStateChange_1_1(true, "SE Initialized");
+            } else {
+                internalClientCallback->onStateChange(true);
+            }
             status = SecureElementStatus::SUCCESS;
         }
-        turnOffSE = true;
-        if (deinitializeSE() != SecureElementStatus::SUCCESS) {
-            ALOGE("SecureElement:%s deinitializeSE Failed", __func__);
-        }
     }
 
     ALOGD("SecureElement:%s end", __func__);
diff --git a/secure_element/1.2/SecureElement.h b/secure_element/1.2/SecureElement.h
index 1c2293b..0f3df48 100644
--- a/secure_element/1.2/SecureElement.h
+++ b/secure_element/1.2/SecureElement.h
@@ -53,7 +53,6 @@
     uint8_t nbrOpenChannel = 0;
     bool isBasicChannelOpen = false;
     bool checkSeUp = false;
-    bool turnOffSE = true;
     uint8_t atr[32];
     uint8_t atr_size;
     char config_filename[100];