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}