Instantly excute next state when the agent provides a prohibited key.

When the agent provides a prohibited key, the code flow will directly be returned
without excuting next backup state. The next state should be execute instantly to
make sure the backup mechanism can be executed properly.

Bug: 77272601
Test: 1.m -j RunFrameworksServicesRoboTests
      2.Manual testing by test package with prohibited key.
      - adb backup -all
      - adb backup -shared
      - adb backup -obb -all
      - adb shell bmgr backupnow --all
      - adb shell bmgr backupnow [test key value package]
      - adb backup -keyvalue [test key value package]
Change-Id: I46e1aa8dd0f75cf54087b43cee50ee952d85abc1
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index 2eb632c..ae43299 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -884,7 +884,12 @@
                                         .sendBackupOnPackageResult(mObserver, pkgName,
                                                 BackupManager.ERROR_AGENT_FAILURE);
                                 errorCleanup();
-                                // agentErrorCleanup() implicitly executes next state properly
+                                if (MORE_DEBUG) {
+                                    Slog.i(TAG, "Agent failure for " + pkgName
+                                            + " with illegal key: " + key + "; dropped");
+                                }
+                                executeNextState(mQueue.isEmpty() ? BackupState.FINAL
+                                        : BackupState.RUNNING_QUEUE);
                                 return;
                             }
                             in.skipEntityData();
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index 6d3a0c6..88a51a5 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -361,10 +361,43 @@
 
         runTask(task);
 
-        // TODO: Should it not call mListener.onFinished()? PerformBackupTask:891 return?
-        // verify(mListener).onFinished(any());
+        verify(mListener).onFinished(any());
         verify(mObserver).onResult(eq(PACKAGE_1), eq(BackupManager.ERROR_AGENT_FAILURE));
         verify(agentMock.agentBinder).fail(any());
+        verify(mObserver).backupFinished(BackupManager.SUCCESS);
+    }
+
+    @Test
+    public void testRunTask_whenFirstAgentKeyProhibitedButLastPermitted() throws Exception {
+        TransportMock transportMock = setUpTransport(mTransport);
+        List<AgentMock> agentMocks = setUpAgents(PACKAGE_1, PACKAGE_2);
+        AgentMock agentMock1 = agentMocks.get(0);
+        AgentMock agentMock2 = agentMocks.get(1);
+        agentOnBackupDo(
+                agentMock1.agent,
+                (oldState, dataOutput, newState) -> {
+                    char prohibitedChar = 0xff00;
+                    writeData(dataOutput, prohibitedChar + "key", "foo".getBytes());
+                });
+        agentOnBackupDo(
+                agentMock2.agent,
+                (oldState, dataOutput, newState) -> {
+                    writeData(dataOutput, "key", "bar".getBytes());
+                });
+        PerformBackupTask task =
+                createPerformBackupTask(
+                        transportMock.transportClient,
+                        mTransport.transportDirName,
+                        PACKAGE_1,
+                        PACKAGE_2);
+
+        runTask(task);
+
+        verify(mListener).onFinished(any());
+        verify(mObserver).onResult(eq(PACKAGE_1), eq(BackupManager.ERROR_AGENT_FAILURE));
+        verify(agentMock1.agentBinder).fail(any());
+        verify(mObserver).onResult(eq(PACKAGE_2), eq(BackupManager.SUCCESS));
+        verify(mObserver).backupFinished(BackupManager.SUCCESS);
     }
 
     @Test