1 /* 2 * Copyright (C) 2016 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 17 package com.android.incallui.latencyreport; 18 19 import android.os.Bundle; 20 import android.os.SystemClock; 21 22 /** Tracks latency information for a call. */ 23 public class LatencyReport { 24 25 public static final long INVALID_TIME = -1; 26 // The following are hidden constants from android.telecom.TelecomManager. 27 private static final String EXTRA_CALL_CREATED_TIME_MILLIS = 28 "android.telecom.extra.CALL_CREATED_TIME_MILLIS"; 29 private static final String EXTRA_CALL_TELECOM_ROUTING_START_TIME_MILLIS = 30 "android.telecom.extra.CALL_TELECOM_ROUTING_START_TIME_MILLIS"; 31 private static final String EXTRA_CALL_TELECOM_ROUTING_END_TIME_MILLIS = 32 "android.telecom.extra.CALL_TELECOM_ROUTING_END_TIME_MILLIS"; 33 private final boolean mWasIncoming; 34 35 // Time elapsed since boot when the call was created by the connection service. 36 private final long mCreatedTimeMillis; 37 38 // Time elapsed since boot when telecom began processing the call. 39 private final long mTelecomRoutingStartTimeMillis; 40 41 // Time elapsed since boot when telecom finished processing the call. This includes things like 42 // looking up contact info and call blocking but before showing any UI. 43 private final long mTelecomRoutingEndTimeMillis; 44 45 // Time elapsed since boot when the call was added to the InCallUi. 46 private final long mCallAddedTimeMillis; 47 48 // Time elapsed since boot when the call was added and call blocking evaluation was completed. 49 private long mCallBlockingTimeMillis = INVALID_TIME; 50 51 // Time elapsed since boot when the call notification was shown. 52 private long mCallNotificationTimeMillis = INVALID_TIME; 53 54 // Time elapsed since boot when the InCallUI was shown. 55 private long mInCallUiShownTimeMillis = INVALID_TIME; 56 57 // Whether the call was shown to the user as a heads up notification instead of a full screen 58 // UI. 59 private boolean mDidDisplayHeadsUpNotification; 60 LatencyReport()61 public LatencyReport() { 62 mWasIncoming = false; 63 mCreatedTimeMillis = INVALID_TIME; 64 mTelecomRoutingStartTimeMillis = INVALID_TIME; 65 mTelecomRoutingEndTimeMillis = INVALID_TIME; 66 mCallAddedTimeMillis = SystemClock.elapsedRealtime(); 67 } 68 LatencyReport(android.telecom.Call telecomCall)69 public LatencyReport(android.telecom.Call telecomCall) { 70 mWasIncoming = telecomCall.getState() == android.telecom.Call.STATE_RINGING; 71 Bundle extras = telecomCall.getDetails().getIntentExtras(); 72 if (extras == null) { 73 mCreatedTimeMillis = INVALID_TIME; 74 mTelecomRoutingStartTimeMillis = INVALID_TIME; 75 mTelecomRoutingEndTimeMillis = INVALID_TIME; 76 } else { 77 mCreatedTimeMillis = extras.getLong(EXTRA_CALL_CREATED_TIME_MILLIS, INVALID_TIME); 78 mTelecomRoutingStartTimeMillis = 79 extras.getLong(EXTRA_CALL_TELECOM_ROUTING_START_TIME_MILLIS, INVALID_TIME); 80 mTelecomRoutingEndTimeMillis = 81 extras.getLong(EXTRA_CALL_TELECOM_ROUTING_END_TIME_MILLIS, INVALID_TIME); 82 } 83 mCallAddedTimeMillis = SystemClock.elapsedRealtime(); 84 } 85 getWasIncoming()86 public boolean getWasIncoming() { 87 return mWasIncoming; 88 } 89 getCreatedTimeMillis()90 public long getCreatedTimeMillis() { 91 return mCreatedTimeMillis; 92 } 93 getTelecomRoutingStartTimeMillis()94 public long getTelecomRoutingStartTimeMillis() { 95 return mTelecomRoutingStartTimeMillis; 96 } 97 getTelecomRoutingEndTimeMillis()98 public long getTelecomRoutingEndTimeMillis() { 99 return mTelecomRoutingEndTimeMillis; 100 } 101 getCallAddedTimeMillis()102 public long getCallAddedTimeMillis() { 103 return mCallAddedTimeMillis; 104 } 105 getCallBlockingTimeMillis()106 public long getCallBlockingTimeMillis() { 107 return mCallBlockingTimeMillis; 108 } 109 onCallBlockingDone()110 public void onCallBlockingDone() { 111 if (mCallBlockingTimeMillis == INVALID_TIME) { 112 mCallBlockingTimeMillis = SystemClock.elapsedRealtime(); 113 } 114 } 115 getCallNotificationTimeMillis()116 public long getCallNotificationTimeMillis() { 117 return mCallNotificationTimeMillis; 118 } 119 onNotificationShown()120 public void onNotificationShown() { 121 if (mCallNotificationTimeMillis == INVALID_TIME) { 122 mCallNotificationTimeMillis = SystemClock.elapsedRealtime(); 123 } 124 } 125 getInCallUiShownTimeMillis()126 public long getInCallUiShownTimeMillis() { 127 return mInCallUiShownTimeMillis; 128 } 129 onInCallUiShown(boolean forFullScreenIntent)130 public void onInCallUiShown(boolean forFullScreenIntent) { 131 if (mInCallUiShownTimeMillis == INVALID_TIME) { 132 mInCallUiShownTimeMillis = SystemClock.elapsedRealtime(); 133 mDidDisplayHeadsUpNotification = mWasIncoming && !forFullScreenIntent; 134 } 135 } 136 getDidDisplayHeadsUpNotification()137 public boolean getDidDisplayHeadsUpNotification() { 138 return mDidDisplayHeadsUpNotification; 139 } 140 } 141