diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 66 | ||||
| -rw-r--r-- | core/java/android/database/sqlite/SQLiteDatabase.java | 3 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 17 | ||||
| -rw-r--r-- | core/java/android/view/ViewGroup.java | 19 | ||||
| -rw-r--r-- | core/java/android/widget/AbsListView.java | 11 | ||||
| -rw-r--r-- | core/java/android/widget/AdapterViewAnimator.java | 22 | ||||
| -rw-r--r-- | core/java/android/widget/CalendarView.java | 12 | ||||
| -rw-r--r-- | core/java/android/widget/DatePicker.java | 11 | ||||
| -rw-r--r-- | core/java/android/widget/GridView.java | 78 | ||||
| -rw-r--r-- | core/java/android/widget/ListPopupWindow.java | 2 | ||||
| -rw-r--r-- | core/java/android/widget/ListView.java | 81 | ||||
| -rw-r--r-- | core/java/android/widget/NumberPicker.java | 14 | ||||
| -rw-r--r-- | core/java/android/widget/StackView.java | 15 |
13 files changed, 221 insertions, 130 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 133a7d0..d76b67d 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -22,6 +22,8 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageDataObserver; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.os.Debug; import android.os.RemoteException; @@ -30,6 +32,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.SystemProperties; import android.text.TextUtils; +import android.util.DisplayMetrics; + import java.util.List; /** @@ -1145,7 +1149,67 @@ public class ActivityManager { } return null; } - + + /** + * Get the preferred density of icons for the launcher. This is used when + * custom drawables are created (e.g., for shortcuts). + * + * @return density in terms of DPI + */ + public int getLauncherLargeIconDensity() { + final Resources res = mContext.getResources(); + final int density = res.getDisplayMetrics().densityDpi; + + if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) + != Configuration.SCREENLAYOUT_SIZE_XLARGE) { + return density; + } + + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_MEDIUM: + return DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_HIGH: + return DisplayMetrics.DENSITY_XHIGH; + case DisplayMetrics.DENSITY_XHIGH: + return DisplayMetrics.DENSITY_MEDIUM * 2; + default: + return density; + } + } + + /** + * Get the preferred launcher icon size. This is used when custom drawables + * are created (e.g., for shortcuts). + * + * @return dimensions of square icons in terms of pixels + */ + public int getLauncherLargeIconSize() { + final Resources res = mContext.getResources(); + final int size = res.getDimensionPixelSize(android.R.dimen.app_icon_size); + + if ((res.getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) + != Configuration.SCREENLAYOUT_SIZE_XLARGE) { + return size; + } + + final int density = res.getDisplayMetrics().densityDpi; + + switch (density) { + case DisplayMetrics.DENSITY_LOW: + return (size * DisplayMetrics.DENSITY_MEDIUM) / DisplayMetrics.DENSITY_LOW; + case DisplayMetrics.DENSITY_MEDIUM: + return (size * DisplayMetrics.DENSITY_HIGH) / DisplayMetrics.DENSITY_MEDIUM; + case DisplayMetrics.DENSITY_HIGH: + return (size * DisplayMetrics.DENSITY_XHIGH) / DisplayMetrics.DENSITY_HIGH; + case DisplayMetrics.DENSITY_XHIGH: + return (size * DisplayMetrics.DENSITY_MEDIUM * 2) / DisplayMetrics.DENSITY_XHIGH; + default: + return size; + } + } + /** * Returns "true" if the user interface is currently being messed with * by a monkey. diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index b1c84a1..1a43b30 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -416,8 +416,7 @@ public class SQLiteDatabase extends SQLiteClosable { private void lock(boolean forced) { // make sure this method is NOT being called from a 'synchronized' method if (Thread.holdsLock(this)) { - // STOPSHIP change the following line to Log.w() - throw new IllegalStateException("don't lock() while in a synchronized method"); + Log.w(TAG, "don't lock() while in a synchronized method"); } verifyDbIsOpen(); if (!forced && !mLockingEnabled) return; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2e6664b..c64f564 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2937,13 +2937,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } /** - * Gets the current list of listeners for layout changes. - */ - public List<OnLayoutChangeListener> getOnLayoutChangeListeners() { - return mOnLayoutChangeListeners; - } - - /** * Returns the focus-change callback registered for this view. * * @return The callback, or null if one is not registered. @@ -6011,6 +6004,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6077,6 +6071,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6137,6 +6132,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6194,6 +6190,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility invalidate(true); } mBackgroundSizeChanged = true; + invalidateParentIfNeeded(); } } @@ -6438,6 +6435,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); } + invalidateParentIfNeeded(); } } @@ -6476,6 +6474,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mPrivateFlags |= DRAWN; // force another invalidation with the new orientation invalidate(false); } + invalidateParentIfNeeded(); } } @@ -8125,11 +8124,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // TODO: We should pass the dirty rect canvas.onPreDraw(null); + final int restoreCount = canvas.save(); + computeScroll(); canvas.translate(-mScrollX, -mScrollY); - final int restoreCount = canvas.save(); - mPrivateFlags |= DRAWN | DRAWING_CACHE_VALID; // Fast path for layouts with no backgrounds diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 9e5b23c..d4efdb6 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -17,6 +17,7 @@ package android.view; import android.animation.LayoutTransition; +import android.view.animation.AlphaAnimation; import com.android.internal.R; import com.android.internal.util.Predicate; @@ -2364,6 +2365,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager DisplayList displayList = null; Bitmap cache = null; + boolean hasDisplayList = false; if (caching) { if (!canvas.isHardwareAccelerated()) { if (layerType != LAYER_TYPE_NONE) { @@ -2376,12 +2378,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager child.buildDrawingCache(true); cache = child.getDrawingCache(true); } else if (layerType == LAYER_TYPE_NONE) { - displayList = child.getDisplayList(); + // Delay getting the display list until animation-driven alpha values are + // set up and possibly passed on to the view + hasDisplayList = true; } } } - final boolean hasDisplayList = displayList != null && displayList.isReady(); final boolean hasNoCache = cache == null || hasDisplayList; final int restoreTo = canvas.save(); @@ -2472,6 +2475,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + if (hasDisplayList) { + displayList = child.getDisplayList(); + } + if (hasNoCache) { boolean layerRendered = false; if (layerType == LAYER_TYPE_HARDWARE) { @@ -2529,7 +2536,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager canvas.restoreToCount(restoreTo); if (a != null && !more) { - child.onSetAlpha(255); + if (!canvas.isHardwareAccelerated() && !a.getFillAfter()) { + child.onSetAlpha(255); + } finishAnimatingView(child, a); } @@ -2538,6 +2547,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // display lists to render, force an invalidate to allow the animation to // continue drawing another frame invalidate(); + if (a instanceof AlphaAnimation) { + // alpha animations should cause the child to recreate its display list + child.invalidate(); + } } child.mRecreateDisplayList = false; diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 48e91ad..3f38f2e 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -4467,15 +4467,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } /** - * If there is a selection returns true. - * Otherwise resurrects the selection and returns false. + * If there is a selection returns false. + * Otherwise resurrects the selection and returns true if resurrected. */ - boolean ensureSelectionOnMovementKey() { + boolean resurrectSelectionIfNeeded() { if (mSelectedPosition < 0) { - resurrectSelection(); - return false; + return resurrectSelection(); } - return true; + return false; } /** diff --git a/core/java/android/widget/AdapterViewAnimator.java b/core/java/android/widget/AdapterViewAnimator.java index e3a62db..190c0fc 100644 --- a/core/java/android/widget/AdapterViewAnimator.java +++ b/core/java/android/widget/AdapterViewAnimator.java @@ -280,6 +280,10 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> * @param whichChild the index of the child view to display */ public void setDisplayedChild(int whichChild) { + setDisplayedChild(whichChild, true); + } + + private void setDisplayedChild(int whichChild, boolean animate) { if (mAdapter != null) { mWhichChild = whichChild; if (whichChild >= getWindowSize()) { @@ -290,7 +294,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> boolean hasFocus = getFocusedChild() != null; // This will clear old focus if we had it - showOnly(mWhichChild); + showOnly(mWhichChild, animate); if (hasFocus) { // Try to retake focus if we had it requestFocus(FOCUS_FORWARD); @@ -793,23 +797,11 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> if (mRemoteViewsAdapter != null && mAdapter == null) { mRestoreWhichChild = mWhichChild; } else { - setDisplayedChild(mWhichChild); + setDisplayedChild(mWhichChild, false); } } /** - * Shows only the specified child. The other displays Views exit the screen - * with the {@link #getOutAnimation() out animation} and the specified child - * enters the screen with the {@link #getInAnimation() in animation}. - * - * @param childIndex The index of the child to be shown. - */ - void showOnly(int childIndex) { - final boolean animate = (!mFirstTime || mAnimateFirstTime); - showOnly(childIndex, animate); - } - - /** * Returns the View corresponding to the currently displayed child. * * @return The View currently displayed. @@ -977,7 +969,7 @@ public abstract class AdapterViewAnimator extends AdapterView<Adapter> // Restore the previous position (see onRestoreInstanceState) if (mRestoreWhichChild > -1) { - setDisplayedChild(mRestoreWhichChild); + setDisplayedChild(mRestoreWhichChild, false); mRestoreWhichChild = -1; } return false; diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 899e872..13a407f 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -897,10 +897,13 @@ public class CalendarView extends FrameLayout { throw new IllegalArgumentException("fromDate: " + mMinDate.getTime() + " does not precede toDate: " + date.getTime()); } - int fromDateDayOfWeek = mMinDate.get(Calendar.DAY_OF_WEEK); - long diff = (fromDateDayOfWeek - mFirstDayOfWeek) * MILLIS_IN_DAY; - long refDay = mMinDate.getTimeInMillis() - diff; - return (int) ((date.getTimeInMillis() - refDay) / MILLIS_IN_WEEK); + long endTimeMillis = date.getTimeInMillis() + + date.getTimeZone().getOffset(date.getTimeInMillis()); + long startTimeMillis = mMinDate.getTimeInMillis() + + mMinDate.getTimeZone().getOffset(mMinDate.getTimeInMillis()); + long dayOffsetMillis = (mMinDate.get(Calendar.DAY_OF_WEEK) - mFirstDayOfWeek) + * MILLIS_IN_DAY; + return (int) ((endTimeMillis - startTimeMillis + dayOffsetMillis) / MILLIS_IN_WEEK); } /** @@ -1180,6 +1183,7 @@ public class CalendarView extends FrameLayout { mNumCells = mShowWeekNumber ? mDaysPerWeek + 1 : mDaysPerWeek; mWeek = weekNumber; mTempDate.setTimeInMillis(mMinDate.getTimeInMillis()); + mTempDate.add(Calendar.WEEK_OF_YEAR, mWeek); mTempDate.setFirstDayOfWeek(mFirstDayOfWeek); diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index ea868a6..7293572 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -184,6 +184,8 @@ public class DatePicker extends FrameLayout { // now set the date to the adjusted one setDate(mTempDate.get(Calendar.YEAR), mTempDate.get(Calendar.MONTH), mTempDate.get(Calendar.DAY_OF_MONTH)); + updateSpinners(); + updateCalendarView(); notifyDateChanged(); } }; @@ -195,6 +197,7 @@ public class DatePicker extends FrameLayout { mCalendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { public void onSelectedDayChange(CalendarView view, int year, int month, int monthDay) { setDate(year, month, monthDay); + updateSpinners(); notifyDateChanged(); } }); @@ -469,6 +472,8 @@ public class DatePicker extends FrameLayout { return; } setDate(year, month, dayOfMonth); + updateSpinners(); + updateCalendarView(); notifyDateChanged(); } @@ -489,6 +494,8 @@ public class DatePicker extends FrameLayout { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setDate(ss.mYear, ss.mMonth, ss.mDay); + updateSpinners(); + updateCalendarView(); } /** @@ -504,6 +511,8 @@ public class DatePicker extends FrameLayout { public void init(int year, int monthOfYear, int dayOfMonth, OnDateChangedListener onDateChangedListener) { setDate(year, monthOfYear, dayOfMonth); + updateSpinners(); + updateCalendarView(); mOnDateChangedListener = onDateChangedListener; } @@ -553,8 +562,6 @@ public class DatePicker extends FrameLayout { } else if (mCurrentDate.after(mMaxDate)) { mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); } - updateSpinners(); - updateCalendarView(); } private void updateSpinners() { diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index c7addcc..a84df16 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1486,77 +1486,79 @@ public class GridView extends AbsListView { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_LEFT); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_LEFT); } break; case KeyEvent.KEYCODE_DPAD_RIGHT: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_RIGHT); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_RIGHT); } break; case KeyEvent.KEYCODE_DPAD_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_DPAD_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_ENTER: { - if (event.hasNoModifiers() - && event.getRepeatCount() == 0 && getChildCount() > 0) { - ensureSelectionOnMovementKey(); - keyPressed(); + case KeyEvent.KEYCODE_ENTER: + if (event.hasNoModifiers()) { + handled = resurrectSelectionIfNeeded(); + if (!handled + && event.getRepeatCount() == 0 && getChildCount() > 0) { + keyPressed(); + handled = true; + } } - return true; - } + break; case KeyEvent.KEYCODE_SPACE: if (mPopup == null || !mPopup.isShowing()) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } } break; case KeyEvent.KEYCODE_PAGE_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_PAGE_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_MOVE_HOME: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_MOVE_END: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -1569,32 +1571,34 @@ public class GridView extends AbsListView { // perhaps it should be configurable (and more comprehensive). if (false) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_FORWARD); + handled = resurrectSelectionIfNeeded() + || sequenceScroll(FOCUS_FORWARD); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && sequenceScroll(FOCUS_BACKWARD); + handled = resurrectSelectionIfNeeded() + || sequenceScroll(FOCUS_BACKWARD); } } break; } } - if (!handled) { - handled = sendToTextFilter(keyCode, count, event); + if (handled) { + return true; } - if (handled) { + if (sendToTextFilter(keyCode, count, event)) { return true; - } else { - switch (action) { - case KeyEvent.ACTION_DOWN: - return super.onKeyDown(keyCode, event); - case KeyEvent.ACTION_UP: - return super.onKeyUp(keyCode, event); - case KeyEvent.ACTION_MULTIPLE: - return super.onKeyMultiple(keyCode, count, event); - default: - return false; - } + } + + switch (action) { + case KeyEvent.ACTION_DOWN: + return super.onKeyDown(keyCode, event); + case KeyEvent.ACTION_UP: + return super.onKeyUp(keyCode, event); + case KeyEvent.ACTION_MULTIPLE: + return super.onKeyMultiple(keyCode, count, event); + default: + return false; } } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 444a163d..5dc42e4 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -774,7 +774,7 @@ public class ListPopupWindow { } /** - * Filter key down events. By forwarding key up events to this function, + * Filter key down events. By forwarding key down events to this function, * views using non-modal ListPopupWindow can have it handle key selection of items. * * @param keyCode keyCode param passed to the host view's onKeyDown diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index a107c60..12a0ebf 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -2081,25 +2081,35 @@ public class ListView extends AbsListView { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: if (event.hasNoModifiers()) { - if (ensureSelectionOnMovementKey()) { + handled = resurrectSelectionIfNeeded(); + if (!handled) { while (count-- > 0) { - handled |= arrowScroll(FOCUS_UP); + if (arrowScroll(FOCUS_UP)) { + handled = true; + } else { + break; + } } } } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_DPAD_DOWN: if (event.hasNoModifiers()) { - if (ensureSelectionOnMovementKey()) { + handled = resurrectSelectionIfNeeded(); + if (!handled) { while (count-- > 0) { - handled |= arrowScroll(FOCUS_DOWN); + if (arrowScroll(FOCUS_DOWN)) { + handled = true; + } else { + break; + } } } } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -2117,19 +2127,22 @@ public class ListView extends AbsListView { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_ENTER: - if (mItemCount > 0 && event.getRepeatCount() == 0) { - ensureSelectionOnMovementKey(); - keyPressed(); + if (event.hasNoModifiers()) { + handled = resurrectSelectionIfNeeded(); + if (!handled + && event.getRepeatCount() == 0 && getChildCount() > 0) { + keyPressed(); + handled = true; + } } - handled = true; break; case KeyEvent.KEYCODE_SPACE: if (mPopup == null || !mPopup.isShowing()) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } handled = true; } @@ -2137,29 +2150,29 @@ public class ListView extends AbsListView { case KeyEvent.KEYCODE_PAGE_UP: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_UP); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_PAGE_DOWN: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && pageScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || pageScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_ALT_ON)) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; case KeyEvent.KEYCODE_MOVE_HOME: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_UP); } break; case KeyEvent.KEYCODE_MOVE_END: if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && fullScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || fullScroll(FOCUS_DOWN); } break; @@ -2172,35 +2185,35 @@ public class ListView extends AbsListView { // perhaps it should be configurable (and more comprehensive). if (false) { if (event.hasNoModifiers()) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_DOWN); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_DOWN); } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { - handled = ensureSelectionOnMovementKey() && arrowScroll(FOCUS_UP); + handled = resurrectSelectionIfNeeded() || arrowScroll(FOCUS_UP); } } break; } } - if (!handled) { - handled = sendToTextFilter(keyCode, count, event); + if (handled) { + return true; } - if (handled) { + if (sendToTextFilter(keyCode, count, event)) { return true; - } else { - switch (action) { - case KeyEvent.ACTION_DOWN: - return super.onKeyDown(keyCode, event); + } - case KeyEvent.ACTION_UP: - return super.onKeyUp(keyCode, event); + switch (action) { + case KeyEvent.ACTION_DOWN: + return super.onKeyDown(keyCode, event); - case KeyEvent.ACTION_MULTIPLE: - return super.onKeyMultiple(keyCode, count, event); + case KeyEvent.ACTION_UP: + return super.onKeyUp(keyCode, event); - default: // shouldn't happen - return false; - } + case KeyEvent.ACTION_MULTIPLE: + return super.onKeyMultiple(keyCode, count, event); + + default: // shouldn't happen + return false; } } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index c5161bc..c5b1caa 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -623,7 +623,11 @@ public class NumberPicker extends LinearLayout { hideInputControls(); return true; } - if (isEventInInputText(event)) { + if (isEventInViewHitRect(event, mInputText) + || (!mIncrementButton.isShown() + && isEventInViewHitRect(event, mIncrementButton)) + || (!mDecrementButton.isShown() + && isEventInViewHitRect(event, mDecrementButton))) { mAdjustScrollerOnUpEvent = false; setDrawSelectorWheel(true); hideInputControls(); @@ -708,7 +712,7 @@ public class NumberPicker extends LinearLayout { public boolean dispatchTouchEvent(MotionEvent event) { int action = event.getActionMasked(); if ((action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) - && !isEventInInputText(event)) { + && !isEventInViewHitRect(event, mInputText)) { removeAllCallbacks(); } return super.dispatchTouchEvent(event); @@ -1177,10 +1181,10 @@ public class NumberPicker extends LinearLayout { } /** - * @return If the <code>event</code> is in the input text. + * @return If the <code>event</code> is in the <code>view</code>. */ - private boolean isEventInInputText(MotionEvent event) { - mInputText.getHitRect(mTempRect); + private boolean isEventInViewHitRect(MotionEvent event, View view) { + view.getHitRect(mTempRect); return mTempRect.contains((int) event.getX(), (int) event.getY()); } diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java index d57d5c6..7a74241 100644 --- a/core/java/android/widget/StackView.java +++ b/core/java/android/widget/StackView.java @@ -549,11 +549,7 @@ public class StackView extends AdapterViewAnimator { mSlideAmount = Math.round(SLIDE_UP_RATIO * getMeasuredHeight()); mSwipeThreshold = Math.round(SWIPE_THRESHOLD_RATIO * mSlideAmount); mFirstLayoutHappened = true; - post(new Runnable() { - public void run() { - updateChildTransforms(); - } - }); + updateChildTransforms(); } if (Float.compare(mPerspectiveShiftY, mNewPerspectiveShiftY) != 0 || @@ -561,12 +557,7 @@ public class StackView extends AdapterViewAnimator { mPerspectiveShiftY = mNewPerspectiveShiftY; mPerspectiveShiftX = mNewPerspectiveShiftX; - - post(new Runnable() { - public void run() { - updateChildTransforms(); - } - }); + updateChildTransforms(); } } @@ -1120,6 +1111,8 @@ public class StackView extends AdapterViewAnimator { mNewPerspectiveShiftX = PERSPECTIVE_SHIFT_FACTOR_X * measuredWidth; mNewPerspectiveShiftY = PERSPECTIVE_SHIFT_FACTOR_Y * measuredHeight; + + // If we have extra space, we try and spread the items out if (maxWidth > 0 && count > 0 && maxWidth < childWidth) { mNewPerspectiveShiftX = measuredWidth - maxWidth; } |
