Merge "Fix monkey bug 2512055"
diff --git a/api/current.xml b/api/current.xml
index 701586e..e6f3788 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -87668,6 +87668,17 @@
  visibility="public"
 >
 </field>
+<field name="TYPE_WIMAX"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="6"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 </class>
 <class name="Credentials"
  extends="java.lang.Object"
@@ -143010,6 +143021,17 @@
  visibility="public"
 >
 </field>
+<field name="NETWORK_TYPE_IDEN"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="11"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="NETWORK_TYPE_UMTS"
  type="int"
  transient="false"
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index a6668e7..280ded6 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -184,9 +184,15 @@
      * will route over this interface if a default route exists.
      */
     public static final int TYPE_MOBILE_HIPRI = 5;
-    /** {@hide} */
+    /**
+     * The Default WiMAX data connection.  When active, all data traffic
+     * will use this connection by default.  Should not coexist with other
+     * default connections.
+     */
+    public static final int TYPE_WIMAX       = 6;
+    /** {@hide} TODO: Need to adjust this for WiMAX. */
     public static final int MAX_RADIO_TYPE   = TYPE_WIFI;
-    /** {@hide} */
+    /** {@hide} TODO: Need to adjust this for WiMAX. */
     public static final int MAX_NETWORK_TYPE = TYPE_MOBILE_HIPRI;
 
     public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;
diff --git a/core/java/android/pim/vcard/VCardEntryCommitter.java b/core/java/android/pim/vcard/VCardEntryCommitter.java
index 2f99e4a..59a2baf 100644
--- a/core/java/android/pim/vcard/VCardEntryCommitter.java
+++ b/core/java/android/pim/vcard/VCardEntryCommitter.java
@@ -58,12 +58,6 @@
         mTimeToCommit += System.currentTimeMillis() - start;
     }
 
-    // TODO: Compatibility function to not break the build. Will be removed shortly
-    @Deprecated
-    public Uri getLastCreatedUri() {
-        return mCreatedUris.size() == 0 ? null : mCreatedUris.get(mCreatedUris.size() - 1);
-    }
-
     /**
      * Returns the list of created Uris. This list should not be modified by the caller as it is
      * not a clone.
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index a07397f..ec7424ba 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1988,7 +1988,6 @@
                 }
             }
         }
-        mLastTouchMode = isInTouchMode ? TOUCH_MODE_ON : TOUCH_MODE_OFF;
     }
 
     @Override
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 65f7cdb..1156e15 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -17,11 +17,9 @@
 package android.widget;
 
 import android.content.Context;
-import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable.Orientation;
 import android.text.Editable;
 import android.text.Selection;
 import android.text.TextUtils;
@@ -611,8 +609,7 @@
                 && !mDropDownAlwaysVisible) {
             // special case for the back key, we do not even try to send it
             // to the drop down list but instead, consume it immediately
-            if (event.getAction() == KeyEvent.ACTION_DOWN
-                    && event.getRepeatCount() == 0) {
+            if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {
                 getKeyDispatcherState().startTracking(event, this);
                 return true;
             } else if (event.getAction() == KeyEvent.ACTION_UP) {
@@ -660,10 +657,19 @@
                                     && keyCode != KeyEvent.KEYCODE_DPAD_CENTER))) {
                 int curIndex = mDropDownList.getSelectedItemPosition();
                 boolean consumed;
+
                 final boolean below = !mPopup.isAboveAnchor();
-                if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= 0) ||
-                        (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >=
-                        mDropDownList.getAdapter().getCount() - 1)) {
+
+                final ListAdapter adapter = mDropDownList.getAdapter();
+                final boolean allEnabled = adapter.areAllItemsEnabled();
+
+                final int firstItem = allEnabled ? 0 :
+                        mDropDownList.lookForSelectablePosition(0, true);
+                final int lastItem = allEnabled ? adapter.getCount() - 1 :
+                        mDropDownList.lookForSelectablePosition(adapter.getCount() - 1, false);
+
+                if ((below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex <= firstItem) ||
+                        (!below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN && curIndex >= lastItem)) {
                     // When the selection is at the top, we block the key
                     // event to prevent focus from moving.
                     clearListSelection();
@@ -703,11 +709,11 @@
                     if (below && keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                         // when the selection is at the bottom, we block the
                         // event to avoid going to the next focusable widget
-                        Adapter adapter = mDropDownList.getAdapter();
-                        if (adapter != null && curIndex == adapter.getCount() - 1) {
+                        if (curIndex == lastItem) {
                             return true;
                         }
-                    } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP && curIndex == 0) {
+                    } else if (!below && keyCode == KeyEvent.KEYCODE_DPAD_UP &&
+                            curIndex == firstItem) {
                         return true;
                     }
                 }
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index c81a907..c77416b 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -769,8 +769,8 @@
             } else if (ScaleType.CENTER == mScaleType) {
                 // Center bitmap in view, no scaling.
                 mDrawMatrix = mMatrix;
-                mDrawMatrix.setTranslate((vwidth - dwidth) * 0.5f,
-                                         (vheight - dheight) * 0.5f);
+                mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f),
+                                         (int) ((vheight - dheight) * 0.5f + 0.5f));
             } else if (ScaleType.CENTER_CROP == mScaleType) {
                 mDrawMatrix = mMatrix;
 
@@ -786,7 +786,7 @@
                 }
 
                 mDrawMatrix.setScale(scale, scale);
-                mDrawMatrix.postTranslate(dx, dy);
+                mDrawMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
             } else if (ScaleType.CENTER_INSIDE == mScaleType) {
                 mDrawMatrix = mMatrix;
                 float scale;
@@ -800,8 +800,8 @@
                             (float) vheight / (float) dheight);
                 }
                 
-                dx = (vwidth - dwidth * scale) * 0.5f;
-                dy = (vheight - dheight * scale) * 0.5f;
+                dx = (int) ((vwidth - dwidth * scale) * 0.5f + 0.5f);
+                dy = (int) ((vheight - dheight * scale) * 0.5f + 0.5f);
 
                 mDrawMatrix.setScale(scale, scale);
                 mDrawMatrix.postTranslate(dx, dy);
diff --git a/core/java/com/android/internal/content/SelectionBuilder.java b/core/java/com/android/internal/content/SelectionBuilder.java
index 0e29411..b194756 100644
--- a/core/java/com/android/internal/content/SelectionBuilder.java
+++ b/core/java/com/android/internal/content/SelectionBuilder.java
@@ -47,7 +47,7 @@
      * Append the given selection clause to the internal state. Each clause is
      * surrounded with parenthesis and combined using {@code AND}.
      */
-    public SelectionBuilder append(String selection, String... selectionArgs) {
+    public SelectionBuilder append(String selection, Object... selectionArgs) {
         if (TextUtils.isEmpty(selection)) {
             if (selectionArgs != null && selectionArgs.length > 0) {
                 throw new IllegalArgumentException(
@@ -63,8 +63,12 @@
         }
 
         mSelection.append("(").append(selection).append(")");
-        for (String arg : selectionArgs) {
-            mSelectionArgs.add(arg);
+        if (selectionArgs != null) {
+            for (Object arg : selectionArgs) {
+                // TODO: switch to storing direct Object instances once
+                // http://b/2464440 is fixed
+                mSelectionArgs.add(String.valueOf(arg));
+            }
         }
 
         return this;
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index efd025a..9b7f487 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -47,6 +47,7 @@
 public class LockPatternUtils {
 
     private static final String TAG = "LockPatternUtils";
+    private static final boolean LDEBUG = false;
 
     private static final String LOCK_PATTERN_FILE = "/system/gesture.key";
     private static final String LOCK_PASSWORD_FILE = "/system/password.key";
@@ -126,7 +127,6 @@
     public LockPatternUtils(Context context) {
         mContext = context;
         mContentResolver = context.getContentResolver();
-        mDevicePolicyManager = getDevicePolicyManager();
         // Initialize the location of gesture lock file
         if (sLockPatternFilename == null) {
             sLockPatternFilename = android.os.Environment.getDataDirectory()
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_active.png b/core/res/res/drawable-hdpi/stat_sys_tether_active.png
deleted file mode 100755
index 4c14c07..0000000
--- a/core/res/res/drawable-hdpi/stat_sys_tether_active.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_general.png b/core/res/res/drawable-hdpi/stat_sys_tether_general.png
index e43fbae..c42b00c 100644
--- a/core/res/res/drawable-hdpi/stat_sys_tether_general.png
+++ b/core/res/res/drawable-hdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_active.png b/core/res/res/drawable-mdpi/stat_sys_tether_active.png
deleted file mode 100644
index 2d0da4c..0000000
--- a/core/res/res/drawable-mdpi/stat_sys_tether_active.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_general.png b/core/res/res/drawable-mdpi/stat_sys_tether_general.png
index efb64ad..3688803 100644
--- a/core/res/res/drawable-mdpi/stat_sys_tether_general.png
+++ b/core/res/res/drawable-mdpi/stat_sys_tether_general.png
Binary files differ
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 882cbc5..3f029a6 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -977,15 +977,22 @@
          * @return false if the context has been lost.
          */
         public boolean swap() {
-            mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
+            if (! mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
 
-            /*
-             * Always check for EGL_CONTEXT_LOST, which means the context
-             * and all associated data were lost (For instance because
-             * the device went to sleep). We need to sleep until we
-             * get a new surface.
-             */
-            return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
+                /*
+                 * Check for EGL_CONTEXT_LOST, which means the context
+                 * and all associated data were lost (For instance because
+                 * the device went to sleep). We need to sleep until we
+                 * get a new surface.
+                 */
+                int error = mEgl.eglGetError();
+                if (error == EGL11.EGL_CONTEXT_LOST) {
+                    return false;
+                } else {
+                    throwEglException("eglSwapBuffers", error);
+                }
+            }
+            return true;
         }
 
         public void destroySurface() {
@@ -1010,7 +1017,11 @@
         }
 
         private void throwEglException(String function) {
-            throw new RuntimeException(function + " failed: " + mEgl.eglGetError());
+            throwEglException(function, mEgl.eglGetError());
+        }
+
+        private void throwEglException(String function, int error) {
+            throw new RuntimeException(function + " failed: " + error);
         }
 
         EGL10 mEgl;
diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java
index cd46c05..cece94e 100755
--- a/packages/TtsService/src/android/tts/SynthProxy.java
+++ b/packages/TtsService/src/android/tts/SynthProxy.java
@@ -36,9 +36,9 @@
     // Such a huge filter gain is justified by how much energy in the low frequencies is "wasted" at
     // the output of the synthesis. The low shelving filter removes it, leaving room for
     // amplification.
-    private final static float PICO_FILTER_GAIN = 4.0f; // linear gain
-    private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -16.0f; // in dB
-    private final static float PICO_FILTER_TRANSITION_FREQ = 1000.0f;     // in Hz
+    private final static float PICO_FILTER_GAIN = 5.0f; // linear gain
+    private final static float PICO_FILTER_LOWSHELF_ATTENUATION = -18.0f; // in dB
+    private final static float PICO_FILTER_TRANSITION_FREQ = 1100.0f;     // in Hz
     private final static float PICO_FILTER_SHELF_SLOPE = 1.0f;            // Q
 
     //
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a6b1d93..ae5b1de 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -389,6 +389,8 @@
     public static final int NETWORK_TYPE_HSUPA = 9;
     /** Current network is HSPA */
     public static final int NETWORK_TYPE_HSPA = 10;
+    /** Current network is iDen */
+    public static final int NETWORK_TYPE_IDEN = 11;
 
     /**
      * Returns a constant indicating the radio technology (network type)
diff --git a/tests/BrowserTestPlugin/jni/main.cpp b/tests/BrowserTestPlugin/jni/main.cpp
index 87ddbc4..402a7e2 100644
--- a/tests/BrowserTestPlugin/jni/main.cpp
+++ b/tests/BrowserTestPlugin/jni/main.cpp
@@ -142,7 +142,7 @@
     if (browser->version >= 14) {
     instance->pdata = browser->createobject (instance, getPluginClass());
     obj = static_cast<PluginObject*>(instance->pdata);
-    bzero(obj, sizeof(*obj));
+    memset(obj, 0, sizeof(*obj));
     } else {
         return NPERR_GENERIC_ERROR;
     }
diff --git a/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java b/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
index fd05fed..1e57bd2 100644
--- a/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
+++ b/tests/framework-tests/src/com/android/internal/policy/impl/LockPatternKeyguardViewTest.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import com.android.internal.telephony.IccCard;
+import android.content.res.Configuration;
 import android.test.AndroidTestCase;
 import android.view.View;
 import android.view.KeyEvent;
@@ -39,8 +40,6 @@
     private static class MockUpdateMonitor extends KeyguardUpdateMonitor {
 
         public IccCard.State simState = IccCard.State.READY;
-        public boolean inPortrait = false;
-        public boolean keyboardOpen = false;
 
         private MockUpdateMonitor(Context context) {
             super(context);
@@ -50,26 +49,6 @@
         public IccCard.State getSimState() {
             return simState;
         }
-
-        @Override
-        public boolean isInPortrait() {
-            return inPortrait;
-        }
-
-        @Override
-        public boolean isKeyboardOpen() {
-            return keyboardOpen;
-        }
-
-        @Override
-        boolean queryInPortrait() {
-            return inPortrait;
-        }
-
-        @Override
-        boolean queryKeyboardOpen() {
-            return keyboardOpen;
-        }
     }
 
     private static class MockLockPatternUtils extends LockPatternUtils {
@@ -115,7 +94,7 @@
         public boolean needsInput() {
             return false;
         }
-        
+
         /** {@inheritDoc} */
         public void onPause() {
             mOnPauseCount++;
@@ -202,7 +181,7 @@
         }
 
         public void keyguardDoneDrawing() {
-            
+
         }
 
         public int getPokeWakelockCount() {
@@ -293,7 +272,7 @@
 
         // should have poked the wakelock to turn on the screen
         assertEquals(1, mKeyguardViewCallback.getPokeWakelockCount());
-        
+
         // shouldn't be any additional views created
         assertEquals(1, mLPKV.getInjectedLockScreens().size());
         assertEquals(1, mLPKV.getInjectedUnlockScreens().size());
@@ -317,7 +296,7 @@
         assertEquals(1, lockScreen.getOnResumeCount());
 
         // simulate screen asking to be recreated
-        mLPKV.mKeyguardScreenCallback.recreateMe();
+        mLPKV.mKeyguardScreenCallback.recreateMe(new Configuration());
 
         // should have been recreated
         assertEquals(2, mLPKV.getInjectedLockScreens().size());