Unavailable DataLoader status.

This is a temporary failure, does not fail the session, but requires
caller to re-commit. E.g. there are connectivity issues which can be
fixed later.

Bug: b/153874006
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest
Change-Id: I02791a2963130dbecb510c4a7cafcf04f6245761
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp
index 1036858..992a4ef 100644
--- a/services/incremental/IncrementalService.cpp
+++ b/services/incremental/IncrementalService.cpp
@@ -1708,15 +1708,19 @@
     {
         std::unique_lock lock(mStatusMutex);
         oldStatus = mTargetStatus;
-        mTargetStatus = newStatus;
-        mTargetStatusTs = Clock::now();
         curStatus = mCurrentStatus;
+        setTargetStatusLocked(newStatus);
     }
     LOG(DEBUG) << "Target status update for DataLoader " << mId << ": " << oldStatus << " -> "
                << newStatus << " (current " << curStatus << ")";
     return fsmStep();
 }
 
+void IncrementalService::DataLoaderStub::setTargetStatusLocked(int status) {
+    mTargetStatus = status;
+    mTargetStatusTs = Clock::now();
+}
+
 bool IncrementalService::DataLoaderStub::waitForStatus(int status, Clock::duration duration) {
     auto now = Clock::now();
     std::unique_lock lock(mStatusMutex);
@@ -1782,6 +1786,9 @@
     }
 
     switch (targetStatus) {
+        case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE:
+            // Do nothing, this is a reset state.
+            break;
         case IDataLoaderStatusListener::DATA_LOADER_DESTROYED: {
             return destroy();
         }
@@ -1796,6 +1803,7 @@
         case IDataLoaderStatusListener::DATA_LOADER_CREATED:
             switch (currentStatus) {
                 case IDataLoaderStatusListener::DATA_LOADER_DESTROYED:
+                case IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE:
                     return bind();
                 case IDataLoaderStatusListener::DATA_LOADER_BOUND:
                     return create();
@@ -1825,9 +1833,15 @@
         if (mCurrentStatus == newStatus) {
             return binder::Status::ok();
         }
+
         oldStatus = mCurrentStatus;
         mCurrentStatus = newStatus;
         targetStatus = mTargetStatus;
+
+        if (mCurrentStatus == IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE) {
+            // For unavailable, reset target status.
+            setTargetStatusLocked(IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE);
+        }
     }
 
     LOG(DEBUG) << "Current status update for DataLoader " << mId << ": " << oldStatus << " -> "