diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 1e56e95fbb904..9e7a29e036fc2 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -357,7 +357,13 @@ public class Trampoline extends IBackupManager.Stub { if (svc != null) { svc.selectBackupTransportAsync(transport, listener); } else { - listener.onFailure(BackupManager.ERROR_BACKUP_NOT_ALLOWED); + if (listener != null) { + try { + listener.onFailure(BackupManager.ERROR_BACKUP_NOT_ALLOWED); + } catch (RemoteException ex) { + // ignore + } + } } } diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index 4c53915c79e2c..27ef9d791f4c6 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -56,7 +56,6 @@ import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; -import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; @@ -599,6 +598,39 @@ public class TrampolineTest { assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) errorCode); } + @Test + public void selectBackupTransportAsync_calledBeforeInitialize_ignored_nullListener() + throws Exception { + mTrampoline.selectBackupTransportAsync(TRANSPORT_COMPONENT_NAME, null); + verifyNoMoreInteractions(mBackupManagerServiceMock); + // No crash. + } + + @Test + public void selectBackupTransportAsync_calledBeforeInitialize_ignored_listenerThrowException() + throws Exception { + mTrampoline.selectBackupTransportAsync( + TRANSPORT_COMPONENT_NAME, + new ISelectBackupTransportCallback() { + @Override + public void onSuccess(String transportName) throws RemoteException { + + } + + @Override + public void onFailure(int reason) throws RemoteException { + throw new RemoteException("Crash"); + } + + @Override + public IBinder asBinder() { + return null; + } + }); + verifyNoMoreInteractions(mBackupManagerServiceMock); + // No crash. + } + @Test public void selectBackupTransportAsync_forwarded() throws RemoteException { mTrampoline.initialize(UserHandle.USER_SYSTEM);