CarrierServiceBindHelper: context mismatch in bindService vs unbindservice
Two issues are observed due to the context mismatch:
1. unbindservice throw IAE with msg "Service not registered"
2. Binding connection leaks in various scenarios
To fix the issue, the context is created in the constructor and
used ever since.
Bug: 197274279
Test: atest CarrierServiceBindHelperTest
Change-Id: I0b6ebf88c5de71a8602f22d324cea91141c3c97c
diff --git a/src/java/com/android/internal/telephony/CarrierServiceBindHelper.java b/src/java/com/android/internal/telephony/CarrierServiceBindHelper.java
index 817a461..4b4980e 100644
--- a/src/java/com/android/internal/telephony/CarrierServiceBindHelper.java
+++ b/src/java/com/android/internal/telephony/CarrierServiceBindHelper.java
@@ -128,7 +128,7 @@
};
public CarrierServiceBindHelper(Context context) {
- mContext = context;
+ mContext = context.createContextAsUser(Process.myUserHandle(), 0);
updateBindingsAndSimStates();
@@ -283,13 +283,13 @@
String error;
try {
- if (mContext.createContextAsUser(Process.myUserHandle(), 0)
- .bindService(carrierService,
- Context.BIND_AUTO_CREATE
+ if (mContext.bindService(
+ carrierService,
+ Context.BIND_AUTO_CREATE
| Context.BIND_FOREGROUND_SERVICE
| Context.BIND_INCLUDE_CAPABILITIES,
- (r) -> mHandler.post(r),
- connection)) {
+ (r) -> mHandler.post(r),
+ connection)) {
logdWithLocalLog("service bound");
mServiceBound = true;
return;
@@ -350,12 +350,7 @@
if (mServiceBound) {
logdWithLocalLog("Unbinding from carrier app");
mServiceBound = false;
- try {
- mContext.unbindService(connection);
- } catch (IllegalArgumentException e) {
- //TODO(b/151328766): Figure out why we unbind without binding
- logeWithLocalLog("Tried to unbind without binding e=" + e);
- }
+ mContext.unbindService(connection);
} else {
logdWithLocalLog("Not bound, skipping unbindService call");
}