How to make business logic code maintainable when working with multiple states?
It seems data/feature envy. Move the boolean conditions to the Call object:

public class Call {
    ...

    public boolean isIncomingDirection()
        return callDirection == CallDirection.INCOMING;
    }

    public boolean isIncomingCall() {
        return isIncomingDirection()
            &amp;&amp; callState == CallState.INCOMING &amp;&amp; !isTannoyCall;
    }

    public boolean isActiveCall() {
        return isActive()
                &amp;&amp; callState != InvState.INCOMING &amp;&amp; !isTannoyCall;
    }

    public boolean isMissedCall() {
        return isIncomingDirection()
                &amp;&amp; callState == InvState.DISCONNECTED
                &amp;&amp; callStart == 0
                &amp;&amp; !isTannoyCall;
    }       
}


See also: Clean Code by Robert C. Martin, G14: Feature Envy