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

Commit c8bb2bc5 authored by Tyler Gunn's avatar Tyler Gunn Committed by android-build-merger
Browse files

Ensure null ConnectionService references don't crash phone.

am: 165ee750

Change-Id: I703ad6c95baa0ac0d3920e8ea8f61dc35ec950e7
parents 39140245 165ee750
Loading
Loading
Loading
Loading
+49 −16
Original line number Diff line number Diff line
@@ -1330,8 +1330,6 @@ public class Call implements CreateConnectionResponse {
     */
    @VisibleForTesting
    public void answer(int videoState) {
        Preconditions.checkNotNull(mConnectionService);

        // Check to verify that the call is still in the ringing state. A call can change states
        // between the time the user hits 'answer' and Telecom receives the command.
        if (isRinging("answer")) {
@@ -1344,7 +1342,12 @@ public class Call implements CreateConnectionResponse {
            // that it will work. Instead, we wait until confirmation from the connectino service
            // that the call is in a non-STATE_RINGING state before changing the UI. See
            // {@link ConnectionServiceAdapter#setActive} and other set* methods.
            if (mConnectionService != null) {
                mConnectionService.answer(this, videoState);
            } else {
                Log.e(this, new NullPointerException(),
                        "answer call failed due to null CS callId=%s", getId());
            }
            Log.event(this, Log.Events.REQUEST_ACCEPT);
        }
    }
@@ -1357,16 +1360,20 @@ public class Call implements CreateConnectionResponse {
     */
    @VisibleForTesting
    public void reject(boolean rejectWithMessage, String textMessage) {
        Preconditions.checkNotNull(mConnectionService);

        // Check to verify that the call is still in the ringing state. A call can change states
        // between the time the user hits 'reject' and Telecomm receives the command.
        if (isRinging("reject")) {
            // Ensure video state history tracks video state at time of rejection.
            mVideoStateHistory |= mVideoState;

            if (mConnectionService != null) {
                mConnectionService.reject(this, rejectWithMessage, textMessage);
            } else {
                Log.e(this, new NullPointerException(),
                        "reject call failed due to null CS callId=%s", getId());
            }
            Log.event(this, Log.Events.REQUEST_REJECT);

        }
    }

@@ -1374,10 +1381,13 @@ public class Call implements CreateConnectionResponse {
     * Puts the call on hold if it is currently active.
     */
    void hold() {
        Preconditions.checkNotNull(mConnectionService);

        if (mState == CallState.ACTIVE) {
            if (mConnectionService != null) {
                mConnectionService.hold(this);
            } else {
                Log.e(this, new NullPointerException(),
                        "hold call failed due to null CS callId=%s", getId());
            }
            Log.event(this, Log.Events.REQUEST_HOLD);
        }
    }
@@ -1386,10 +1396,13 @@ public class Call implements CreateConnectionResponse {
     * Releases the call from hold if it is currently active.
     */
    void unhold() {
        Preconditions.checkNotNull(mConnectionService);

        if (mState == CallState.ON_HOLD) {
            if (mConnectionService != null) {
                mConnectionService.unhold(this);
            } else {
                Log.e(this, new NullPointerException(),
                        "unhold call failed due to null CS callId=%s", getId());
            }
            Log.event(this, Log.Events.REQUEST_UNHOLD);
        }
    }
@@ -1443,7 +1456,12 @@ public class Call implements CreateConnectionResponse {

        // If the change originated from an InCallService, notify the connection service.
        if (source == SOURCE_INCALL_SERVICE) {
            if (mConnectionService != null) {
                mConnectionService.onExtrasChanged(this, mExtras);
            } else {
                Log.e(this, new NullPointerException(),
                        "putExtras failed due to null CS callId=%s", getId());
            }
        }
    }

@@ -1473,7 +1491,12 @@ public class Call implements CreateConnectionResponse {

        // If the change originated from an InCallService, notify the connection service.
        if (source == SOURCE_INCALL_SERVICE) {
            if (mConnectionService != null) {
                mConnectionService.onExtrasChanged(this, mExtras);
            } else {
                Log.e(this, new NullPointerException(),
                        "removeExtras failed due to null CS callId=%s", getId());
            }
        }
    }

@@ -1514,7 +1537,12 @@ public class Call implements CreateConnectionResponse {
    }

    void postDialContinue(boolean proceed) {
        if (mConnectionService != null) {
            mConnectionService.onPostDialContinue(this, proceed);
        } else {
            Log.e(this, new NullPointerException(),
                    "postDialContinue failed due to null CS callId=%s", getId());
        }
    }

    void conferenceWith(Call otherCall) {
@@ -1616,7 +1644,12 @@ public class Call implements CreateConnectionResponse {
     * @param extras Associated extras.
     */
    public void sendCallEvent(String event, Bundle extras) {
        if (mConnectionService != null) {
            mConnectionService.sendCallEvent(this, event, extras);
        } else {
            Log.e(this, new NullPointerException(),
                    "sendCallEvent failed due to null CS callId=%s", getId());
        }
    }

    void setParentCall(Call parentCall) {
+10 −1
Original line number Diff line number Diff line
@@ -1693,7 +1693,16 @@ public class CallsManager extends Call.ListenerBase
     * @param incomingCall Incoming call that has been rejected
     */
    private void rejectCallAndLog(Call incomingCall) {
        if (incomingCall.getConnectionService() != null) {
            // Only reject the call if it has not already been destroyed.  If a call ends while
            // incoming call filtering is taking place, it is possible that the call has already
            // been destroyed, and as such it will be impossible to send the reject to the
            // associated ConnectionService.
            incomingCall.reject(false, null);
        } else {
            Log.i(this, "rejectCallAndLog - call already destroyed.");
        }

        // Since the call was not added to the list of calls, we have to call the missed
        // call notifier and the call logger manually.
        // Do we need missed call notification for direct to Voicemail calls?