Automated import from //branches/donutburger/...@141035,141035
David Brown [Wed, 25 Mar 2009 02:19:20 +0000 (19:19 -0700)]
src/com/android/phone/DTMFTwelveKeyDialer.java
src/com/android/phone/InCallScreen.java
src/com/android/phone/PhoneApp.java

index 1fe9ab6..667d6e7 100644 (file)
@@ -910,6 +910,8 @@ public class DTMFTwelveKeyDialer implements
             log("ignoring dtmf request for '" + c + "'");
         }
 
+        // Any DTMF keypress counts as explicit "user activity".
+        PhoneApp.getInstance().pokeUserActivity();
     }
 
     /**
index 8fe5b6c..95a1d3f 100644 (file)
@@ -495,6 +495,11 @@ public class InCallScreen extends Activity
         // screen (see onPause().))
         app.disableKeyguard();
 
+        // Touch events are never considered "user activity" while the
+        // InCallScreen is active, so that unintentional touches won't
+        // prevent the device from going to sleep.
+        app.setIgnoreTouchUserActivity(true);
+
         // Disable the status bar "window shade" the entire time we're on
         // the in-call screen.
         NotificationMgr.getDefault().getStatusBarMgr().enableExpandedView(false);
@@ -629,6 +634,8 @@ public class InCallScreen extends Activity
 
         mIsForegroundActivity = false;
 
+        PhoneApp app = PhoneApp.getInstance();
+
         // make sure the chronometer is stopped when we move away from
         // the foreground.
         if (mConferenceTime != null) {
@@ -690,9 +697,11 @@ public class InCallScreen extends Activity
         // foreground.)
         unregisterReceiver(mReceiver);
 
+        // Re-enable "user activity" for touch events.
+        app.setIgnoreTouchUserActivity(false);
+
         // The keyguard was disabled the entire time the InCallScreen was
         // active (see onResume()).  Re-enable it now.
-        PhoneApp app = PhoneApp.getInstance();
         app.reenableKeyguard();
 
         // Make sure we revert the poke lock and wake lock when we move to
@@ -1645,12 +1654,14 @@ public class InCallScreen extends Activity
                         public void onClick(DialogInterface dialog, int whichButton) {
                             if (VDBG) log("handle WAIT_PROMPT_CONFIRMED, proceed...");
                             c.proceedAfterWaitChar();
+                            PhoneApp.getInstance().pokeUserActivity();
                         }
                     })
                 .setOnCancelListener(new DialogInterface.OnCancelListener() {
                         public void onCancel(DialogInterface dialog) {
                             if (VDBG) log("handle POST_DIAL_CANCELED!");
                             c.cancelPostDial();
+                            PhoneApp.getInstance().pokeUserActivity();
                         }
                     })
                 .create();
@@ -1715,6 +1726,7 @@ public class InCallScreen extends Activity
                                     mWildPromptText = null;
                                 }
                                 c.proceedAfterWildChar(replacement);
+                                PhoneApp.getInstance().pokeUserActivity();
                             }
                         })
                 .setOnCancelListener(
@@ -1722,6 +1734,7 @@ public class InCallScreen extends Activity
                             public void onCancel(DialogInterface dialog) {
                                 if (VDBG) log("handle POST_DIAL_CANCELED!");
                                 c.cancelPostDial();
+                                PhoneApp.getInstance().pokeUserActivity();
                             }
                         })
                 .create();
@@ -2024,17 +2037,20 @@ public class InCallScreen extends Activity
                         public void onClick(DialogInterface dialog, int which) {
                             if (VDBG) log("Missing voicemail AlertDialog: POSITIVE click...");
                             msg.sendToTarget();  // see dontAddVoiceMailNumber()
+                            PhoneApp.getInstance().pokeUserActivity();
                         }})
                 .setNegativeButton(R.string.add_vm_number_str,
                                    new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int which) {
                             if (VDBG) log("Missing voicemail AlertDialog: NEGATIVE click...");
                             msg2.sendToTarget();  // see addVoiceMailNumber()
+                            PhoneApp.getInstance().pokeUserActivity();
                         }})
                 .setOnCancelListener(new OnCancelListener() {
                         public void onCancel(DialogInterface dialog) {
                             if (VDBG) log("Missing voicemail AlertDialog: CANCEL handler...");
                             msg.sendToTarget();  // see dontAddVoiceMailNumber()
+                            PhoneApp.getInstance().pokeUserActivity();
                         }})
                 .create();
 
@@ -2307,6 +2323,8 @@ public class InCallScreen extends Activity
             }
         }
 
+        // Any menu item counts as explicit "user activity".
+        PhoneApp.getInstance().pokeUserActivity();
 
         // Finally, *any* action handled here closes the menu (either
         // immediately, or after a short delay).
@@ -2924,6 +2942,7 @@ public class InCallScreen extends Activity
             View.OnClickListener endThisConnection = new View.OnClickListener() {
                     public void onClick(View v) {
                         endConferenceConnection(i, connection);
+                        PhoneApp.getInstance().pokeUserActivity();
                     }
                 };
             endButton.setOnClickListener(endThisConnection);
@@ -2932,6 +2951,7 @@ public class InCallScreen extends Activity
                 View.OnClickListener separateThisConnection = new View.OnClickListener() {
                         public void onClick(View v) {
                             separateConferenceConnection(i, connection);
+                            PhoneApp.getInstance().pokeUserActivity();
                         }
                     };
                 separateButton.setOnClickListener(separateThisConnection);
@@ -3105,6 +3125,9 @@ public class InCallScreen extends Activity
         // ANY time the dialpad becomes visible, start the timer that will
         // eventually bring up the "touch lock" overlay.
         resetTouchLockTimer();
+
+        // This counts as explicit "user activity".
+        PhoneApp.getInstance().pokeUserActivity();
     }
 
     /**
@@ -3117,6 +3140,9 @@ public class InCallScreen extends Activity
         // Dismiss the "touch lock" overlay if it was visible.
         // (The overlay is only ever used on top of the dialpad).
         enableTouchLock(false);
+
+        // This counts as explicit "user activity".
+        PhoneApp.getInstance().pokeUserActivity();
     }
 
     /**
@@ -3674,11 +3700,12 @@ public class InCallScreen extends Activity
         // anywhere else on the overlay.
         //
 
-        // Sanity-check: We should only get touch events when the
-        // touch lock UI is visible (including the time during the
-        // fade-in animation.)
+        // We only care about touch events while the touch lock UI is
+        // visible (including the time during the fade-in animation.)
         if (((v == mTouchLockIcon) || (v == mTouchLockOverlay)) && !isTouchLocked()) {
-            Log.w(LOG_TAG, "onTouch: got event from the touch lock UI, but we're not locked!");
+            // Got an event from the touch lock UI, but we're not locked!
+            // (This was probably a touch-UP right after we unlocked.
+            // Ignore it.)
             return false;
         }
 
@@ -3696,6 +3723,8 @@ public class InCallScreen extends Activity
                     // message in the future to bring it back later.
                     enableTouchLock(false);
                     resetTouchLockTimer();
+                    // This counts as explicit "user activity".
+                    PhoneApp.getInstance().pokeUserActivity();
                 }
             } else if (event.getAction() == MotionEvent.ACTION_UP) {
                 // Stash away the current time in case this is the first
index d6b6551..c7fdf13 100644 (file)
@@ -156,7 +156,8 @@ public class PhoneApp extends Application {
     private boolean mIsHeadsetPlugged;
 
     private WakeState mWakeState = WakeState.SLEEP;
-    private ScreenTimeoutDuration mPokeLockSetting = ScreenTimeoutDuration.DEFAULT;
+    private ScreenTimeoutDuration mScreenTimeoutDuration = ScreenTimeoutDuration.DEFAULT;
+    private boolean mIgnoreTouchUserActivity = false;
     private IBinder mPokeLockToken = new Binder();
     private IPowerManager mPowerManagerService;
     private PowerManager.WakeLock mWakeLock;
@@ -612,11 +613,19 @@ public class PhoneApp extends Application {
         // make sure we don't set the poke lock repeatedly so that we
         // avoid triggering the userActivity calls in
         // PowerManagerService.setPokeLock().
-        if (duration == mPokeLockSetting) {
+        if (duration == mScreenTimeoutDuration) {
             return;
         }
-        mPokeLockSetting = duration;
+        mScreenTimeoutDuration = duration;
+        updatePokeLock();
+    }
 
+    /**
+     * Update the state of the poke lock held by the phone app,
+     * based on the current desired screen timeout and the
+     * current "ignore user activity on touch" flag.
+     */
+    private void updatePokeLock() {
         // This is kind of convoluted, but the basic thing to remember is
         // that the poke lock just sends a message to the screen to tell
         // it to stay on for a while.
@@ -628,7 +637,7 @@ public class PhoneApp extends Application {
         // The short timeout is really used whenever we want to give up
         // the screen lock, such as when we're in call.
         int pokeLockSetting = LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS;
-        switch (duration) {
+        switch (mScreenTimeoutDuration) {
             case SHORT:
                 // Set the poke lock to timeout the display after a short
                 // timeout (5s). This ensures that the screen goes to sleep
@@ -654,10 +663,15 @@ public class PhoneApp extends Application {
                 break;
         }
 
+        if (mIgnoreTouchUserActivity) {
+            pokeLockSetting |= LocalPowerManager.POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS;
+        }
+
         // Send the request
         try {
             mPowerManagerService.setPokeLock(pokeLockSetting, mPokeLockToken, LOG_TAG);
         } catch (RemoteException e) {
+            Log.w(LOG_TAG, "mPowerManagerService.setPokeLock() failed: " + e);
         }
     }
 
@@ -830,6 +844,41 @@ public class PhoneApp extends Application {
         }
     }
 
+    /**
+     * Sets or clears the flag that tells the PowerManager that touch
+     * (and cheek) events should NOT be considered "user activity".
+     *
+     * Since the in-call UI is totally insensitive to touch in most
+     * states, we set this flag whenever the InCallScreen is in the
+     * foreground.  (Otherwise, repeated unintentional touches could
+     * prevent the device from going to sleep.)
+     *
+     * There *are* some some touch events that really do count as user
+     * activity, though.  For those, we need to manually poke the
+     * PowerManager's userActivity method; see pokeUserActivity().
+     */
+    /* package */ void setIgnoreTouchUserActivity(boolean ignore) {
+        if (VDBG) Log.d(LOG_TAG, "setIgnoreTouchUserActivity(" + ignore + ")...");
+        mIgnoreTouchUserActivity = ignore;
+        updatePokeLock();
+    }
+
+    /**
+     * Manually pokes the PowerManager's userActivity method.  Since we
+     * hold the POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS poke lock while
+     * the InCallScreen is active, we need to do this for touch events
+     * that really do count as user activity (like DTMF key presses, or
+     * unlocking the "touch lock" overlay.)
+     */
+    /* package */ void pokeUserActivity() {
+        if (VDBG) Log.d(LOG_TAG, "pokeUserActivity()...");
+        try {
+            mPowerManagerService.userActivity(SystemClock.uptimeMillis(), false);
+        } catch (RemoteException e) {
+            Log.w(LOG_TAG, "mPowerManagerService.userActivity() failed: " + e);
+        }
+    }
+
     KeyguardManager getKeyguardManager() {
         return mKeyguardManager;
     }