summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/ActivityManager.java66
-rw-r--r--core/java/android/database/sqlite/SQLiteDatabase.java3
-rw-r--r--core/java/android/view/View.java17
-rw-r--r--core/java/android/view/ViewGroup.java19
-rw-r--r--core/java/android/widget/AbsListView.java11
-rw-r--r--core/java/android/widget/AdapterViewAnimator.java22
-rw-r--r--core/java/android/widget/CalendarView.java12
-rw-r--r--core/java/android/widget/DatePicker.java11
-rw-r--r--core/java/android/widget/GridView.java78
-rw-r--r--core/java/android/widget/ListPopupWindow.java2
-rw-r--r--core/java/android/widget/ListView.java81
-rw-r--r--core/java/android/widget/NumberPicker.java14
-rw-r--r--core/java/android/widget/StackView.java15
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;
}