Merge "Unbind MBMS service after calling close" am: d00563735f am: 657c80a322
am: a024eb5f9f
Change-Id: I31df21c47f15e9d2edd7f5b6e4b7bf6b9a6eb8a3
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user