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

Commit 7f3d41fd authored by Andrew Lee's avatar Andrew Lee
Browse files

Add new DisconnectCause class to telecomm.

+ Add a hidden "UNKNOWN" default type to ToneGenerator.
- Hide the Telephony DisconnectCause from the public API.
+ Add a Telecomm DisconnectCause. This is parcelable, and contains
information (code, user facing message, non-user facing reason,
and tone) to help describe the disconnect state and what behaviors
an application can implement for the user experience. This reduces
the causes for a disconnect to a more generic set.
+ Lots of work to pipe this through. DisconnectCause replaces the
code and message which were formerly passed around.

Bug: 17241433
Bug: 17329632
Change-Id: I9d337e478a8784bcc0ade02267c2df52cac9bf17
parent b37b7ae1
Loading
Loading
Loading
Loading
+32 −64
Original line number Diff line number Diff line
@@ -28086,14 +28086,14 @@ package android.telecom {
    method public final void removeConnection(android.telecom.Connection);
    method public final void setActive();
    method public final void setCapabilities(int);
    method public final void setDisconnected(int, java.lang.String);
    method public final void setDisconnected(android.telecom.DisconnectCause);
    method public final void setOnHold();
  }
  public abstract class Connection {
    ctor public Connection();
    method public static android.telecom.Connection createCanceledConnection();
    method public static android.telecom.Connection createFailedConnection(int, java.lang.String);
    method public static android.telecom.Connection createFailedConnection(android.telecom.DisconnectCause);
    method public final void destroy();
    method public final android.net.Uri getAddress();
    method public final int getAddressPresentation();
@@ -28104,8 +28104,7 @@ package android.telecom {
    method public final int getCallerDisplayNamePresentation();
    method public final android.telecom.Conference getConference();
    method public final java.util.List<android.telecom.Connection> getConferenceableConnections();
    method public final int getDisconnectCause();
    method public final java.lang.String getDisconnectMessage();
    method public final android.telecom.DisconnectCause getDisconnectCause();
    method public final int getState();
    method public final android.telecom.StatusHints getStatusHints();
    method public final boolean isRingbackRequested();
@@ -28130,7 +28129,7 @@ package android.telecom {
    method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
    method public final void setConnectionService(android.telecom.ConnectionService);
    method public final void setDialing();
    method public final void setDisconnected(int, java.lang.String);
    method public final void setDisconnected(android.telecom.DisconnectCause);
    method public final void setInitialized();
    method public final void setInitializing();
    method public final void setOnHold();
@@ -28173,6 +28172,30 @@ package android.telecom {
    field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService";
  }
  public final class DisconnectCause implements android.os.Parcelable {
    ctor public DisconnectCause(int);
    ctor public DisconnectCause(int, java.lang.String);
    ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String, int);
    method public int describeContents();
    method public int getCode();
    method public java.lang.CharSequence getDescription();
    method public java.lang.CharSequence getLabel();
    method public java.lang.String getReason();
    method public int getTone();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int BUSY = 7; // 0x7
    field public static final int CANCELED = 4; // 0x4
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int ERROR = 1; // 0x1
    field public static final int LOCAL = 2; // 0x2
    field public static final int MISSED = 5; // 0x5
    field public static final int OTHER = 9; // 0x9
    field public static final int REJECTED = 6; // 0x6
    field public static final int REMOTE = 3; // 0x3
    field public static final int RESTRICTED = 8; // 0x8
    field public static final int UNKNOWN = 0; // 0x0
  }
  public class GatewayInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.net.Uri getGatewayAddress();
@@ -28248,8 +28271,7 @@ package android.telecom {
    method public void disconnect();
    method public final int getCallCapabilities();
    method public final java.util.List<android.telecom.RemoteConnection> getConnections();
    method public int getDisconnectCause();
    method public java.lang.String getDisconnectMessage();
    method public android.telecom.DisconnectCause getDisconnectCause();
    method public final int getState();
    method public void hold();
    method public final void registerCallback(android.telecom.RemoteConference.Callback);
@@ -28264,7 +28286,7 @@ package android.telecom {
    method public void onConnectionAdded(android.telecom.RemoteConference, android.telecom.RemoteConnection);
    method public void onConnectionRemoved(android.telecom.RemoteConference, android.telecom.RemoteConnection);
    method public void onDestroyed(android.telecom.RemoteConference);
    method public void onDisconnected(android.telecom.RemoteConference, int, java.lang.String);
    method public void onDisconnected(android.telecom.RemoteConference, android.telecom.DisconnectCause);
    method public void onStateChanged(android.telecom.RemoteConference, int, int);
  }
@@ -28279,10 +28301,7 @@ package android.telecom {
    method public int getCallerDisplayNamePresentation();
    method public android.telecom.RemoteConference getConference();
    method public java.util.List<android.telecom.RemoteConnection> getConferenceableConnections();
    method public int getDisconnectCauseCode();
    method public java.lang.String getDisconnectCauseMessage();
    method public int getFailureCode();
    method public java.lang.String getFailureMessage();
    method public android.telecom.DisconnectCause getDisconnectCause();
    method public int getState();
    method public android.telecom.StatusHints getStatusHints();
    method public void hold();
@@ -28306,7 +28325,7 @@ package android.telecom {
    method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference);
    method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>);
    method public void onDestroyed(android.telecom.RemoteConnection);
    method public void onDisconnected(android.telecom.RemoteConnection, int, java.lang.String);
    method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause);
    method public void onPostDialWait(android.telecom.RemoteConnection, java.lang.String);
    method public void onRingbackRequested(android.telecom.RemoteConnection, boolean);
    method public void onStateChanged(android.telecom.RemoteConnection, int);
@@ -28512,57 +28531,6 @@ package android.telephony {
    field public static final android.os.Parcelable.Creator CREATOR;
  }
  public class DisconnectCause {
    method public static java.lang.String toString(int);
    field public static final int BUSY = 4; // 0x4
    field public static final int CALL_BARRED = 20; // 0x14
    field public static final int CDMA_ACCESS_BLOCKED = 35; // 0x23
    field public static final int CDMA_ACCESS_FAILURE = 32; // 0x20
    field public static final int CDMA_CALL_LOST = 41; // 0x29
    field public static final int CDMA_DROP = 27; // 0x1b
    field public static final int CDMA_INTERCEPT = 28; // 0x1c
    field public static final int CDMA_LOCKED_UNTIL_POWER_CYCLE = 26; // 0x1a
    field public static final int CDMA_NOT_EMERGENCY = 34; // 0x22
    field public static final int CDMA_PREEMPTED = 33; // 0x21
    field public static final int CDMA_REORDER = 29; // 0x1d
    field public static final int CDMA_RETRY_ORDER = 31; // 0x1f
    field public static final int CDMA_SO_REJECT = 30; // 0x1e
    field public static final int CONGESTION = 5; // 0x5
    field public static final int CS_RESTRICTED = 22; // 0x16
    field public static final int CS_RESTRICTED_EMERGENCY = 24; // 0x18
    field public static final int CS_RESTRICTED_NORMAL = 23; // 0x17
    field public static final int DIALED_MMI = 39; // 0x27
    field public static final int EMERGENCY_ONLY = 37; // 0x25
    field public static final int ERROR_UNSPECIFIED = 36; // 0x24
    field public static final int FDN_BLOCKED = 21; // 0x15
    field public static final int ICC_ERROR = 19; // 0x13
    field public static final int INCOMING_MISSED = 1; // 0x1
    field public static final int INCOMING_REJECTED = 16; // 0x10
    field public static final int INVALID_CREDENTIALS = 10; // 0xa
    field public static final int INVALID_NUMBER = 7; // 0x7
    field public static final int LIMIT_EXCEEDED = 15; // 0xf
    field public static final int LOCAL = 3; // 0x3
    field public static final int LOST_SIGNAL = 14; // 0xe
    field public static final int MAXIMUM_VALID_VALUE = 44; // 0x2c
    field public static final int MINIMUM_VALID_VALUE = 0; // 0x0
    field public static final int MMI = 6; // 0x6
    field public static final int NORMAL = 2; // 0x2
    field public static final int NOT_DISCONNECTED = 0; // 0x0
    field public static final int NOT_VALID = -1; // 0xffffffff
    field public static final int NO_PHONE_NUMBER_SUPPLIED = 38; // 0x26
    field public static final int NUMBER_UNREACHABLE = 8; // 0x8
    field public static final int OUTGOING_CANCELED = 44; // 0x2c
    field public static final int OUTGOING_FAILURE = 43; // 0x2b
    field public static final int OUT_OF_NETWORK = 11; // 0xb
    field public static final int OUT_OF_SERVICE = 18; // 0x12
    field public static final int POWER_OFF = 17; // 0x11
    field public static final int SERVER_ERROR = 12; // 0xc
    field public static final int SERVER_UNREACHABLE = 9; // 0x9
    field public static final int TIMED_OUT = 13; // 0xd
    field public static final int UNOBTAINABLE_NUMBER = 25; // 0x19
    field public static final int VOICEMAIL_NUMBER_MISSING = 40; // 0x28
  }
  public class IccOpenLogicalChannelResponse implements android.os.Parcelable {
    method public int describeContents();
    method public int getChannel();
+6 −0
Original line number Diff line number Diff line
@@ -33,6 +33,12 @@ public class ToneGenerator
     * List of all available tones: These constants must be kept consistant with
     * the enum in ToneGenerator C++ class.     */

    /**
     * Default value for an unknown or unspecified tone.
     * @hide
     */
    public static final int TONE_UNKNOWN = -1;

    /**
     * DTMF tone for key 0: 1336Hz, 941Hz, continuous</p>
     *
+9 −24
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package android.telecom;
import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.DisconnectCause;

import java.lang.String;
import java.util.ArrayList;
@@ -89,8 +88,7 @@ public final class Call {
        private final PhoneAccountHandle mAccountHandle;
        private final int mCallCapabilities;
        private final int mCallProperties;
        private final int mDisconnectCauseCode;
        private final String mDisconnectCauseMessage;
        private final DisconnectCause mDisconnectCause;
        private final long mConnectTimeMillis;
        private final GatewayInfo mGatewayInfo;
        private final int mVideoState;
@@ -154,18 +152,10 @@ public final class Call {

        /**
         * @return For a {@link #STATE_DISCONNECTED} {@code Call}, the disconnect cause expressed
         * as a code chosen from among those declared in {@link DisconnectCause}.
         * by {@link android.telecomm.DisconnectCause}.
         */
        public int getDisconnectCauseCode() {
            return mDisconnectCauseCode;
        }

        /**
         * @return For a {@link #STATE_DISCONNECTED} {@code Call}, an optional reason for
         * disconnection expressed as a free text message.
         */
        public String getDisconnectCauseMessage() {
            return mDisconnectCauseMessage;
        public DisconnectCause getDisconnectCause() {
            return mDisconnectCause;
        }

        /**
@@ -219,8 +209,7 @@ public final class Call {
                        Objects.equals(mAccountHandle, d.mAccountHandle) &&
                        Objects.equals(mCallCapabilities, d.mCallCapabilities) &&
                        Objects.equals(mCallProperties, d.mCallProperties) &&
                        Objects.equals(mDisconnectCauseCode, d.mDisconnectCauseCode) &&
                        Objects.equals(mDisconnectCauseMessage, d.mDisconnectCauseMessage) &&
                        Objects.equals(mDisconnectCause, d.mDisconnectCause) &&
                        Objects.equals(mConnectTimeMillis, d.mConnectTimeMillis) &&
                        Objects.equals(mGatewayInfo, d.mGatewayInfo) &&
                        Objects.equals(mVideoState, d.mVideoState) &&
@@ -240,8 +229,7 @@ public final class Call {
                    Objects.hashCode(mAccountHandle) +
                    Objects.hashCode(mCallCapabilities) +
                    Objects.hashCode(mCallProperties) +
                    Objects.hashCode(mDisconnectCauseCode) +
                    Objects.hashCode(mDisconnectCauseMessage) +
                    Objects.hashCode(mDisconnectCause) +
                    Objects.hashCode(mConnectTimeMillis) +
                    Objects.hashCode(mGatewayInfo) +
                    Objects.hashCode(mVideoState) +
@@ -258,8 +246,7 @@ public final class Call {
                PhoneAccountHandle accountHandle,
                int capabilities,
                int properties,
                int disconnectCauseCode,
                String disconnectCauseMessage,
                DisconnectCause disconnectCause,
                long connectTimeMillis,
                GatewayInfo gatewayInfo,
                int videoState,
@@ -272,8 +259,7 @@ public final class Call {
            mAccountHandle = accountHandle;
            mCallCapabilities = capabilities;
            mCallProperties = properties;
            mDisconnectCauseCode = disconnectCauseCode;
            mDisconnectCauseMessage = disconnectCauseMessage;
            mDisconnectCause = disconnectCause;
            mConnectTimeMillis = connectTimeMillis;
            mGatewayInfo = gatewayInfo;
            mVideoState = videoState;
@@ -654,8 +640,7 @@ public final class Call {
                parcelableCall.getAccountHandle(),
                parcelableCall.getCapabilities(),
                parcelableCall.getProperties(),
                parcelableCall.getDisconnectCauseCode(),
                parcelableCall.getDisconnectCauseMsg(),
                parcelableCall.getDisconnectCause(),
                parcelableCall.getConnectTimeMillis(),
                parcelableCall.getGatewayInfo(),
                parcelableCall.getVideoState(),
+8 −12
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package android.telecom;

import android.telephony.DisconnectCause;

import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -32,7 +30,7 @@ public abstract class Conference {
    /** @hide */
    public abstract static class Listener {
        public void onStateChanged(Conference conference, int oldState, int newState) {}
        public void onDisconnected(Conference conference, int cause, String message) {}
        public void onDisconnected(Conference conference, DisconnectCause disconnectCause) {}
        public void onConnectionAdded(Conference conference, Connection connection) {}
        public void onConnectionRemoved(Conference conference, Connection connection) {}
        public void onDestroyed(Conference conference) {}
@@ -46,7 +44,7 @@ public abstract class Conference {

    private PhoneAccountHandle mPhoneAccount;
    private int mState = Connection.STATE_NEW;
    private int mDisconnectCause = DisconnectCause.NOT_VALID;
    private DisconnectCause mDisconnectCause;
    private int mCapabilities;
    private String mDisconnectMessage;

@@ -146,16 +144,14 @@ public abstract class Conference {
    /**
     * Sets state to disconnected.
     *
     * @param cause The reason for the disconnection, any of
     *         {@link android.telephony.DisconnectCause}.
     * @param message Optional call-service-provided message about the disconnect.
     * @param disconnectCause The reason for the disconnection, as described by
     *     {@link android.telecom.DisconnectCause}.
     */
    public final void setDisconnected(int cause, String message) {
        mDisconnectCause = cause;
        mDisconnectMessage = message;
    public final void setDisconnected(DisconnectCause disconnectCause) {
        mDisconnectCause = disconnectCause;;
        setState(Connection.STATE_DISCONNECTED);
        for (Listener l : mListeners) {
            l.onDisconnected(this, mDisconnectCause, mDisconnectMessage);
            l.onDisconnected(this, mDisconnectCause);
        }
    }

@@ -222,7 +218,7 @@ public abstract class Conference {
        // If not yet disconnected, set the conference call as disconnected first.
        if (mState != Connection.STATE_DISCONNECTED) {
            Log.d(this, "setting to disconnected");
            setDisconnected(DisconnectCause.LOCAL, null);
            setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
        }

        // ...and notify.
+16 −29
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.telephony.DisconnectCause;
import android.view.Surface;

import java.util.ArrayList;
@@ -71,7 +70,7 @@ public abstract class Connection {
        public void onCallerDisplayNameChanged(
                Connection c, String callerDisplayName, int presentation) {}
        public void onVideoStateChanged(Connection c, int videoState) {}
        public void onDisconnected(Connection c, int cause, String message) {}
        public void onDisconnected(Connection c, DisconnectCause disconnectCause) {}
        public void onPostDialWait(Connection c, String remaining) {}
        public void onRingbackRequested(Connection c, boolean ringback) {}
        public void onDestroyed(Connection c) {}
@@ -473,8 +472,7 @@ public abstract class Connection {
    private boolean mAudioModeIsVoip;
    private StatusHints mStatusHints;
    private int mVideoState;
    private int mDisconnectCause;
    private String mDisconnectMessage;
    private DisconnectCause mDisconnectCause;
    private Conference mConference;
    private ConnectionService mConnectionService;

@@ -604,17 +602,10 @@ public abstract class Connection {
    /**
     * @return The {@link DisconnectCause} for this connection.
     */
    public final int getDisconnectCause() {
    public final DisconnectCause getDisconnectCause() {
        return mDisconnectCause;
    }

    /**
     * @return The disconnect message for this connection.
     */
    public final String getDisconnectMessage() {
        return mDisconnectMessage;
    }

    /**
     * Inform this Connection that the state of its audio output has been changed externally.
     *
@@ -774,17 +765,15 @@ public abstract class Connection {
    /**
     * Sets state to disconnected.
     *
     * @param cause The reason for the disconnection, any of
     * @param disconnectCause The reason for the disconnection, as specified by
     *         {@link DisconnectCause}.
     * @param message Optional call-service-provided message about the disconnect.
     */
    public final void setDisconnected(int cause, String message) {
        mDisconnectCause = cause;
        mDisconnectMessage = message;
    public final void setDisconnected(DisconnectCause disconnectCause) {
        mDisconnectCause = disconnectCause;
        setState(STATE_DISCONNECTED);
        Log.d(this, "Disconnected with cause %d message %s", cause, message);
        Log.d(this, "Disconnected with cause %d message %s", disconnectCause);
        for (Listener l : mListeners) {
            l.onDisconnected(this, cause, message);
            l.onDisconnected(this, disconnectCause);
        }
    }

@@ -1071,26 +1060,24 @@ public abstract class Connection {
    }

    private static class FailureSignalingConnection extends Connection {
        public FailureSignalingConnection(int cause, String message) {
            setDisconnected(cause, message);
        public FailureSignalingConnection(DisconnectCause disconnectCause) {
            setDisconnected(disconnectCause);
        }
    }

    /**
     * Return a {@code Connection} which represents a failed connection attempt. The returned
     * {@code Connection} will have a {@link #getDisconnectCause()} and
     * {@link #getDisconnectMessage()} as specified, and a {@link #getState()} of
     * {@link #STATE_DISCONNECTED}.
     * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified,
     * and a {@link #getState()} of {@link #STATE_DISCONNECTED}.
     * <p>
     * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate,
     * so users of this method need not maintain a reference to its return value to destroy it.
     *
     * @param cause The disconnect cause, ({@see DisconnectCause}).
     * @param message A reason for why the connection failed (not intended to be shown to the user).
     * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}).
     * @return A {@code Connection} which indicates failure.
     */
    public static Connection createFailedConnection(int cause, String message) {
        return new FailureSignalingConnection(cause, message);
    public static Connection createFailedConnection(DisconnectCause disconnectCause) {
        return new FailureSignalingConnection(disconnectCause);
    }

    /**
@@ -1105,7 +1092,7 @@ public abstract class Connection {
     * @return A {@code Connection} which indicates that the underlying call should be canceled.
     */
    public static Connection createCanceledConnection() {
        return new FailureSignalingConnection(DisconnectCause.OUTGOING_CANCELED, null);
        return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED));
    }

    private final void  fireOnConferenceableConnectionsChanged() {
Loading