Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efc50877 authored by Ahaan Ugale's avatar Ahaan Ugale Committed by Joanne Chung
Browse files

Fix ServiceConnector failing unbind if not connected.

ServiceConnector does not call unbindService when requested to unbind if
the service isn't currently connected. This causes issues like leaving
zombie Trusted Hotword processes bound forever if the process is stopped
('restarted') immediately after being created (say if audio server
crashes twice in quick succession).

Fix: 223845998
Test: manual - locally comment out code that immediately connects the
 service, then `for i in {1..10}; do adb shell cmd voiceinteraction\
 restart-detection; done` - without fix results in an extra process
Change-Id: I6a8c01390130bcec9aff1460004343ca2b207031
Merged-in: I6a8c01390130bcec9aff1460004343ca2b207031
(cherry picked from commit 52e0dafc)
parent ce0c044b
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -507,10 +507,21 @@ public interface ServiceConnector<I extends IInterface> {
        void unbindJobThread() {
            cancelTimeout();
            I service = mService;
            // TODO(b/224695239): This is actually checking wasConnected. Rename and/or fix
            // implementation based on what this should actually be checking. At least the first
            // check for calling unbind is the correct behavior, though.
            boolean wasBound = service != null;
            if (wasBound || mBinding) {
                try {
                    mContext.unbindService(mServiceConnection);
                } catch (IllegalArgumentException e) {  // TODO(b/224697137): Fix the race condition
                                                        // that requires catching this (crashes if
                                                        // service isn't currently bound).
                    Log.e(LOG_TAG, "Failed to unbind: " + e);
                }
            }
            if (wasBound) {
                onServiceConnectionStatusChanged(service, false);
                mContext.unbindService(mServiceConnection);
                service.asBinder().unlinkToDeath(this, 0);
                mService = null;
            }