1f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu/*
2f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * Copyright (C) 2016 The Android Open Source Project
3f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu *
4f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * Licensed under the Apache License, Version 2.0 (the "License");
5f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * you may not use this file except in compliance with the License.
6f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * You may obtain a copy of the License at
7f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu *
8f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu *      http://www.apache.org/licenses/LICENSE-2.0
9f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu *
10f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * Unless required by applicable law or agreed to in writing, software
11f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * distributed under the License is distributed on an "AS IS" BASIS,
12f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * See the License for the specific language governing permissions and
14f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu * limitations under the License.
15f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu */
16f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
17f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yupackage com.android.internal.telephony.metrics;
18f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
19f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport android.os.SystemClock;
20f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
21f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport com.android.internal.telephony.TelephonyProto.TelephonyCallSession;
22f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
23f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport java.util.ArrayDeque;
24f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yuimport java.util.Deque;
25f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
26f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu/** The ongoing Call session */
27f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yupublic class InProgressCallSession {
28f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
29f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Maximum events stored in the session */
30f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    private static final int MAX_EVENTS = 300;
31f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
32f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Phone id */
33f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public final int phoneId;
34f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
35f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Call session events */
36f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public final Deque<TelephonyCallSession.Event> events;
37f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
38f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Call session starting system time in minute */
39f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public final int startSystemTimeMin;
40f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
41f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Call session starting elapsed time in milliseconds */
42f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public final long startElapsedTimeMs;
43f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
44f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** The last event's time */
45f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    private long mLastElapsedTimeMs;
46f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
47f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Indicating events dropped */
48f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    private boolean mEventsDropped = false;
49f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
50f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /** Check if events dropped */
51f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public boolean isEventsDropped() { return mEventsDropped; }
52f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
53f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /**
54f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * Constructor
55f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     *
56f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * @param phoneId Phone id
57f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     */
58f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public InProgressCallSession(int phoneId) {
59f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        this.phoneId = phoneId;
60f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        events = new ArrayDeque<>();
61f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        // Save session start with lowered precision due to the privacy requirements
62f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        startSystemTimeMin = TelephonyMetrics.roundSessionStart(System.currentTimeMillis());
63f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        startElapsedTimeMs = SystemClock.elapsedRealtime();
64f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        mLastElapsedTimeMs = startElapsedTimeMs;
65f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    }
66f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
67f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /**
68f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * Add event
69f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     *
70f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * @param builder Event builder
71f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     */
72f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    public void addEvent(CallSessionEventBuilder builder) {
73f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        addEvent(SystemClock.elapsedRealtime(), builder);
74f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    }
75f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
76f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    /**
77f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * Add event
78f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     *
79f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * @param timestamp Timestamp to be recoded with the event
80f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     * @param builder Event builder
81f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu     */
82f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    synchronized public void addEvent(long timestamp, CallSessionEventBuilder builder) {
83f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        if (events.size() >= MAX_EVENTS) {
84f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu            events.removeFirst();
85f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu            mEventsDropped = true;
86f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        }
87f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
88f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        builder.setDelay(TelephonyMetrics.toPrivacyFuzzedTimeInterval(
89f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu                mLastElapsedTimeMs, timestamp));
90f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu
91f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        events.add(builder.build());
92f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu        mLastElapsedTimeMs = timestamp;
93f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu    }
94f2d0fa64860a12423fb8709766d6af90fba5e6cfJack Yu}