Merge "Unbind MBMS service after calling close" am: d00563735f am: 657c80a322

am: a024eb5f9f

Change-Id: I31df21c47f15e9d2edd7f5b6e4b7bf6b9a6eb8a3
This commit is contained in:
Hall Liu
2019-10-02 15:41:20 -07:00
committed by android-build-merger
3 changed files with 196 additions and 157 deletions

View File

@@ -243,6 +243,7 @@ public class MbmsDownloadSession implements AutoCloseable {
};
private AtomicReference<IMbmsDownloadService> mService = new AtomicReference<>(null);
private ServiceConnection mServiceConnection;
private final InternalDownloadSessionCallback mInternalCallback;
private final Map<DownloadStatusListener, InternalDownloadStatusListener>
mInternalDownloadStatusListeners = new HashMap<>();
@@ -318,56 +319,66 @@ public class MbmsDownloadSession implements AutoCloseable {
}
private int bindAndInitialize() {
return MbmsUtils.startBinding(mContext, MBMS_DOWNLOAD_SERVICE_ACTION,
new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsDownloadService downloadService =
IMbmsDownloadService.Stub.asInterface(service);
int result;
try {
result = downloadService.initialize(mSubscriptionId, mInternalCallback);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return an"
+ " unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
downloadService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(downloadService);
}
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsDownloadService downloadService =
IMbmsDownloadService.Stub.asInterface(service);
int result;
try {
result = downloadService.initialize(mSubscriptionId, mInternalCallback);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return an"
+ " unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
downloadService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(downloadService);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.w(LOG_TAG, "bindAndInitialize: Remote service disconnected");
sIsInitialized.set(false);
mService.set(null);
}
});
@Override
public void onServiceDisconnected(ComponentName name) {
Log.w(LOG_TAG, "bindAndInitialize: Remote service disconnected");
sIsInitialized.set(false);
mService.set(null);
}
@Override
public void onNullBinding(ComponentName name) {
Log.w(LOG_TAG, "bindAndInitialize: Remote service returned null");
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware service binding returned null");
sIsInitialized.set(false);
mService.set(null);
mContext.unbindService(this);
}
};
return MbmsUtils.startBinding(mContext, MBMS_DOWNLOAD_SERVICE_ACTION, mServiceConnection);
}
/**
@@ -965,17 +976,19 @@ public class MbmsDownloadSession implements AutoCloseable {
public void close() {
try {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
if (downloadService == null || mServiceConnection == null) {
Log.i(LOG_TAG, "Service already dead");
return;
}
downloadService.dispose(mSubscriptionId);
mContext.unbindService(mServiceConnection);
} catch (RemoteException e) {
// Ignore
Log.i(LOG_TAG, "Remote exception while disposing of service");
} finally {
mService.set(null);
sIsInitialized.set(false);
mServiceConnection = null;
mInternalCallback.stop();
}
}

View File

@@ -80,6 +80,7 @@ public class MbmsGroupCallSession implements AutoCloseable {
};
private InternalGroupCallSessionCallback mInternalCallback;
private ServiceConnection mServiceConnection;
private Set<GroupCall> mKnownActiveGroupCalls = new ArraySet<>();
private final Context mContext;
@@ -163,7 +164,7 @@ public class MbmsGroupCallSession implements AutoCloseable {
public void close() {
try {
IMbmsGroupCallService groupCallService = mService.get();
if (groupCallService == null) {
if (groupCallService == null || mServiceConnection == null) {
// Ignore and return, assume already disposed.
return;
}
@@ -172,11 +173,13 @@ public class MbmsGroupCallSession implements AutoCloseable {
s.getCallback().stop();
}
mKnownActiveGroupCalls.clear();
mContext.unbindService(mServiceConnection);
} catch (RemoteException e) {
// Ignore for now
} finally {
mService.set(null);
sIsInitialized.set(false);
mServiceConnection = null;
mInternalCallback.stop();
}
}
@@ -244,59 +247,69 @@ public class MbmsGroupCallSession implements AutoCloseable {
}
private int bindAndInitialize() {
return MbmsUtils.startBinding(mContext, MBMS_GROUP_CALL_SERVICE_ACTION,
new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsGroupCallService groupCallService =
IMbmsGroupCallService.Stub.asInterface(service);
int result;
try {
result = groupCallService.initialize(mInternalCallback,
mSubscriptionId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
mInternalCallback.onError(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
mInternalCallback.onError(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return"
+ " an unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
mInternalCallback.onError(result,
"Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
groupCallService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
mInternalCallback.onError(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(groupCallService);
}
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsGroupCallService groupCallService =
IMbmsGroupCallService.Stub.asInterface(service);
int result;
try {
result = groupCallService.initialize(mInternalCallback,
mSubscriptionId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
mInternalCallback.onError(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
mInternalCallback.onError(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return"
+ " an unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
mInternalCallback.onError(result,
"Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
groupCallService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
mInternalCallback.onError(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(groupCallService);
}
@Override
public void onServiceDisconnected(ComponentName name) {
sIsInitialized.set(false);
mService.set(null);
}
});
@Override
public void onServiceDisconnected(ComponentName name) {
sIsInitialized.set(false);
mService.set(null);
}
@Override
public void onNullBinding(ComponentName name) {
Log.w(LOG_TAG, "bindAndInitialize: Remote service returned null");
mInternalCallback.onError(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware service binding returned null");
sIsInitialized.set(false);
mService.set(null);
mContext.unbindService(this);
}
};
return MbmsUtils.startBinding(mContext, MBMS_GROUP_CALL_SERVICE_ACTION, mServiceConnection);
}
}

View File

@@ -82,6 +82,7 @@ public class MbmsStreamingSession implements AutoCloseable {
};
private InternalStreamingSessionCallback mInternalCallback;
private ServiceConnection mServiceConnection;
private Set<StreamingService> mKnownActiveStreamingServices = new ArraySet<>();
private final Context mContext;
@@ -168,7 +169,7 @@ public class MbmsStreamingSession implements AutoCloseable {
public void close() {
try {
IMbmsStreamingService streamingService = mService.get();
if (streamingService == null) {
if (streamingService == null || mServiceConnection == null) {
// Ignore and return, assume already disposed.
return;
}
@@ -177,11 +178,13 @@ public class MbmsStreamingSession implements AutoCloseable {
s.getCallback().stop();
}
mKnownActiveStreamingServices.clear();
mContext.unbindService(mServiceConnection);
} catch (RemoteException e) {
// Ignore for now
} finally {
mService.set(null);
sIsInitialized.set(false);
mServiceConnection = null;
mInternalCallback.stop();
}
}
@@ -286,59 +289,69 @@ public class MbmsStreamingSession implements AutoCloseable {
}
private int bindAndInitialize() {
return MbmsUtils.startBinding(mContext, MBMS_STREAMING_SERVICE_ACTION,
new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsStreamingService streamingService =
IMbmsStreamingService.Stub.asInterface(service);
int result;
try {
result = streamingService.initialize(mInternalCallback,
mSubscriptionId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return"
+ " an unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
streamingService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(streamingService);
}
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMbmsStreamingService streamingService =
IMbmsStreamingService.Stub.asInterface(service);
int result;
try {
result = streamingService.initialize(mInternalCallback,
mSubscriptionId);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Service died before initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
} catch (RuntimeException e) {
Log.e(LOG_TAG, "Runtime exception during initialization");
sendErrorToApp(
MbmsErrors.InitializationErrors.ERROR_UNABLE_TO_INITIALIZE,
e.toString());
sIsInitialized.set(false);
return;
}
if (result == MbmsErrors.UNKNOWN) {
// Unbind and throw an obvious error
close();
throw new IllegalStateException("Middleware must not return"
+ " an unknown error code");
}
if (result != MbmsErrors.SUCCESS) {
sendErrorToApp(result, "Error returned during initialization");
sIsInitialized.set(false);
return;
}
try {
streamingService.asBinder().linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware lost during initialization");
sIsInitialized.set(false);
return;
}
mService.set(streamingService);
}
@Override
public void onServiceDisconnected(ComponentName name) {
sIsInitialized.set(false);
mService.set(null);
}
});
@Override
public void onServiceDisconnected(ComponentName name) {
sIsInitialized.set(false);
mService.set(null);
}
@Override
public void onNullBinding(ComponentName name) {
Log.w(LOG_TAG, "bindAndInitialize: Remote service returned null");
sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST,
"Middleware service binding returned null");
sIsInitialized.set(false);
mService.set(null);
mContext.unbindService(this);
}
};
return MbmsUtils.startBinding(mContext, MBMS_STREAMING_SERVICE_ACTION, mServiceConnection);
}
private void sendErrorToApp(int errorCode, String message) {