From ede886737944f0237993d4b55d579fe9cfb9ba28 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Fri, 14 Nov 2014 10:51:30 -0800 Subject: Move ToneGenerator recreation/release to onStart/onStop There is no reason to do the costly ToneGenerator initialization inside onResume, which gets called during the Dialer -> InCallUI transition. Move it to onStart/onStop so it only happens when Dialer is actually in the background. Measurement of time taken for InCallActivity start -> onResumed, 10 runs Before: Average 541.9ms SD: 152.4ms After: Average 350.5ms SD: 81.1ms Bug: 18373617 Change-Id: I192e2bcc9fd4b7d423d804f333d8d32bff3f58c1 --- .../android/dialer/dialpad/DialpadFragment.java | 49 +++++++++++++--------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java index 6daa89cd1..321207682 100644 --- a/src/com/android/dialer/dialpad/DialpadFragment.java +++ b/src/com/android/dialer/dialpad/DialpadFragment.java @@ -564,6 +564,28 @@ public class DialpadFragment extends Fragment zero.setOnLongClickListener(this); } + @Override + public void onStart() { + super.onStart(); + // if the mToneGenerator creation fails, just continue without it. It is + // a local audio signal, and is not as important as the dtmf tone itself. + final long start = System.currentTimeMillis(); + synchronized (mToneGeneratorLock) { + if (mToneGenerator == null) { + try { + mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME); + } catch (RuntimeException e) { + Log.w(TAG, "Exception caught while creating local tone generator: " + e); + mToneGenerator = null; + } + } + } + final long total = System.currentTimeMillis() - start; + if (total > 50) { + Log.i(TAG, "Time for ToneGenerator creation: " + total); + } + }; + @Override public void onResume() { super.onResume(); @@ -592,20 +614,6 @@ public class DialpadFragment extends Fragment stopWatch.lap("hptc"); - // if the mToneGenerator creation fails, just continue without it. It is - // a local audio signal, and is not as important as the dtmf tone itself. - synchronized (mToneGeneratorLock) { - if (mToneGenerator == null) { - try { - mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME); - } catch (RuntimeException e) { - Log.w(TAG, "Exception caught while creating local tone generator: " + e); - mToneGenerator = null; - } - } - } - stopWatch.lap("tg"); - mPressedDialpadKeys.clear(); configureScreenFromIntent(getActivity()); @@ -657,12 +665,6 @@ public class DialpadFragment extends Fragment stopTone(); mPressedDialpadKeys.clear(); - synchronized (mToneGeneratorLock) { - if (mToneGenerator != null) { - mToneGenerator.release(); - mToneGenerator = null; - } - } // TODO: I wonder if we should not check if the AsyncTask that // lookup the last dialed number has completed. mLastNumberDialed = EMPTY_NUMBER; // Since we are going to query again, free stale number. @@ -674,6 +676,13 @@ public class DialpadFragment extends Fragment public void onStop() { super.onStop(); + synchronized (mToneGeneratorLock) { + if (mToneGenerator != null) { + mToneGenerator.release(); + mToneGenerator = null; + } + } + if (mClearDigitsOnStop) { mClearDigitsOnStop = false; clearDialpad(); -- cgit v1.2.3