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