17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2006 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Debug; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Handler; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.SystemClock; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Call; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Connection; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.io.File; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Helper class used to keep track of various "elapsed time" indications 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * in the Phone app, and also to start and stop tracing / profiling. 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class CallTime extends Handler { 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String LOG_TAG = "PHONE/CallTime"; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final boolean DBG = false; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ static final boolean PROFILE = true; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PROFILE_STATE_NONE = 0; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PROFILE_STATE_READY = 1; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int PROFILE_STATE_RUNNING = 2; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static int sProfileState = PROFILE_STATE_NONE; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Call mCall; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private long mLastReportedTime; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private boolean mTimerRunning; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private long mInterval; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PeriodicTimerCallback mTimerCallback; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private OnTickListener mListener; 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon interface OnTickListener { 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void onTickForCallTimeElapsed(long timeElapsed); 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public CallTime(OnTickListener listener) { 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mListener = listener; 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTimerCallback = new PeriodicTimerCallback(); 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Sets the call timer to "active call" mode, where the timer will 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * periodically update the UI to show how long the specified call 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * has been active. 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * After calling this you should also call reset() and 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * periodicUpdateTimer() to get the timer started. 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void setActiveCallMode(Call call) { 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("setActiveCallMode(" + call + ")..."); 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCall = call; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // How frequently should we update the UI? 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mInterval = 1000; // once per second 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void reset() { 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("reset()..."); 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mLastReportedTime = SystemClock.uptimeMillis() - mInterval; 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void periodicUpdateTimer() { 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mTimerRunning) { 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTimerRunning = true; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long now = SystemClock.uptimeMillis(); 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long nextReport = mLastReportedTime + mInterval; 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon while (now >= nextReport) { 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon nextReport += mInterval; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("periodicUpdateTimer() @ " + nextReport); 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon postAtTime(mTimerCallback, nextReport); 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mLastReportedTime = nextReport; 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCall != null) { 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Call.State state = mCall.getState(); 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (state == Call.State.ACTIVE) { 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateElapsedTime(mCall); 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PROFILE && isTraceReady()) { 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startTrace(); 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("periodicUpdateTimer: timer already running, bail"); 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ void cancelTimer() { 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("cancelTimer()..."); 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon removeCallbacks(mTimerCallback); 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTimerRunning = false; 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateElapsedTime(Call call) { 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mListener != null) { 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long duration = getCallDuration(call); 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mListener.onTickForCallTimeElapsed(duration / 1000); 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /** 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Returns a "call duration" value for the specified Call, in msec, 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * suitable for display in the UI. 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon /* package */ static long getCallDuration(Call call) { 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long duration = 0; 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon List connections = call.getConnections(); 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int count = connections.size(); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Connection c; 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (count == 1) { 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon c = (Connection) connections.get(0); 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //duration = (state == Call.State.ACTIVE 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ? c.getDurationMillis() : c.getHoldDurationMillis()); 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon duration = c.getDurationMillis(); 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (int i = 0; i < count; i++) { 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon c = (Connection) connections.get(i); 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon //long t = (state == Call.State.ACTIVE 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // ? c.getDurationMillis() : c.getHoldDurationMillis()); 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon long t = c.getDurationMillis(); 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (t > duration) { 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon duration = t; 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (DBG) log("updateElapsedTime, count=" + count + ", duration=" + duration); 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return duration; 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static void log(String msg) { 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.d(LOG_TAG, "[CallTime] " + msg); 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class PeriodicTimerCallback implements Runnable { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon PeriodicTimerCallback() { 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PROFILE && isTraceRunning()) { 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon stopTrace(); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mTimerRunning = false; 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon periodicUpdateTimer(); 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static void setTraceReady() { 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (sProfileState == PROFILE_STATE_NONE) { 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sProfileState = PROFILE_STATE_READY; 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("trace ready..."); 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("current trace state = " + sProfileState); 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isTraceReady() { 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return sProfileState == PROFILE_STATE_READY; 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isTraceRunning() { 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return sProfileState == PROFILE_STATE_RUNNING; 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void startTrace() { 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PROFILE & sProfileState == PROFILE_STATE_READY) { 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // For now, we move away from temp directory in favor of 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // the application's data directory to store the trace 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // information (/data/data/com.android.phone). 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon File file = PhoneGlobals.getInstance().getDir ("phoneTrace", Context.MODE_PRIVATE); 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (file.exists() == false) { 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon file.mkdirs(); 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String baseName = file.getPath() + File.separator + "callstate"; 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String dataFile = baseName + ".data"; 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String keyFile = baseName + ".key"; 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon file = new File(dataFile); 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (file.exists() == true) { 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon file.delete(); 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon file = new File(keyFile); 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (file.exists() == true) { 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon file.delete(); 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sProfileState = PROFILE_STATE_RUNNING; 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("startTrace"); 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Debug.startMethodTracing(baseName, 8 * 1024 * 1024); 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void stopTrace() { 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (PROFILE) { 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (sProfileState == PROFILE_STATE_RUNNING) { 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon sProfileState = PROFILE_STATE_NONE; 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon log("stopTrace"); 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Debug.stopMethodTracing(); 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 232