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