10464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu/* 20464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * Copyright (C) 2016 The Android Open Source Project 30464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * 40464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * Licensed under the Apache License, Version 2.0 (the "License"); 50464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * you may not use this file except in compliance with the License. 60464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * You may obtain a copy of the License at 70464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * 80464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * http://www.apache.org/licenses/LICENSE-2.0 90464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * 100464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * Unless required by applicable law or agreed to in writing, software 110464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * distributed under the License is distributed on an "AS IS" BASIS, 120464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * See the License for the specific language governing permissions and 140464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * limitations under the License 150464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu */ 160464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 170464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liupackage android.telecom; 180464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 190464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liuimport android.annotation.SystemApi; 200464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liuimport android.os.Parcel; 210464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liuimport android.os.Parcelable; 220464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 230464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu/** 240464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu * @hide 250464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu */ 260464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu@SystemApi 270464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liupublic class ParcelableCallAnalytics implements Parcelable { 280464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int CALLTYPE_UNKNOWN = 0; 290464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int CALLTYPE_INCOMING = 1; 300464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int CALLTYPE_OUTGOING = 2; 310464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 320464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // Constants for call technology 330464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int CDMA_PHONE = 0x1; 340464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int GSM_PHONE = 0x2; 350464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int IMS_PHONE = 0x4; 360464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int SIP_PHONE = 0x8; 370464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int THIRD_PARTY_PHONE = 0x10; 380464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 390464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final long MILLIS_IN_5_MINUTES = 1000 * 60 * 5; 400464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final long MILLIS_IN_1_SECOND = 1000; 410464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 420464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final int STILL_CONNECTED = -1; 430464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 440464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public static final Parcelable.Creator<ParcelableCallAnalytics> CREATOR = 450464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu new Parcelable.Creator<ParcelableCallAnalytics> () { 460464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 470464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu @Override 480464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public ParcelableCallAnalytics createFromParcel(Parcel in) { 490464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return new ParcelableCallAnalytics(in); 500464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 510464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 520464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu @Override 530464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public ParcelableCallAnalytics[] newArray(int size) { 540464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return new ParcelableCallAnalytics[size]; 550464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 560464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu }; 570464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 580464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // The start time of the call in milliseconds since Jan. 1, 1970, rounded to the nearest 590464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // 5 minute increment. 600464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final long startTimeMillis; 610464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 620464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // The duration of the call, in milliseconds. 630464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final long callDurationMillis; 640464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 650464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // ONE OF calltype_unknown, calltype_incoming, or calltype_outgoing 660464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final int callType; 670464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 680464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // true if the call came in while another call was in progress or if the user dialed this call 690464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // while in the middle of another call. 700464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final boolean isAdditionalCall; 710464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 720464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // true if the call was interrupted by an incoming or outgoing call. 730464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final boolean isInterrupted; 740464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 750464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // bitmask denoting which technologies a call used. 760464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final int callTechnologies; 770464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 780464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // Any of the DisconnectCause codes, or STILL_CONNECTED. 790464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final int callTerminationCode; 800464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 810464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // Whether the call is an emergency call 820464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final boolean isEmergencyCall; 830464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 840464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // The package name of the connection service that this call used. 850464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final String connectionService; 860464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 870464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu // Whether the call object was created from an existing connection. 880464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private final boolean isCreatedFromExistingConnection; 890464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 900464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public ParcelableCallAnalytics(long startTimeMillis, long callDurationMillis, int callType, 910464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu boolean isAdditionalCall, boolean isInterrupted, int callTechnologies, 920464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu int callTerminationCode, boolean isEmergencyCall, String connectionService, 930464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu boolean isCreatedFromExistingConnection) { 940464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.startTimeMillis = startTimeMillis; 950464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.callDurationMillis = callDurationMillis; 960464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.callType = callType; 970464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.isAdditionalCall = isAdditionalCall; 980464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.isInterrupted = isInterrupted; 990464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.callTechnologies = callTechnologies; 1000464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.callTerminationCode = callTerminationCode; 1010464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.isEmergencyCall = isEmergencyCall; 1020464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.connectionService = connectionService; 1030464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu this.isCreatedFromExistingConnection = isCreatedFromExistingConnection; 1040464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1050464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1060464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public ParcelableCallAnalytics(Parcel in) { 1070464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu startTimeMillis = in.readLong(); 1080464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu callDurationMillis = in.readLong(); 1090464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu callType = in.readInt(); 1100464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu isAdditionalCall = readByteAsBoolean(in); 1110464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu isInterrupted = readByteAsBoolean(in); 1120464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu callTechnologies = in.readInt(); 1130464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu callTerminationCode = in.readInt(); 1140464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu isEmergencyCall = readByteAsBoolean(in); 1150464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu connectionService = in.readString(); 1160464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu isCreatedFromExistingConnection = readByteAsBoolean(in); 1170464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1180464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1190464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public void writeToParcel(Parcel out, int flags) { 1200464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeLong(startTimeMillis); 1210464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeLong(callDurationMillis); 1220464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeInt(callType); 1230464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu writeBooleanAsByte(out, isAdditionalCall); 1240464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu writeBooleanAsByte(out, isInterrupted); 1250464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeInt(callTechnologies); 1260464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeInt(callTerminationCode); 1270464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu writeBooleanAsByte(out, isEmergencyCall); 1280464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeString(connectionService); 1290464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu writeBooleanAsByte(out, isCreatedFromExistingConnection); 1300464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1310464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1320464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public long getStartTimeMillis() { 1330464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return startTimeMillis; 1340464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1350464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1360464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public long getCallDurationMillis() { 1370464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return callDurationMillis; 1380464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1390464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1400464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public int getCallType() { 1410464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return callType; 1420464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1430464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1440464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public boolean isAdditionalCall() { 1450464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return isAdditionalCall; 1460464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1470464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1480464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public boolean isInterrupted() { 1490464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return isInterrupted; 1500464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1510464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1520464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public int getCallTechnologies() { 1530464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return callTechnologies; 1540464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1550464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1560464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public int getCallTerminationCode() { 1570464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return callTerminationCode; 1580464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1590464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1600464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public boolean isEmergencyCall() { 1610464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return isEmergencyCall; 1620464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1630464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1640464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public String getConnectionService() { 1650464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return connectionService; 1660464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1670464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1680464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public boolean isCreatedFromExistingConnection() { 1690464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return isCreatedFromExistingConnection; 1700464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1710464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1720464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu @Override 1730464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu public int describeContents() { 1740464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return 0; 1750464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1760464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1770464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private static void writeBooleanAsByte(Parcel out, boolean b) { 1780464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu out.writeByte((byte) (b ? 1 : 0)); 1790464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1800464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu 1810464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu private static boolean readByteAsBoolean(Parcel in) { 1820464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu return (in.readByte() == 1); 1830464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu } 1840464b9ba16ea49f7bff55d7d85231c6dd832b58eHall Liu} 185