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