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

Commit f610bd78 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix race conditions for camera prewarm service

When the unbind request came in before the service was actually
bound, we dropped the unbind request because mPrewarmBound was still
false. Fix that by tracking whether a bind is pending and if a unbind
event comes in during that time, set another flag to unbind it
directly again when the service is actually bound. In addition, don't
allow binding again if any of the previous events are still pending.

Bug: 23143748
Change-Id: I2b8ace86e35479a9848668a3462a2ce687835413
parent 0b804542
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -115,12 +115,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mPrewarmMessenger = new Messenger(service);
            mPrewarmBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mPrewarmBound = false;
            mPrewarmMessenger = null;
        }
    };
@@ -386,8 +384,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
                serviceIntent.setClassName(targetInfo.packageName, clazz);
                serviceIntent.setAction(CameraPrewarmService.ACTION_PREWARM);
                try {
                    getContext().bindServiceAsUser(serviceIntent, mPrewarmConnection,
                            Context.BIND_AUTO_CREATE, new UserHandle(UserHandle.USER_CURRENT));
                    if (getContext().bindServiceAsUser(serviceIntent, mPrewarmConnection,
                            Context.BIND_AUTO_CREATE, new UserHandle(UserHandle.USER_CURRENT))) {
                        mPrewarmBound = true;
                    }
                } catch (SecurityException e) {
                    Log.w(TAG, "Unable to bind to prewarm service package=" + targetInfo.packageName
                            + " class=" + clazz, e);
@@ -398,7 +398,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL

    public void unbindCameraPrewarmService(boolean launched) {
        if (mPrewarmBound) {
            if (launched) {
            if (mPrewarmMessenger != null && launched) {
                try {
                    mPrewarmMessenger.send(Message.obtain(null /* handler */,
                            CameraPrewarmService.MSG_CAMERA_FIRED));