blob: 9be01380956ad0cc987fdb0f48bb2c812fcce83e [file] [log] [blame]
Andrew Lee7f3d41f2014-09-11 17:33:16 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.telecom;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.media.ToneGenerator;
22import android.text.TextUtils;
23
24import java.util.Objects;
25
26/**
27 * Describes the cause of a disconnected call. This always includes a code describing the generic
28 * cause of the disconnect. Optionally, it may include a localized label and/or localized description
29 * to display to the user which is provided by the {@link ConnectionService}. It also may contain a
30 * reason for the the disconnect, which is intended for logging and not for display to the user.
31 */
32public final class DisconnectCause implements Parcelable {
33
34 /** Disconnected because of an unknown or unspecified reason. */
35 public static final int UNKNOWN = 0;
36 /** Disconnected because there was an error, such as a problem with the network. */
37 public static final int ERROR = 1;
38 /** Disconnected because of a local user-initiated action, such as hanging up. */
39 public static final int LOCAL = 2;
40 /**
41 * Disconnected because of a remote user-initiated action, such as the other party hanging up
42 * up.
43 */
44 public static final int REMOTE = 3;
45 /** Disconnected because it has been canceled. */
46 public static final int CANCELED = 4;
47 /** Disconnected because there was no response to an incoming call. */
48 public static final int MISSED = 5;
49 /** Disconnected because the user rejected an incoming call. */
50 public static final int REJECTED = 6;
51 /** Disconnected because the other party was busy. */
52 public static final int BUSY = 7;
53 /**
54 * Disconnected because of a restriction on placing the call, such as dialing in airplane
55 * mode.
56 */
57 public static final int RESTRICTED = 8;
58 /** Disconnected for reason not described by other disconnect codes. */
59 public static final int OTHER = 9;
60
61 private int mDisconnectCode;
62 private CharSequence mDisconnectLabel;
63 private CharSequence mDisconnectDescription;
64 private String mDisconnectReason;
65 private int mToneToPlay;
66
67 /**
68 * Creates a new DisconnectCause.
69 *
70 * @param code The code for the disconnect cause.
71 */
72 public DisconnectCause(int code) {
73 this(code, null, null, null, ToneGenerator.TONE_UNKNOWN);
74 }
75
76 /**
77 * Creates a new DisconnectCause.
78 *
79 * @param code The code for the disconnect cause.
80 * @param reason The reason for the disconnect.
81 */
82 public DisconnectCause(int code, String reason) {
83 this(code, null, null, reason, ToneGenerator.TONE_UNKNOWN);
84 }
85
86 /**
87 * Creates a new DisconnectCause.
Nancy Chenf4cf77c2014-09-19 10:53:21 -070088 * @param label The localized label to show to the user to explain the disconnect.
89 * @param code The code for the disconnect cause.
90 * @param description The localized description to show to the user to explain the disconnect.
91 * @param reason The reason for the disconnect.
92 */
93 public DisconnectCause(int code, CharSequence label, CharSequence description, String reason) {
94 this(code, label, description, reason, ToneGenerator.TONE_UNKNOWN);
95 }
96
97 /**
98 * Creates a new DisconnectCause.
Andrew Lee7f3d41f2014-09-11 17:33:16 -070099 *
100 * @param code The code for the disconnect cause.
101 * @param label The localized label to show to the user to explain the disconnect.
102 * @param description The localized description to show to the user to explain the disconnect.
103 * @param reason The reason for the disconnect.
104 * @param toneToPlay The tone to play on disconnect, as defined in {@link ToneGenerator}.
105 */
106 public DisconnectCause(int code, CharSequence label, CharSequence description, String reason,
107 int toneToPlay) {
108 mDisconnectCode = code;
109 mDisconnectLabel = label;
110 mDisconnectDescription = description;
111 mDisconnectReason = reason;
112 mToneToPlay = toneToPlay;
113 }
114
115 /**
116 * Returns the code for the reason for this disconnect.
117 *
118 * @return The disconnect code.
119 */
120 public int getCode() {
121 return mDisconnectCode;
122 }
123
124 /**
125 * Returns a short label which explains the reason for the disconnect cause and is for display
126 * in the user interface. The {@link ConnectionService } is responsible for providing and
127 * localizing this label. If there is no string provided, returns null.
128 *
129 * @return The disconnect label.
130 */
131 public CharSequence getLabel() {
132 return mDisconnectLabel;
133 }
134
135 /**
136 * Returns a description which explains the reason for the disconnect cause and is for display
137 * in the user interface. The {@link ConnectionService } is responsible for providing and
138 * localizing this message. If there is no string provided, returns null.
139 *
140 * @return The disconnect description.
141 */
142 public CharSequence getDescription() {
143 return mDisconnectDescription;
144 }
145
146 /**
147 * Returns an explanation of the reason for the disconnect. This is not intended for display to
148 * the user and is used mainly for logging.
149 *
150 * @return The disconnect reason.
151 */
152 public String getReason() {
153 return mDisconnectReason;
154 }
155
156 /**
157 * Returns the tone to play when disconnected.
158 *
159 * @return the tone as defined in {@link ToneGenerator} to play when disconnected.
160 */
161 public int getTone() {
162 return mToneToPlay;
163 }
164
165 public static final Creator<DisconnectCause> CREATOR = new Creator<DisconnectCause>() {
166 @Override
167 public DisconnectCause createFromParcel(Parcel source) {
168 int code = source.readInt();
169 CharSequence label = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
170 CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
171 String reason = source.readString();
172 int tone = source.readInt();
173 return new DisconnectCause(code, label, description, reason, tone);
174 }
175
176 @Override
177 public DisconnectCause[] newArray(int size) {
178 return new DisconnectCause[size];
179 }
180 };
181
182 @Override
183 public void writeToParcel(Parcel destination, int flags) {
184 destination.writeInt(mDisconnectCode);
185 TextUtils.writeToParcel(mDisconnectLabel, destination, flags);
186 TextUtils.writeToParcel(mDisconnectDescription, destination, flags);
187 destination.writeString(mDisconnectReason);
188 destination.writeInt(mToneToPlay);
189 }
190
191 @Override
192 public int describeContents() {
193 return 0;
194 }
195
196 @Override
197 public int hashCode() {
198 return Objects.hashCode(mDisconnectCode)
199 + Objects.hashCode(mDisconnectLabel)
200 + Objects.hashCode(mDisconnectDescription)
201 + Objects.hashCode(mDisconnectReason)
202 + Objects.hashCode(mToneToPlay);
203 }
204
205 @Override
206 public boolean equals(Object o) {
207 if (o instanceof DisconnectCause) {
208 DisconnectCause d = (DisconnectCause) o;
209 return Objects.equals(mDisconnectCode, d.getCode())
210 && Objects.equals(mDisconnectLabel, d.getLabel())
211 && Objects.equals(mDisconnectDescription, d.getDescription())
212 && Objects.equals(mDisconnectReason, d.getReason())
213 && Objects.equals(mToneToPlay, d.getTone());
214 }
215 return false;
216 }
217
218 @Override
219 public String toString() {
220 String code = "";
221 switch (getCode()) {
222 case ERROR:
223 code = "ERROR";
224 break;
225 case LOCAL:
226 code = "LOCAL";
227 break;
228 case REMOTE:
229 code = "REMOTE";
230 break;
231 case MISSED:
232 code = "MISSED";
233 break;
234 case REJECTED:
235 code = "REJECTED";
236 break;
237 case BUSY:
238 code = "BUSY";
239 break;
240 case RESTRICTED:
241 code = "RESTRICTED";
242 break;
243 case OTHER:
244 code = "OTHER";
245 break;
246 case UNKNOWN:
247 default:
248 code = "UNKNOWN";
249 }
250 String label = mDisconnectLabel == null ? "" : mDisconnectLabel.toString();
251 String description = mDisconnectDescription == null
252 ? "" : mDisconnectDescription.toString();
253 String reason = mDisconnectReason == null ? "" : mDisconnectReason;
254 return "DisconnectCause [ Code: (" + code + ")"
255 + " Label: (" + label + ")"
256 + " Description: (" + description + ")"
257 + " Reason: (" + reason + ")"
258 + " Tone: (" + mToneToPlay + ") ]";
259 }
260}