From 53071d6d159f6dfd6fe0328a39bcf967ef308a64 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Wed, 13 May 2009 17:29:48 -0700 Subject: Added LatencyTimer to ease latency measurements new file: core/java/android/os/LatencyTimer.java modified: core/java/android/view/MotionEvent.java modified: core/java/android/view/ViewRoot.java modified: services/java/com/android/server/InputDevice.java modified: services/java/com/android/server/KeyInputQueue.java modified: services/java/com/android/server/WindowManagerService.java --- .../com/android/server/WindowManagerService.java | 49 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) (limited to 'services/java/com/android/server/WindowManagerService.java') diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 3fa5baf..26e34aa 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -63,6 +63,7 @@ import android.os.Binder; import android.os.Debug; import android.os.Handler; import android.os.IBinder; +import android.os.LatencyTimer; import android.os.LocalPowerManager; import android.os.Looper; import android.os.Message; @@ -133,7 +134,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo static final boolean DEBUG_STARTING_WINDOW = false; static final boolean DEBUG_REORDER = false; static final boolean SHOW_TRANSACTIONS = false; - + static final boolean MEASURE_LATENCY = false; + static private LatencyTimer lt; + static final boolean PROFILE_ORIENTATION = false; static final boolean BLUR = true; static final boolean localLOGV = DEBUG; @@ -495,6 +498,10 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo private WindowManagerService(Context context, PowerManagerService pm, boolean haveInputMethods) { + if (MEASURE_LATENCY) { + lt = new LatencyTimer(100, 1000); + } + mContext = context; mHaveInputMethods = haveInputMethods; mLimitedAlphaCompositing = context.getResources().getBoolean( @@ -3775,9 +3782,17 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo if (DEBUG_INPUT || WindowManagerPolicy.WATCH_POINTER) Log.v(TAG, "dispatchPointer " + ev); + if (MEASURE_LATENCY) { + lt.sample("3 Wait for last dispatch ", System.nanoTime() - qev.whenNano); + } + Object targetObj = mKeyWaiter.waitForNextEventTarget(null, qev, ev, true, false); + if (MEASURE_LATENCY) { + lt.sample("3 Last dispatch finished ", System.nanoTime() - qev.whenNano); + } + int action = ev.getAction(); if (action == MotionEvent.ACTION_UP) { @@ -3814,6 +3829,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo WindowState target = (WindowState)targetObj; final long eventTime = ev.getEventTime(); + final long eventTimeNano = ev.getEventTimeNano(); //Log.i(TAG, "Sending " + ev + " to " + target); @@ -3832,6 +3848,10 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo } } + if (MEASURE_LATENCY) { + lt.sample("4 in dispatchPointer ", System.nanoTime() - eventTimeNano); + } + if ((target.mAttrs.flags & WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES) != 0) { //target wants to ignore fat touch events @@ -3914,6 +3934,10 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo } } + if (MEASURE_LATENCY) { + lt.sample("5 in dispatchPointer ", System.nanoTime() - eventTimeNano); + } + synchronized(mWindowMap) { if (qev != null && action == MotionEvent.ACTION_MOVE) { mKeyWaiter.bindTargetWindowLocked(target, @@ -3951,7 +3975,16 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo if (DEBUG_INPUT || DEBUG_FOCUS || WindowManagerPolicy.WATCH_POINTER) { Log.v(TAG, "Delivering pointer " + qev + " to " + target); } + + if (MEASURE_LATENCY) { + lt.sample("6 before svr->client ipc ", System.nanoTime() - eventTimeNano); + } + target.mClient.dispatchPointer(ev, eventTime); + + if (MEASURE_LATENCY) { + lt.sample("7 after svr->client ipc ", System.nanoTime() - eventTimeNano); + } return true; } catch (android.os.RemoteException e) { Log.i(TAG, "WINDOW DIED during motion dispatch: " + target); @@ -5072,7 +5105,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo } } } - }; + } public boolean detectSafeMode() { mSafeMode = mPolicy.detectSafeMode(); @@ -5137,9 +5170,13 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo if (DEBUG_INPUT && ev != null) Log.v( TAG, "Event: type=" + ev.classType + " data=" + ev.event); + if (MEASURE_LATENCY) { + lt.sample("2 got event ", System.nanoTime() - ev.whenNano); + } + try { if (ev != null) { - curTime = ev.when; + curTime = SystemClock.uptimeMillis(); int eventType; if (ev.classType == RawInputEvent.CLASS_TOUCHSCREEN) { eventType = eventType((MotionEvent)ev.event); @@ -5150,11 +5187,9 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo eventType = LocalPowerManager.OTHER_EVENT; } try { - long now = SystemClock.uptimeMillis(); - - if ((now - mLastBatteryStatsCallTime) + if ((curTime - mLastBatteryStatsCallTime) >= MIN_TIME_BETWEEN_USERACTIVITIES) { - mLastBatteryStatsCallTime = now; + mLastBatteryStatsCallTime = curTime; mBatteryStats.noteInputEvent(); } } catch (RemoteException e) { -- cgit v1.1 From d1a9337380cf9f40f1aa095457b11242d483295d Mon Sep 17 00:00:00 2001 From: Suchi Amalapurapu Date: Thu, 14 May 2009 17:54:31 -0700 Subject: Add a new window flag to display a window when keyguard is shown. --- services/java/com/android/server/WindowManagerService.java | 3 --- 1 file changed, 3 deletions(-) (limited to 'services/java/com/android/server/WindowManagerService.java') diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 3fa5baf..a04d73a 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -1300,7 +1300,6 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo mKeyWaiter.handleNewWindowLocked(mCurrentFocus); } } - if (localLOGV) Log.v( TAG, "New client " + client.asBinder() + ": window=" + win); @@ -7732,7 +7731,6 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo int i; // FIRST LOOP: Perform a layout, if needed. - performLayoutLockedInner(); if (mFxSession == null) { @@ -7752,7 +7750,6 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo } // SECOND LOOP: Execute animations and update visibility of windows. - boolean orientationChangeComplete = true; Session holdScreen = null; float screenBrightness = -1; -- cgit v1.1 From e10de97205449ddeaaeb8f2922909c1f4cc62b86 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Mon, 18 May 2009 11:24:50 -0700 Subject: Throttle one last user activity call to 1/sec that was missed last time modified: services/java/com/android/server/WindowManagerService.java --- .../java/com/android/server/WindowManagerService.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'services/java/com/android/server/WindowManagerService.java') diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 1a0d00b..4561e1a 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -3721,7 +3721,7 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo private final void wakeupIfNeeded(WindowState targetWin, int eventType) { long curTime = SystemClock.uptimeMillis(); - if (eventType == LONG_TOUCH_EVENT || eventType == CHEEK_EVENT) { + if (eventType == TOUCH_EVENT || eventType == LONG_TOUCH_EVENT || eventType == CHEEK_EVENT) { if (mLastTouchEventType == eventType && (curTime - mLastUserActivityCallTime) < MIN_TIME_BETWEEN_USERACTIVITIES) { return; @@ -5194,7 +5194,21 @@ public class WindowManagerService extends IWindowManager.Stub implements Watchdo } catch (RemoteException e) { // Ignore } - mPowerManager.userActivity(curTime, false, eventType, false); + + if (eventType != TOUCH_EVENT + && eventType != LONG_TOUCH_EVENT + && eventType != CHEEK_EVENT) { + mPowerManager.userActivity(curTime, false, + eventType, false); + } else if (mLastTouchEventType != eventType + || (curTime - mLastUserActivityCallTime) + >= MIN_TIME_BETWEEN_USERACTIVITIES) { + mLastUserActivityCallTime = curTime; + mLastTouchEventType = eventType; + mPowerManager.userActivity(curTime, false, + eventType, false); + } + switch (ev.classType) { case RawInputEvent.CLASS_KEYBOARD: KeyEvent ke = (KeyEvent)ev.event; -- cgit v1.1