Merge "Only unbind if bind() returned success" am: 6035e5b14f am: 1df101d3c3 am: d65efb9f59
Change-Id: Ifbbfe203c4ee57bdfbf8cb01d504abc2e89741a6
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 6e10bf0..739a8ae 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -96,6 +96,8 @@
private PersistableBundle[] mOverrideConfigs;
// Service connection for binding to config app.
private CarrierServiceConnection[] mServiceConnection;
+ // Whether we are bound to a service for each phone
+ private boolean[] mServiceBound;
// Whether we have sent config change bcast for each phone id.
private boolean[] mHasSentConfigChange;
// SubscriptionInfoUpdater
@@ -266,7 +268,7 @@
final CarrierServiceConnection conn = (CarrierServiceConnection) msg.obj;
// If new service connection has been created, unbind.
if (mServiceConnection[phoneId] != conn || conn.service == null) {
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
break;
}
final CarrierIdentifier carrierId = getCarrierIdentifierForPhoneId(phoneId);
@@ -275,7 +277,7 @@
new ResultReceiver(this) {
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
// If new service connection has been created, this is stale.
if (mServiceConnection[phoneId] != conn) {
loge("Received response for stale request.");
@@ -309,7 +311,7 @@
} catch (RemoteException e) {
loge("Failed to get carrier config from default app: " +
mPlatformCarrierConfigPackage + " err: " + e.toString());
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
break; // So we don't set a timeout.
}
sendMessageDelayed(
@@ -329,7 +331,7 @@
if (mServiceConnection[phoneId] != null) {
// If a ResponseReceiver callback is in the queue when this happens, we will
// unbind twice and throw an exception.
- unbindIfConnected(mContext, mServiceConnection[phoneId]);
+ unbindIfBound(mContext, mServiceConnection[phoneId], phoneId);
broadcastConfigChangedIntent(phoneId);
}
notifySubscriptionInfoUpdater(phoneId);
@@ -395,7 +397,7 @@
final CarrierServiceConnection conn = (CarrierServiceConnection) msg.obj;
// If new service connection has been created, unbind.
if (mServiceConnection[phoneId] != conn || conn.service == null) {
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
break;
}
final CarrierIdentifier carrierId = getCarrierIdentifierForPhoneId(phoneId);
@@ -404,7 +406,7 @@
new ResultReceiver(this) {
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
// If new service connection has been created, this is stale.
if (mServiceConnection[phoneId] != conn) {
loge("Received response for stale request.");
@@ -439,7 +441,7 @@
+ " carrierid: " + carrierId.toString());
} catch (RemoteException e) {
loge("Failed to get carrier config: " + e.toString());
- unbindIfConnected(mContext, conn);
+ unbindIfBound(mContext, conn, phoneId);
break; // So we don't set a timeout.
}
sendMessageDelayed(
@@ -459,7 +461,7 @@
if (mServiceConnection[phoneId] != null) {
// If a ResponseReceiver callback is in the queue when this happens, we will
// unbind twice and throw an exception.
- unbindIfConnected(mContext, mServiceConnection[phoneId]);
+ unbindIfBound(mContext, mServiceConnection[phoneId], phoneId);
broadcastConfigChangedIntent(phoneId);
}
notifySubscriptionInfoUpdater(phoneId);
@@ -538,6 +540,7 @@
mPersistentOverrideConfigs = new PersistableBundle[numPhones];
mOverrideConfigs = new PersistableBundle[numPhones];
mServiceConnection = new CarrierServiceConnection[numPhones];
+ mServiceBound = new boolean[numPhones];
mHasSentConfigChange = new boolean[numPhones];
// Make this service available through ServiceManager.
TelephonyFrameworkInitializer
@@ -645,8 +648,13 @@
carrierService.setPackage(pkgName);
mServiceConnection[phoneId] = new CarrierServiceConnection(phoneId, eventId);
try {
- return mContext.bindService(carrierService, mServiceConnection[phoneId],
- Context.BIND_AUTO_CREATE);
+ if (mContext.bindService(carrierService, mServiceConnection[phoneId],
+ Context.BIND_AUTO_CREATE)) {
+ mServiceBound[phoneId] = true;
+ return true;
+ } else {
+ return false;
+ }
} catch (SecurityException ex) {
return false;
}
@@ -1128,8 +1136,10 @@
}
}
- private static void unbindIfConnected(Context context, CarrierServiceConnection conn) {
- if (conn.connected) {
+ private void unbindIfBound(Context context, CarrierServiceConnection conn,
+ int phoneId) {
+ if (mServiceBound[phoneId]) {
+ mServiceBound[phoneId] = false;
context.unbindService(conn);
}
}
@@ -1138,7 +1148,6 @@
int phoneId;
int eventId;
IBinder service;
- boolean connected = false;
public CarrierServiceConnection(int phoneId, int eventId) {
this.phoneId = phoneId;
@@ -1149,7 +1158,6 @@
public void onServiceConnected(ComponentName name, IBinder service) {
log("Connected to config app: " + name.flattenToString());
this.service = service;
- connected = true;
mHandler.sendMessage(mHandler.obtainMessage(eventId, phoneId, -1, this));
}
@@ -1157,21 +1165,18 @@
public void onServiceDisconnected(ComponentName name) {
log("Disconnected from config app: " + name.flattenToString());
this.service = null;
- connected = false;
}
@Override
public void onBindingDied(ComponentName name) {
log("Binding died from config app: " + name.flattenToString());
this.service = null;
- connected = false;
}
@Override
public void onNullBinding(ComponentName name) {
log("Null binding from config app: " + name.flattenToString());
this.service = null;
- connected = false;
}
}