From 5943c200a4707fb8acd38c1709e30c400b65349e Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 12 Apr 2010 21:36:49 -0700 Subject: [PATCH 1/5] Fix issue #2420340: if FLAG_SHOW_WHEN_LOCKED, do not show keyguard... ...go directly to unlock screen Fix a problem where, when we are moving windows due to a configuration change, our wait to have the windows get redrawn would also inadvertently make us think their surfaces should be hidden, leading to nasty things like the lock screen thinking it should be shown again (and thus forcing the orientation back to portrait). Change-Id: I79057cfbc93ff59fd3558da997d4f73796e6aabe --- .../android/server/WindowManagerService.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index cd6a13102be38..0fa62e8ebd541 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -4418,7 +4418,8 @@ public class WindowManagerService extends IWindowManager.Stub final int N = mWindows.size(); for (int i=0; i Date: Tue, 13 Apr 2010 14:41:27 -0400 Subject: [PATCH 2/5] Manually integrating froyo lockscreen fixes: I6872c3ad135bc34348adafa76e08a3878f1b506f "Add emergency call button to PUK'd lockscreen." Bug: 2568732 I5ad8745443fc97225af9efb938e4640cfc29b5d7 "Restore text field used by sliding tab to give ringer mode feedback." Bug: 2587358 Change-Id: Ide3ad839aaf029930c0bf7ba4b9f6587efbd811d --- .../internal/policy/impl/LockScreen.java | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/policy/com/android/internal/policy/impl/LockScreen.java b/policy/com/android/internal/policy/impl/LockScreen.java index baed9ebcea326..a5ef1fab389f3 100644 --- a/policy/com/android/internal/policy/impl/LockScreen.java +++ b/policy/com/android/internal/policy/impl/LockScreen.java @@ -66,6 +66,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM private TextView mStatus1; private TextView mStatus2; private TextView mScreenLocked; + private TextView mEmergencyCallText; private Button mEmergencyCallButton; // current configuration state of keyboard and display @@ -185,7 +186,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM Log.v(TAG, "Cur orient=" + mCreationOrientation + " res orient=" + context.getResources().getConfiguration().orientation); } - + final LayoutInflater inflater = LayoutInflater.from(context); if (DBG) Log.v(TAG, "Creation orientation = " + mCreationOrientation); if (mCreationOrientation != Configuration.ORIENTATION_LANDSCAPE) { @@ -203,19 +204,23 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM mStatus1 = (TextView) findViewById(R.id.status1); mStatus2 = (TextView) findViewById(R.id.status2); - mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton); - mEmergencyCallButton.setText(R.string.lockscreen_emergency_call); - mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); mScreenLocked = (TextView) findViewById(R.id.screenLocked); mSelector = (SlidingTab) findViewById(R.id.tab_selector); mSelector.setHoldAfterTrigger(true, false); mSelector.setLeftHintText(R.string.lockscreen_unlock_label); + + mEmergencyCallText = (TextView) findViewById(R.id.emergencyCallText); + mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton); + mEmergencyCallButton.setText(R.string.lockscreen_emergency_call); + + mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); mEmergencyCallButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mCallback.takeEmergencyCallAction(); } }); + setFocusable(true); setFocusableInTouchMode(true); setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); @@ -269,7 +274,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM refreshBatteryStringAndIcon(); refreshAlarmDisplay(); - mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); mTimeFormat = DateFormat.getTimeFormat(getContext()); mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year); @@ -340,8 +344,6 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM * @param iconResourceId The left hand icon. */ private void toastMessage(final TextView textView, final String text, final int color, final int iconResourceId) { - if (DBG) android.util.Log.d("LockScreen", "toastMessage(text=" + text +", color=" + color + ")"); - if (mPendingR1 != null) { textView.removeCallbacks(mPendingR1); mPendingR1 = null; @@ -499,9 +501,11 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM * Update the layout to match the current status. */ private void updateLayout(Status status) { - // The emergency call button appears where the carrier would - // ordinarily be shown, so if one is VISIBLE the other must be - // INVISIBLE. + // The emergency call button no longer appears on this screen. + if (DBG) Log.d(TAG, "updateLayout: status=" + status); + + mEmergencyCallButton.setVisibility(View.GONE); // in almost all cases + switch (status) { case Normal: // text @@ -509,12 +513,14 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM getCarrierString( mUpdateMonitor.getTelephonyPlmn(), mUpdateMonitor.getTelephonySpn())); -// mScreenLocked.setText(R.string.lockscreen_screen_locked); + + // Empty now, but used for sliding tab feedback + mScreenLocked.setText(""); // layout mScreenLocked.setVisibility(View.VISIBLE); mSelector.setVisibility(View.VISIBLE); - mEmergencyCallButton.setVisibility(View.GONE); + mEmergencyCallText.setVisibility(View.GONE); break; case NetworkLocked: // The carrier string shows both sim card status (i.e. No Sim Card) and @@ -528,34 +534,31 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM // layout mScreenLocked.setVisibility(View.VISIBLE); mSelector.setVisibility(View.VISIBLE); - mEmergencyCallButton.setVisibility(View.GONE); + mEmergencyCallText.setVisibility(View.GONE); break; case SimMissing: // text - mCarrier.setText(""); - mScreenLocked.setText( - getCarrierString( - mUpdateMonitor.getTelephonyPlmn(), - getContext().getText(R.string.lockscreen_missing_sim_message_short))); - // previously shown here: lockscreen_instructions_when_pattern_disabled + mCarrier.setText(R.string.lockscreen_missing_sim_message_short); + mScreenLocked.setText(R.string.lockscreen_missing_sim_instructions); // layout mScreenLocked.setVisibility(View.VISIBLE); mSelector.setVisibility(View.VISIBLE); - mEmergencyCallButton.setVisibility(View.VISIBLE); + mEmergencyCallText.setVisibility(View.VISIBLE); + // do not need to show the e-call button; user may unlock break; case SimMissingLocked: // text - mCarrier.setText(""); - mScreenLocked.setText( + mCarrier.setText( getCarrierString( mUpdateMonitor.getTelephonyPlmn(), getContext().getText(R.string.lockscreen_missing_sim_message_short))); - // previously shown here: lockscreen_missing_sim_instructions + mScreenLocked.setText(R.string.lockscreen_missing_sim_instructions); // layout mScreenLocked.setVisibility(View.VISIBLE); - mSelector.setVisibility(View.GONE); + mSelector.setVisibility(View.GONE); // cannot unlock + mEmergencyCallText.setVisibility(View.VISIBLE); mEmergencyCallButton.setVisibility(View.VISIBLE); break; case SimLocked: @@ -568,20 +571,20 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM // layout mScreenLocked.setVisibility(View.INVISIBLE); mSelector.setVisibility(View.VISIBLE); - mEmergencyCallButton.setVisibility(View.GONE); + mEmergencyCallText.setVisibility(View.GONE); break; case SimPukLocked: // text - mCarrier.setText(""); - mScreenLocked.setText( + mCarrier.setText( getCarrierString( mUpdateMonitor.getTelephonyPlmn(), getContext().getText(R.string.lockscreen_sim_puk_locked_message))); - // previously shown here: lockscreen_sim_puk_locked_instructions); + mScreenLocked.setText(R.string.lockscreen_sim_puk_locked_instructions); // layout mScreenLocked.setVisibility(View.VISIBLE); - mSelector.setVisibility(View.GONE); + mSelector.setVisibility(View.GONE); // cannot unlock + mEmergencyCallText.setVisibility(View.VISIBLE); mEmergencyCallButton.setVisibility(View.VISIBLE); break; } @@ -618,7 +621,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen, KeyguardUpdateM } } } - + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); From 102ed89dbccdebb8d4c1fc0c3ec2957d55be1a22 Mon Sep 17 00:00:00 2001 From: Grace Kloba Date: Tue, 13 Apr 2010 16:27:41 -0700 Subject: [PATCH 3/5] If we defer processing the touch events, pass the original view coordinate with TouchEventData and use them when we reprocess the events. We can't depend on contentToView() to convert the doc point to the view point. When we originally convert the view to doc, the scroll position in UI doesn't change. When we convert the doc back to view, we are chasing a moving target. That is why we saw bigger delta. Fix http://b/issue?id=2577274 --- core/java/android/webkit/WebView.java | 48 +++++++++++++++-------- core/java/android/webkit/WebViewCore.java | 2 + 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 06a7a6f4c127c..7bd83e7c10d5d 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -4659,13 +4659,16 @@ public class WebView extends AbsoluteLayout ted.mY = contentY; ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; - mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); if (mDeferTouchProcess) { // still needs to set them for compute deltaX/Y mLastTouchX = x; mLastTouchY = y; + ted.mViewX = x; + ted.mViewY = y; + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); break; } + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); if (!inFullScreenMode()) { mPrivateHandler.sendMessageDelayed(mPrivateHandler .obtainMessage(PREVENT_DEFAULT_TIMEOUT, @@ -4691,17 +4694,20 @@ public class WebView extends AbsoluteLayout // pass the touch events from UI thread to WebCore thread if (shouldForwardTouchEvent() && mConfirmMove && (firstMove || eventTime - mLastSentTouchTime > mCurrentTouchInterval)) { + mLastSentTouchTime = eventTime; TouchEventData ted = new TouchEventData(); ted.mAction = action; ted.mX = contentX; ted.mY = contentY; ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; - mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); - mLastSentTouchTime = eventTime; if (mDeferTouchProcess) { + ted.mViewX = x; + ted.mViewY = y; + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); break; } + mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); if (firstMove && !inFullScreenMode()) { mPrivateHandler.sendMessageDelayed(mPrivateHandler .obtainMessage(PREVENT_DEFAULT_TIMEOUT, @@ -4866,6 +4872,10 @@ public class WebView extends AbsoluteLayout ted.mY = contentY; ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; + if (mDeferTouchProcess) { + ted.mViewX = x; + ted.mViewY = y; + } mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); } mLastTouchUpTime = eventTime; @@ -4880,6 +4890,10 @@ public class WebView extends AbsoluteLayout ted.mY = contentY; ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; + if (mDeferTouchProcess) { + ted.mViewX = x; + ted.mViewY = y; + } mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); } else if (mPreventDefault != PREVENT_DEFAULT_YES){ doDoubleTap(); @@ -6156,6 +6170,10 @@ public class WebView extends AbsoluteLayout // simplicity for now, we don't set it. ted.mMetaState = 0; ted.mReprocess = mDeferTouchProcess; + if (mDeferTouchProcess) { + ted.mViewX = mLastTouchX; + ted.mViewY = mLastTouchY; + } mWebViewCore.sendMessage(EventHub.TOUCH_EVENT, ted); } else if (mPreventDefault != PREVENT_DEFAULT_YES) { mTouchMode = TOUCH_DONE_MODE; @@ -6452,31 +6470,27 @@ public class WebView extends AbsoluteLayout TouchEventData ted = (TouchEventData) msg.obj; switch (ted.mAction) { case MotionEvent.ACTION_DOWN: - mLastDeferTouchX = contentToViewX(ted.mX) - - mScrollX; - mLastDeferTouchY = contentToViewY(ted.mY) - - mScrollY; + mLastDeferTouchX = ted.mViewX; + mLastDeferTouchY = ted.mViewY; mDeferTouchMode = TOUCH_INIT_MODE; break; case MotionEvent.ACTION_MOVE: { // no snapping in defer process - int x = contentToViewX(ted.mX) - mScrollX; - int y = contentToViewY(ted.mY) - mScrollY; if (mDeferTouchMode != TOUCH_DRAG_MODE) { mDeferTouchMode = TOUCH_DRAG_MODE; - mLastDeferTouchX = x; - mLastDeferTouchY = y; + mLastDeferTouchX = ted.mViewX; + mLastDeferTouchY = ted.mViewY; startDrag(); } int deltaX = pinLocX((int) (mScrollX - + mLastDeferTouchX - x)) + + mLastDeferTouchX - ted.mViewX)) - mScrollX; int deltaY = pinLocY((int) (mScrollY - + mLastDeferTouchY - y)) + + mLastDeferTouchY - ted.mViewY)) - mScrollY; doDrag(deltaX, deltaY); - if (deltaX != 0) mLastDeferTouchX = x; - if (deltaY != 0) mLastDeferTouchY = y; + if (deltaX != 0) mLastDeferTouchX = ted.mViewX; + if (deltaY != 0) mLastDeferTouchY = ted.mViewY; break; } case MotionEvent.ACTION_UP: @@ -6489,8 +6503,8 @@ public class WebView extends AbsoluteLayout break; case WebViewCore.ACTION_DOUBLETAP: // doDoubleTap() needs mLastTouchX/Y as anchor - mLastTouchX = contentToViewX(ted.mX) - mScrollX; - mLastTouchY = contentToViewY(ted.mY) - mScrollY; + mLastTouchX = ted.mViewX; + mLastTouchY = ted.mViewY; doDoubleTap(); mDeferTouchMode = TOUCH_DONE_MODE; break; diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 625e7ba21a368..0175aeda3e65c 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -708,6 +708,8 @@ final class WebViewCore { int mY; int mMetaState; boolean mReprocess; + float mViewX; + float mViewY; } static class GeolocationPermissionsData { From 53d9264de4f99a069dd7306f881d28ddd5956b35 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Tue, 13 Apr 2010 12:49:14 -0700 Subject: [PATCH 4/5] Fix issue #2555171: Switching to app immediately after unmounting... ...SD card causes reboot. Add option to not include temporarily unavailable recent tasks, for the recent tasks UI to not display them. Change-Id: I1495ca217b4292fd56f537459b44c0624262c292 --- core/java/android/app/ActivityManager.java | 7 +++++++ .../server/am/ActivityManagerService.java | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index b3223e5fb6045..c9096cfe6e99c 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -144,6 +144,13 @@ public class ActivityManager { */ public static final int RECENT_WITH_EXCLUDED = 0x0001; + /** + * @hide + * TODO: Make this public. Provides a list that does not contain any + * recent tasks that currently are not available to the user. + */ + public static final int RECENT_IGNORE_UNAVAILABLE = 0x0002; + /** * Return a list of the tasks that the user has recently launched, with * the most recent being first and older ones after in order. diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index bc26fa0c6ff8b..b6f323dd0a6b9 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -6867,6 +6867,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen enforceCallingPermission(android.Manifest.permission.GET_TASKS, "getRecentTasks()"); + IPackageManager pm = ActivityThread.getPackageManager(); + final int N = mRecentTasks.size(); ArrayList res = new ArrayList( @@ -6883,6 +6885,25 @@ public final class ActivityManagerService extends ActivityManagerNative implemen rti.baseIntent = new Intent( tr.intent != null ? tr.intent : tr.affinityIntent); rti.origActivity = tr.origActivity; + + if ((flags&ActivityManager.RECENT_IGNORE_UNAVAILABLE) != 0) { + // Check whether this activity is currently available. + try { + if (rti.origActivity != null) { + if (pm.getActivityInfo(rti.origActivity, 0) == null) { + continue; + } + } else if (rti.baseIntent != null) { + if (pm.queryIntentActivities(rti.baseIntent, + null, 0) == null) { + continue; + } + } + } catch (RemoteException e) { + // Will never happen. + } + } + res.add(rti); maxNum--; } From ce73c1e5bfd36154d21ee7b332cfdc6cea48812e Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 12 Apr 2010 23:11:38 -0700 Subject: [PATCH 5/5] Framework change for #2583442: Navigation dies when night mode changes The window manager doesn't retain its keep screen on lock while in the process of destroying and creating new activity windows during a config change. Now it does. Unfortunately, this doesn't help maps, since it doesn't use our lovely KEEP_SCREEN_ON flag. :p Change-Id: Ida4bc0fcfe132cdff2bd4eeb7ba0ce9731504d14 --- .../android/server/WindowManagerService.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 0fa62e8ebd541..657b6af0b4380 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -148,6 +148,7 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean DEBUG_STARTING_WINDOW = false; static final boolean DEBUG_REORDER = false; static final boolean DEBUG_WALLPAPER = false; + static final boolean DEBUG_FREEZE = false; static final boolean SHOW_TRANSACTIONS = false; static final boolean HIDE_STACK_CRAWLS = true; static final boolean MEASURE_LATENCY = false; @@ -10695,23 +10696,28 @@ public class WindowManagerService extends IWindowManager.Stub } else if (animating) { requestAnimationLocked(currentTime+(1000/60)-SystemClock.uptimeMillis()); } - mQueue.setHoldScreenLocked(holdScreen != null); - if (screenBrightness < 0 || screenBrightness > 1.0f) { - mPowerManager.setScreenBrightnessOverride(-1); - } else { - mPowerManager.setScreenBrightnessOverride((int) - (screenBrightness * Power.BRIGHTNESS_ON)); - } - if (buttonBrightness < 0 || buttonBrightness > 1.0f) { - mPowerManager.setButtonBrightnessOverride(-1); - } else { - mPowerManager.setButtonBrightnessOverride((int) - (buttonBrightness * Power.BRIGHTNESS_ON)); - } - if (holdScreen != mHoldingScreenOn) { - mHoldingScreenOn = holdScreen; - Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen); - mH.sendMessage(m); + + if (DEBUG_FREEZE) Slog.v(TAG, "Layout: mDisplayFrozen=" + mDisplayFrozen + + " holdScreen=" + holdScreen); + if (!mDisplayFrozen) { + mQueue.setHoldScreenLocked(holdScreen != null); + if (screenBrightness < 0 || screenBrightness > 1.0f) { + mPowerManager.setScreenBrightnessOverride(-1); + } else { + mPowerManager.setScreenBrightnessOverride((int) + (screenBrightness * Power.BRIGHTNESS_ON)); + } + if (buttonBrightness < 0 || buttonBrightness > 1.0f) { + mPowerManager.setButtonBrightnessOverride(-1); + } else { + mPowerManager.setButtonBrightnessOverride((int) + (buttonBrightness * Power.BRIGHTNESS_ON)); + } + if (holdScreen != mHoldingScreenOn) { + mHoldingScreenOn = holdScreen; + Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen); + mH.sendMessage(m); + } } if (mTurnOnScreen) { @@ -10988,6 +10994,8 @@ public class WindowManagerService extends IWindowManager.Stub mFreezeGcPending = now; } + if (DEBUG_FREEZE) Slog.v(TAG, "*** FREEZING DISPLAY", new RuntimeException()); + mDisplayFrozen = true; if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { mNextAppTransition = WindowManagerPolicy.TRANSIT_UNSET; @@ -11011,6 +11019,8 @@ public class WindowManagerService extends IWindowManager.Stub return; } + if (DEBUG_FREEZE) Slog.v(TAG, "*** UNFREEZING DISPLAY", new RuntimeException()); + mDisplayFrozen = false; mH.removeMessages(H.APP_FREEZE_TIMEOUT); if (PROFILE_ORIENTATION) {