Merge change 27076 into eclair

* changes:
  Optimize rotary selector widget by using bitmaps instead of drawables.
diff --git a/api/current.xml b/api/current.xml
index d5f3f46..37fb3a8 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -122805,7 +122805,7 @@
  type="android.telephony.NeighboringCellInfo"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 </constructor>
@@ -122813,7 +122813,7 @@
  type="android.telephony.NeighboringCellInfo"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="rssi" type="int">
@@ -122853,6 +122853,39 @@
  visibility="public"
 >
 </method>
+<method name="getLac"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getNetworkType"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getPsc"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getRssi"
  return="int"
  abstract="false"
@@ -122871,7 +122904,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="cid" type="int">
@@ -122884,7 +122917,7 @@
  synchronized="false"
  static="false"
  final="false"
- deprecated="not deprecated"
+ deprecated="deprecated"
  visibility="public"
 >
 <parameter name="rssi" type="int">
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index 7adaf57..b877098 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -34,6 +34,8 @@
 import android.os.ServiceManager;
 
 import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -42,21 +44,21 @@
 
 public final class Pm {
     IPackageManager mPm;
-    
+
     private WeakHashMap<String, Resources> mResourceCache
             = new WeakHashMap<String, Resources>();
-    
+
     private String[] mArgs;
     private int mNextArg;
     private String mCurArgData;
-    
-    private static final String PM_NOT_RUNNING_ERR = 
+
+    private static final String PM_NOT_RUNNING_ERR =
         "Error: Could not access the Package Manager.  Is the system running?";
-    
+
     public static void main(String[] args) {
         new Pm().run(args);
     }
-    
+
     public void run(String[] args) {
         boolean validCommand = false;
         if (args.length < 1) {
@@ -73,37 +75,37 @@
         mArgs = args;
         String op = args[0];
         mNextArg = 1;
-        
+
         if ("list".equals(op)) {
             runList();
             return;
         }
-        
+
         if ("path".equals(op)) {
             runPath();
             return;
         }
-        
+
         if ("install".equals(op)) {
             runInstall();
             return;
         }
-        
+
         if ("uninstall".equals(op)) {
             runUninstall();
             return;
         }
-        
+
         if ("enable".equals(op)) {
             runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
             return;
         }
-        
+
         if ("disable".equals(op)) {
             runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
             return;
         }
-        
+
         try {
             if (args.length == 1) {
                 if (args[0].equalsIgnoreCase("-l")) {
@@ -128,10 +130,10 @@
             }
         }
     }
-    
+
     /**
      * Execute the list sub-command.
-     * 
+     *
      * pm list [package | packages]
      * pm list permission-groups
      * pm list permissions
@@ -157,7 +159,7 @@
             showUsage();
         }
     }
-    
+
     /**
      * Lists all the installed packages.
      */
@@ -182,10 +184,10 @@
             showUsage();
             return;
         }
-        
+
         try {
             List<PackageInfo> packages = mPm.getInstalledPackages(0 /* all */);
-            
+
             int count = packages.size();
             for (int p = 0 ; p < count ; p++) {
                 PackageInfo info = packages.get(p);
@@ -201,10 +203,10 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     /**
      * Lists all of the installed instrumentation, or all for a given package
-     * 
+     *
      * pm list instrumentation [package] [-f]
      */
     private void runListInstrumentation() {
@@ -260,14 +262,14 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     /**
      * Lists all the known permission groups.
      */
     private void runListPermissionGroups() {
         try {
             List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0);
-            
+
             int count = pgs.size();
             for (int p = 0 ; p < count ; p++) {
                 PermissionGroupInfo pgi = pgs.get(p);
@@ -279,7 +281,7 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) {
         if (nonLocalized != null) {
             return nonLocalized.toString();
@@ -290,7 +292,7 @@
         }
         return null;
     }
-    
+
     /**
      * Lists all the permissions in a group.
      */
@@ -321,7 +323,7 @@
                     return;
                 }
             }
-            
+
             String grp = nextOption();
             ArrayList<String> groupList = new ArrayList<String>();
             if (groups) {
@@ -334,7 +336,7 @@
             } else {
                 groupList.add(grp);
             }
-            
+
             if (dangerousOnly) {
                 System.out.println("Dangerous Permissions:");
                 System.out.println("");
@@ -365,7 +367,7 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     private void doListPermissions(ArrayList<String> groupList,
             boolean groups, boolean labels, boolean summary,
             int startProtectionLevel, int endProtectionLevel)
@@ -385,7 +387,7 @@
                                     pgi.nonLocalizedLabel) + ": ");
                         } else {
                             System.out.print(pgi.name + ": ");
-                            
+
                         }
                     } else {
                         System.out.println((labels ? "+ " : "")
@@ -468,13 +470,13 @@
                     }
                 }
             }
-            
+
             if (summary) {
                 System.out.println("");
             }
         }
     }
-    
+
     private void runPath() {
         String pkg = nextArg();
         if (pkg == null) {
@@ -484,7 +486,7 @@
         }
         displayPackageFilePath(pkg);
     }
-    
+
     class PackageInstallObserver extends IPackageInstallObserver.Stub {
         boolean finished;
         int result;
@@ -497,95 +499,40 @@
             }
         }
     }
-    
+
+    /**
+     * Converts a failure code into a string by using reflection to find a matching constant
+     * in PackageManager.
+     */
     private String installFailureToString(int result) {
-        String s;
-        switch (result) {
-        case PackageManager.INSTALL_FAILED_ALREADY_EXISTS:
-            s = "INSTALL_FAILED_ALREADY_EXISTS";
-            break;
-        case PackageManager.INSTALL_FAILED_INVALID_APK:
-            s = "INSTALL_FAILED_INVALID_APK";
-            break;
-        case PackageManager.INSTALL_FAILED_INVALID_URI:
-            s = "INSTALL_FAILED_INVALID_URI";
-            break;
-        case PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE:
-            s = "INSTALL_FAILED_INSUFFICIENT_STORAGE";
-            break;
-        case PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE:
-            s = "INSTALL_FAILED_DUPLICATE_PACKAGE";
-            break;
-        case PackageManager.INSTALL_FAILED_NO_SHARED_USER:
-            s = "INSTALL_FAILED_NO_SHARED_USER";
-            break;
-        case PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE:
-            s = "INSTALL_FAILED_UPDATE_INCOMPATIBLE";
-            break;
-        case PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE:
-            s = "INSTALL_FAILED_SHARED_USER_INCOMPATIBLE";
-            break;
-        case PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY:
-            s = "INSTALL_FAILED_MISSING_SHARED_LIBRARY";
-            break;
-        case PackageManager.INSTALL_FAILED_DEXOPT:
-            s = "INSTALL_FAILED_DEXOPT";
-            break;
-        case PackageManager.INSTALL_FAILED_OLDER_SDK:
-            s = "INSTALL_FAILED_OLDER_SDK";
-            break;
-        case PackageManager.INSTALL_FAILED_CONFLICTING_PROVIDER:
-            s = "INSTALL_FAILED_CONFLICTING_PROVIDER";
-            break;
-        case PackageManager.INSTALL_FAILED_NEWER_SDK:
-            s = "INSTALL_FAILED_NEWER_SDK";
-            break;
-        case PackageManager.INSTALL_FAILED_TEST_ONLY:
-            s = "INSTALL_FAILED_TEST_ONLY";
-            break;
-        case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE:
-            s = "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE";
-            break;
-        case PackageManager.INSTALL_FAILED_MISSING_FEATURE:
-            s = "INSTALL_FAILED_MISSING_FEATURE";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_NOT_APK:
-            s = "INSTALL_PARSE_FAILED_NOT_APK";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST:
-            s = "INSTALL_PARSE_FAILED_BAD_MANIFEST";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION:
-            s = "INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES:
-            s = "INSTALL_PARSE_FAILED_NO_CERTIFICATES";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES:
-            s = "INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING:
-            s = "INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME:
-            s = "INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID:
-            s = "INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:
-            s = "INSTALL_PARSE_FAILED_MANIFEST_MALFORMED";
-            break;
-        case PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY:
-            s = "INSTALL_PARSE_FAILED_MANIFEST_EMPTY";
-            break;
-        default:
-            s = Integer.toString(result);
-        break;
+        Field[] fields = PackageManager.class.getFields();
+        for (Field f: fields) {
+            if (f.getType() == int.class) {
+                int modifiers = f.getModifiers();
+                // only look at public final static fields.
+                if (((modifiers & Modifier.FINAL) != 0) &&
+                        ((modifiers & Modifier.PUBLIC) != 0) &&
+                        ((modifiers & Modifier.STATIC) != 0)) {
+                    String fieldName = f.getName();
+                    if (fieldName.startsWith("INSTALL_FAILED_") ||
+                            fieldName.startsWith("INSTALL_PARSE_FAILED_")) {
+                        // get the int value and compare it to result.
+                        try {
+                            if (result == f.getInt(null)) {
+                                return fieldName;
+                            }
+                        } catch (IllegalAccessException e) {
+                            // this shouldn't happen since we only look for public static fields.
+                        }
+                    }
+                }
+            }
         }
-        return s;
+
+        // couldn't find a matching constant? return the value
+        return Integer.toString(result);
     }
-    
+
     private void runInstall() {
         int installFlags = 0;
         String installerPackageName = null;
@@ -624,7 +571,7 @@
         try {
             mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,
                     installerPackageName);
-            
+
             synchronized (obs) {
                 while (!obs.finished) {
                     try {
@@ -645,11 +592,11 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
         boolean finished;
         boolean result;
-        
+
         public void packageDeleted(boolean succeeded) {
             synchronized (this) {
                 finished = true;
@@ -658,7 +605,7 @@
             }
         }
     }
-    
+
     private void runUninstall() {
         int unInstallFlags = 0;
 
@@ -712,7 +659,7 @@
         }
         return "unknown";
     }
-    
+
     private void runSetEnabledSetting(int state) {
         String pkg = nextArg();
         if (pkg == null) {
@@ -760,11 +707,11 @@
             System.err.println(PM_NOT_RUNNING_ERR);
         }
     }
-    
+
     private Resources getResources(PackageItemInfo pii) {
         Resources res = mResourceCache.get(pii.packageName);
         if (res != null) return res;
-        
+
         try {
             ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0);
             AssetManager am = new AssetManager();
@@ -778,7 +725,7 @@
             return null;
         }
     }
-    
+
     private String nextOption() {
         if (mNextArg >= mArgs.length) {
             return null;
@@ -830,7 +777,7 @@
         System.err.println("       pm list packages [-f]");
         System.err.println("       pm list permission-groups");
         System.err.println("       pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
-        System.err.println("       pm list instrumentation [-f] [TARGET-PACKAGE]");        
+        System.err.println("       pm list instrumentation [-f] [TARGET-PACKAGE]");
         System.err.println("       pm path PACKAGE");
         System.err.println("       pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] PATH");
         System.err.println("       pm uninstall [-k] PACKAGE");
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 6aec52c..776c923 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -297,7 +297,7 @@
      * Turn on the local Bluetooth adapter.
      * <p>This powers on the underlying Bluetooth hardware, and starts all
      * Bluetooth system services.
-     * <p>This is an asynchronous call: it will return immediatley, and
+     * <p>This is an asynchronous call: it will return immediately, and
      * clients should listen for {@link #ACTION_STATE_CHANGED}
      * to be notified of subsequent adapter state changes. If this call returns
      * true, then the adapter state will immediately transition from {@link
@@ -322,7 +322,7 @@
      * Turn off the local Bluetooth adapter.
      * <p>This gracefully shuts down all Bluetooth connections, stops Bluetooth
      * system services, and powers down the underlying Bluetooth hardware.
-     * <p>This is an asynchronous call: it will return immediatley, and
+     * <p>This is an asynchronous call: it will return immediately, and
      * clients should listen for {@link #ACTION_STATE_CHANGED}
      * to be notified of subsequent adapter state changes. If this call returns
      * true, then the adapter state will immediately transition from {@link
diff --git a/core/java/android/pim/vcard/VCardComposer.java b/core/java/android/pim/vcard/VCardComposer.java
index 2404a43..e01bd3c 100644
--- a/core/java/android/pim/vcard/VCardComposer.java
+++ b/core/java/android/pim/vcard/VCardComposer.java
@@ -29,9 +29,9 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.CommonDataKinds.Birthday;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Birthday;
 import android.provider.ContactsContract.CommonDataKinds.Nickname;
 import android.provider.ContactsContract.CommonDataKinds.Note;
 import android.provider.ContactsContract.CommonDataKinds.Organization;
@@ -40,9 +40,6 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
-import android.provider.CallLog.Calls;
-import android.provider.CallLog;
-import android.text.format.Time;
 import android.text.TextUtils;
 import android.text.format.Time;
 import android.util.CharsetUtils;
@@ -86,6 +83,17 @@
 
     private final static String DEFAULT_EMAIL_TYPE = Constants.ATTR_TYPE_INTERNET;
 
+    public static final String FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO =
+        "Failed to get database information";
+
+    public static final String FAILURE_REASON_NO_ENTRY =
+        "There's no exportable in the database";
+
+    public static final String FAILURE_REASON_NOT_INITIALIZED =
+        "The vCard composer object is not correctly initialized";
+
+    public static final String NO_ERROR = "No error";
+
     public static interface OneEntryHandler {
         public boolean onInit(Context context);
 
@@ -276,7 +284,7 @@
     private boolean mTerminateIsCalled;
     private List<OneEntryHandler> mHandlerList;
 
-    private String mErrorReason = "No error";
+    private String mErrorReason = NO_ERROR;
 
     private static final Map<Integer, String> sImMap;
 
@@ -293,12 +301,12 @@
 
     private boolean mIsCallLogComposer = false;
 
-    private static final String[] CONTACTS_PROJECTION = new String[] {
-        Contacts._ID,
+    private static final String[] sRawContactsProjection = new String[] {
+        RawContacts._ID,
     };
 
     /** The projection to use when querying the call log table */
-    private static final String[] CALL_LOG_PROJECTION = new String[] {
+    private static final String[] sCallLogProjection = new String[] {
             Calls.NUMBER, Calls.DATE, Calls.TYPE, Calls.CACHED_NAME, Calls.CACHED_NUMBER_TYPE,
             Calls.CACHED_NUMBER_LABEL
     };
@@ -312,17 +320,23 @@
     private static final String FLAG_TIMEZONE_UTC = "Z";
 
     public VCardComposer(Context context) {
-        this(context, VCardConfig.VCARD_TYPE_DEFAULT, true);
+        this(context, VCardConfig.VCARD_TYPE_DEFAULT, true, false);
     }
 
     public VCardComposer(Context context, String vcardTypeStr,
             boolean careHandlerErrors) {
         this(context, VCardConfig.getVCardTypeFromString(vcardTypeStr),
-                careHandlerErrors);
+                careHandlerErrors, false);
+    }
+
+    public VCardComposer(Context context, int vcardType, boolean careHandlerErrors) {
+        this(context, vcardType, careHandlerErrors, false);
     }
 
     /**
-     * Construct for supporting call log entry vCard composing
+     * Construct for supporting call log entry vCard composing.
+     *
+     * @param isCallLogComposer true if this composer is for creating Call Log vCard.
      */
     public VCardComposer(Context context, int vcardType, boolean careHandlerErrors,
             boolean isCallLogComposer) {
@@ -359,10 +373,6 @@
         }
     }
 
-    public VCardComposer(Context context, int vcardType, boolean careHandlerErrors) {
-        this(context, vcardType, careHandlerErrors, false);
-    }
-
     /**
      * This static function is to compose vCard for phone own number
      */
@@ -429,25 +439,27 @@
         }
 
         if (mIsCallLogComposer) {
-            mCursor = mContentResolver.query(CallLog.Calls.CONTENT_URI, CALL_LOG_PROJECTION,
+            mCursor = mContentResolver.query(CallLog.Calls.CONTENT_URI, sCallLogProjection,
                     selection, selectionArgs, null);
         } else {
-            // TODO: thorow an appropriate exception!
-            mCursor = mContentResolver.query(RawContacts.CONTENT_URI, CONTACTS_PROJECTION,
+            mCursor = mContentResolver.query(RawContacts.CONTENT_URI, sRawContactsProjection,
                     selection, selectionArgs, null);
         }
 
-        if (mCursor == null || !mCursor.moveToFirst()) {
-            if (mCursor != null) {
-                try {
-                    mCursor.close();
-                } catch (SQLiteException e) {
-                    Log.e(LOG_TAG, "SQLiteException on Cursor#close(): "
-                            + e.getMessage());
-                }
+        if (mCursor == null) {
+            mErrorReason = FAILURE_REASON_FAILED_TO_GET_DATABASE_INFO;
+            return false;
+        }
+
+        if (mCursor.getCount() == 0 || !mCursor.moveToFirst()) {
+            try {
+                mCursor.close();
+            } catch (SQLiteException e) {
+                Log.e(LOG_TAG, "SQLiteException on Cursor#close(): " + e.getMessage());
+            } finally {
                 mCursor = null;
+                mErrorReason = FAILURE_REASON_NO_ENTRY;
             }
-            mErrorReason = "Getting database information failed.";
             return false;
         }
 
@@ -462,8 +474,7 @@
 
     public boolean createOneEntry() {
         if (mCursor == null || mCursor.isAfterLast()) {
-            // TODO: ditto
-            mErrorReason = "Not initialized or database has some problem.";
+            mErrorReason = FAILURE_REASON_NOT_INITIALIZED;
             return false;
         }
         String name = null;
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 6ac1f07..3ce1815 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -356,7 +356,10 @@
     // Whether to prevent drag during touch. The initial value depends on
     // mForwardTouchEvents. If WebCore wants touch events, we assume it will
     // take control of touch events unless it says no for touch down event.
-    private boolean mPreventDrag;
+    private static final int PREVENT_DRAG_NO = 0;
+    private static final int PREVENT_DRAG_MAYBE_YES = 1;
+    private static final int PREVENT_DRAG_YES = 2;
+    private int mPreventDrag = PREVENT_DRAG_NO;
 
     // To keep track of whether the current drag was initiated by a WebTextView,
     // so that we know not to hide the cursor
@@ -3710,7 +3713,8 @@
                     }
                 } else {
                     mTouchMode = TOUCH_INIT_MODE;
-                    mPreventDrag = mForwardTouchEvents;
+                    mPreventDrag = mForwardTouchEvents ? PREVENT_DRAG_MAYBE_YES
+                            : PREVENT_DRAG_NO;
                     mWebViewCore.sendMessage(
                             EventHub.UPDATE_FRAME_CACHE_IF_LOADING);
                     if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
@@ -3751,11 +3755,15 @@
                         invalidate();
                         break;
                     }
-                    if (mPreventDrag || (deltaX * deltaX + deltaY * deltaY)
-                            < mTouchSlopSquare) {
+                    if ((deltaX * deltaX + deltaY * deltaY) < mTouchSlopSquare) {
                         break;
                     }
-
+                    if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+                        // track mLastTouchTime as we may need to do fling at
+                        // ACTION_UP
+                        mLastTouchTime = eventTime;
+                        break;
+                    }
                     if (mTouchMode == TOUCH_SHORTPRESS_MODE
                             || mTouchMode == TOUCH_SHORTPRESS_START_MODE) {
                         mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
@@ -3884,15 +3892,6 @@
                         mTouchMode = TOUCH_DONE_MODE;
                         doDoubleTap();
                         break;
-                    case TOUCH_INIT_MODE: // tap
-                        mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
-                        if (!mPreventDrag) {
-                            mPrivateHandler.sendMessageDelayed(
-                                    mPrivateHandler.obtainMessage(
-                                    RELEASE_SINGLE_TAP),
-                                    ViewConfiguration.getDoubleTapTimeout());
-                        }
-                        break;
                     case TOUCH_SHORTPRESS_START_MODE:
                     case TOUCH_SHORTPRESS_MODE:
                         mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
@@ -3904,6 +3903,34 @@
                         commitCopy();
                         mTouchSelection = false;
                         break;
+                    case TOUCH_INIT_MODE: // tap
+                        mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS);
+                        if ((deltaX * deltaX + deltaY * deltaY) > mTouchSlopSquare) {
+                            Log.w(LOGTAG, "Miss a drag as we are waiting for" +
+                                    " WebCore's response for touch down.");
+                            if (computeHorizontalScrollExtent() < computeHorizontalScrollRange()
+                                    || computeVerticalScrollExtent() < computeVerticalScrollRange()) {
+                                // we will not rewrite drag code here, but we
+                                // will try fling if it applies.
+                                WebViewCore.pauseUpdate(mWebViewCore);
+                                // fall through to TOUCH_DRAG_MODE
+                            } else {
+                                break;
+                            }
+                        } else {
+                            if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+                                // if mPreventDrag is not confirmed, treat it as
+                                // no so that it won't block tap or double tap.
+                                mPreventDrag = PREVENT_DRAG_NO;
+                            }
+                            if (mPreventDrag == PREVENT_DRAG_NO) {
+                                mPrivateHandler.sendMessageDelayed(
+                                        mPrivateHandler.obtainMessage(
+                                        RELEASE_SINGLE_TAP),
+                                        ViewConfiguration.getDoubleTapTimeout());
+                            }
+                            break;
+                        }
                     case TOUCH_DRAG_MODE:
                         // redraw in high-quality, as we're done dragging
                         invalidate();
@@ -4821,6 +4848,11 @@
                     break;
                 }
                 case SWITCH_TO_SHORTPRESS: {
+                    // if mPreventDrag is not confirmed, treat it as no so that
+                    // it won't block panning the page.
+                    if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+                        mPreventDrag = PREVENT_DRAG_NO;
+                    }
                     if (mTouchMode == TOUCH_INIT_MODE) {
                         mTouchMode = TOUCH_SHORTPRESS_START_MODE;
                         updateSelection();
@@ -4830,7 +4862,7 @@
                     break;
                 }
                 case SWITCH_TO_LONGPRESS: {
-                    if (!mPreventDrag) {
+                    if (mPreventDrag == PREVENT_DRAG_NO) {
                         mTouchMode = TOUCH_DONE_MODE;
                         performLongClick();
                         rebuildWebTextView();
@@ -4838,7 +4870,7 @@
                     break;
                 }
                 case RELEASE_SINGLE_TAP: {
-                    if (!mPreventDrag) {
+                    if (mPreventDrag == PREVENT_DRAG_NO) {
                         mTouchMode = TOUCH_DONE_MODE;
                         doShortPress();
                     }
@@ -5064,9 +5096,14 @@
 
                 case PREVENT_TOUCH_ID:
                     if (msg.arg1 == MotionEvent.ACTION_DOWN) {
-                        mPreventDrag = msg.arg2 == 1;
-                        if (mPreventDrag) {
-                            mTouchMode = TOUCH_DONE_MODE;
+                        // dont override if mPreventDrag has been set to no due
+                        // to time out
+                        if (mPreventDrag == PREVENT_DRAG_MAYBE_YES) {
+                            mPreventDrag = msg.arg2 == 1 ? PREVENT_DRAG_YES
+                                    : PREVENT_DRAG_NO;
+                            if (mPreventDrag == PREVENT_DRAG_YES) {
+                                mTouchMode = TOUCH_DONE_MODE;
+                            }
                         }
                     }
                     break;
diff --git a/core/res/res/drawable-hdpi/gallery_unselected_default.9.png b/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
index 855dca1..3d10b86 100644
--- a/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
+++ b/core/res/res/drawable-hdpi/gallery_unselected_default.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png b/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
index 5ec400c..2fa7c46 100644
--- a/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
+++ b/core/res/res/drawable-hdpi/gallery_unselected_pressed.9.png
Binary files differ
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index 0ef73fa..059e899 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -188,11 +188,6 @@
         </FrameLayout>
     </LinearLayout>
 
-    <View
-         android:background="@drawable/code_lock_left"
-         android:layout_width="2dip"
-         android:layout_height="fill_parent" />
-
     <!-- right side: lock pattern -->
     <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
          android:layout_width="wrap_content"
diff --git a/include/ui/CameraParameters.h b/include/ui/CameraParameters.h
index 9ca1806..9c3d4f0 100644
--- a/include/ui/CameraParameters.h
+++ b/include/ui/CameraParameters.h
@@ -69,11 +69,203 @@
     void dump() const;
     status_t dump(int fd, const Vector<String16>& args) const;
 
+    // Parameter keys to communicate between camera application and driver.
+    // The access (read/write, read only, or write only) is viewed from the
+    // perspective of applications, not driver.
+
+    // Preview frame size in pixels (width x height).
+    // Example value: "480x320". Read/Write.
+    static const char KEY_PREVIEW_SIZE[];
+    // Supported preview frame sizes in pixels.
+    // Example value: "800x600,480x320". Read only.
+    static const char KEY_SUPPORTED_PREVIEW_SIZES[];
+    // The image format for preview frames.
+    // Example value: "yuv420sp" or PIXEL_FORMAT_XXX constants. Read/write.
+    static const char KEY_PREVIEW_FORMAT[];
+    // Supported image formats for preview frames.
+    // Example value: "yuv420sp,yuv422i-yuyv". Read only.
+    static const char KEY_SUPPORTED_PREVIEW_FORMATS[];
+    // Number of preview frames per second.
+    // Example value: "15". Read/write.
+    static const char KEY_PREVIEW_FRAME_RATE[];
+    // Supported number of preview frames per second.
+    // Example value: "24,15,10". Read.
+    static const char KEY_SUPPORTED_PREVIEW_FRAME_RATES[];
+    // The dimensions for captured pictures in pixels (width x height).
+    // Example value: "1024x768". Read/write.
+    static const char KEY_PICTURE_SIZE[];
+    // Supported dimensions for captured pictures in pixels.
+    // Example value: "2048x1536,1024x768". Read only.
+    static const char KEY_SUPPORTED_PICTURE_SIZES[];
+    // The image format for captured pictures.
+    // Example value: "jpeg" or PIXEL_FORMAT_XXX constants. Read/write.
+    static const char KEY_PICTURE_FORMAT[];
+    // Supported image formats for captured pictures.
+    // Example value: "jpeg,rgb565". Read only.
+    static const char KEY_SUPPORTED_PICTURE_FORMATS[];
+    // The width (in pixels) of EXIF thumbnail in Jpeg picture.
+    // Example value: "512". Read/write.
+    static const char KEY_JPEG_THUMBNAIL_WIDTH[];
+    // The height (in pixels) of EXIF thumbnail in Jpeg picture.
+    // Example value: "384". Read/write.
+    static const char KEY_JPEG_THUMBNAIL_HEIGHT[];
+    // Supported EXIF thumbnail sizes (width x height).
+    // Example value: "512x384,320x240". Read only.
+    static const char KEY_SUPPORTED_THUMBNAIL_SIZES[];
+    // The quality of the EXIF thumbnail in Jpeg picture. The range is 1 to 100,
+    // with 100 being the best.
+    // Example value: "90". Read/write.
+    static const char KEY_JPEG_THUMBNAIL_QUALITY[];
+    // Jpeg quality of captured picture. The range is 1 to 100, with 100 being
+    // the best.
+    // Example value: "90". Read/write.
+    static const char KEY_JPEG_QUALITY[];
+    // The orientation of the device in degrees. For example, suppose the
+    // natural position of the device is landscape. If the user takes a picture
+    // in landscape mode in 2048x1536 resolution, the rotation will be set to
+    // "0". If the user rotates the phone 90 degrees clockwise, the rotation
+    // should be set to "90".
+    // The camera driver can set orientation in the EXIF header without rotating
+    // the picture. Or the driver can rotate the picture and the EXIF thumbnail.
+    // If the Jpeg picture is rotated, the orientation in the EXIF header should
+    // be missing or 1 (row #0 is top and column #0 is left side). The driver
+    // should not set default value for this parameter.
+    // Example value: "0" or "90" or "180" or "270". Write only.
+    static const char KEY_ROTATION[];
+    // GPS latitude coordinate. This will be stored in JPEG EXIF header.
+    // Example value: "25.032146". Write only.
+    static const char KEY_GPS_LATITUDE[];
+    // GPS longitude coordinate. This will be stored in JPEG EXIF header.
+    // Example value: "121.564448". Write only.
+    static const char KEY_GPS_LONGITUDE[];
+    // GPS altitude. This will be stored in JPEG EXIF header.
+    // Example value: "21.0". Write only.
+    static const char KEY_GPS_ALTITUDE[];
+    // GPS timestamp (UTC in seconds since January 1, 1970). This should be
+    // stored in JPEG EXIF header.
+    // Example value: "1251192757". Write only.
+    static const char KEY_GPS_TIMESTAMP[];
+    // Current white balance setting.
+    // Example value: "auto" or WHITE_BALANCE_XXX constants. Read/write.
+    static const char KEY_WHITE_BALANCE[];
+    // Supported white balance settings.
+    // Example value: "auto,incandescent,daylight". Read only.
+    static const char KEY_SUPPORTED_WHITE_BALANCE[];
+    // Current color effect setting.
+    // Example value: "none" or EFFECT_XXX constants. Read/write.
+    static const char KEY_EFFECT[];
+    // Supported color effect settings.
+    // Example value: "none,mono,sepia". Read only.
+    static const char KEY_SUPPORTED_EFFECTS[];
+    // Current antibanding setting.
+    // Example value: "auto" or ANTIBANDING_XXX constants. Read/write.
+    static const char KEY_ANTIBANDING[];
+    // Supported antibanding settings.
+    // Example value: "auto,50hz,60hz,off". Read only.
+    static const char KEY_SUPPORTED_ANTIBANDING[];
+    // Current scene mode.
+    // Example value: "auto" or SCENE_MODE_XXX constants. Read/write.
+    static const char KEY_SCENE_MODE[];
+    // Supported scene mode settings.
+    // Example value: "auto,night,fireworks". Read only.
+    static const char KEY_SUPPORTED_SCENE_MODES[];
+    // Current flash mode.
+    // Example value: "auto" or FLASH_MODE_XXX constants. Read/write.
+    static const char KEY_FLASH_MODE[];
+    // Supported flash modes.
+    // Example value: "auto,on,off". Read only.
+    static const char KEY_SUPPORTED_FLASH_MODES[];
+    // Current focus mode. If the camera does not support auto-focus, the value
+    // should be FOCUS_MODE_FIXED. If the focus mode is not FOCUS_MODE_FIXED or
+    // or FOCUS_MODE_INFINITY, applications should call
+    // CameraHardwareInterface.autoFocus to start the focus.
+    // Example value: "auto" or FOCUS_MODE_XXX constants. Read/write.
+    static const char KEY_FOCUS_MODE[];
+    // Supported focus modes.
+    // Example value: "auto,macro,fixed". Read only.
+    static const char KEY_SUPPORTED_FOCUS_MODES[];
+
+        // Values for white balance settings.
+    static const char WHITE_BALANCE_AUTO[];
+    static const char WHITE_BALANCE_INCANDESCENT[];
+    static const char WHITE_BALANCE_FLUORESCENT[];
+    static const char WHITE_BALANCE_WARM_FLUORESCENT[];
+    static const char WHITE_BALANCE_DAYLIGHT[];
+    static const char WHITE_BALANCE_CLOUDY_DAYLIGHT[];
+    static const char WHITE_BALANCE_TWILIGHT[];
+    static const char WHITE_BALANCE_SHADE[];
+
+    // Values for effect settings.
+    static const char EFFECT_NONE[];
+    static const char EFFECT_MONO[];
+    static const char EFFECT_NEGATIVE[];
+    static const char EFFECT_SOLARIZE[];
+    static const char EFFECT_SEPIA[];
+    static const char EFFECT_POSTERIZE[];
+    static const char EFFECT_WHITEBOARD[];
+    static const char EFFECT_BLACKBOARD[];
+    static const char EFFECT_AQUA[];
+
+    // Values for antibanding settings.
+    static const char ANTIBANDING_AUTO[];
+    static const char ANTIBANDING_50HZ[];
+    static const char ANTIBANDING_60HZ[];
+    static const char ANTIBANDING_OFF[];
+
+    // Values for flash mode settings.
+    // Flash will not be fired.
+    static const char FLASH_MODE_OFF[];
+    // Flash will be fired automatically when required. The timing is decided by
+    // camera driver.
+    static const char FLASH_MODE_AUTO[];
+    // Flash will always be fired. The timing is decided by camera driver.
+    static const char FLASH_MODE_ON[];
+    // Flash will be fired in red-eye reduction mode.
+    static const char FLASH_MODE_RED_EYE[];
+    // Constant emission of light. This can be used for video recording.
+    static const char FLASH_MODE_VIDEO_LIGHT[];
+
+    // Values for scene mode settings.
+    static const char SCENE_MODE_AUTO[];
+    static const char SCENE_MODE_ACTION[];
+    static const char SCENE_MODE_PORTRAIT[];
+    static const char SCENE_MODE_LANDSCAPE[];
+    static const char SCENE_MODE_NIGHT[];
+    static const char SCENE_MODE_NIGHT_PORTRAIT[];
+    static const char SCENE_MODE_THEATRE[];
+    static const char SCENE_MODE_BEACH[];
+    static const char SCENE_MODE_SNOW[];
+    static const char SCENE_MODE_SUNSET[];
+    static const char SCENE_MODE_STEADYPHOTO[];
+    static const char SCENE_MODE_FIREWORKS[];
+    static const char SCENE_MODE_SPORTS[];
+    static const char SCENE_MODE_PARTY[];
+    static const char SCENE_MODE_CANDLELIGHT[];
+
+    // Formats for setPreviewFormat and setPictureFormat.
+    static const char PIXEL_FORMAT_YUV422SP[];
+    static const char PIXEL_FORMAT_YUV420SP[]; // NV21
+    static const char PIXEL_FORMAT_YUV422I[]; // YUY2
+    static const char PIXEL_FORMAT_RGB565[];
+    static const char PIXEL_FORMAT_JPEG[];
+
+    // Values for focus mode settings.
+    // Auto-focus mode.
+    static const char FOCUS_MODE_AUTO[];
+    // Focus is set at infinity. Applications should not call
+    // CameraHardwareInterface.autoFocus in this mode.
+    static const char FOCUS_MODE_INFINITY[];
+    static const char FOCUS_MODE_MACRO[];
+    // Focus is fixed. The camera is always in this mode if the focus is not
+    // adjustable. If the camera has auto-focus, this mode can fix the
+    // focus, which is usually at hyperfocal distance. Applications should
+    // not call CameraHardwareInterface.autoFocus in this mode.
+    static const char FOCUS_MODE_FIXED[];
+
 private:
     DefaultKeyedVector<String8,String8>    mMap;
 };
 
-
 }; // namespace android
 
 #endif
diff --git a/libs/ui/CameraParameters.cpp b/libs/ui/CameraParameters.cpp
index 6c25836..9200a97 100644
--- a/libs/ui/CameraParameters.cpp
+++ b/libs/ui/CameraParameters.cpp
@@ -2,16 +2,16 @@
 **
 ** Copyright 2008, The Android Open Source Project
 **
-** Licensed under the Apache License, Version 2.0 (the "License"); 
-** you may not use this file except in compliance with the License. 
-** You may obtain a copy of the License at 
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
 **
-**     http://www.apache.org/licenses/LICENSE-2.0 
+**     http://www.apache.org/licenses/LICENSE-2.0
 **
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
 
@@ -23,6 +23,103 @@
 #include <ui/CameraParameters.h>
 
 namespace android {
+// Parameter keys to communicate between camera application and driver.
+const char CameraParameters::KEY_PREVIEW_SIZE[] = "preview-size";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES[] = "preview-size-values";
+const char CameraParameters::KEY_PREVIEW_FORMAT[] = "preview-format";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS[] = "preview-format-values";
+const char CameraParameters::KEY_PREVIEW_FRAME_RATE[] = "preview-frame-rate";
+const char CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES[] = "preview-frame-rate-values";
+const char CameraParameters::KEY_PICTURE_SIZE[] = "picture-size";
+const char CameraParameters::KEY_SUPPORTED_PICTURE_SIZES[] = "picture-size-values";
+const char CameraParameters::KEY_PICTURE_FORMAT[] = "picture-format";
+const char CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS[] = "picture-format-values";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH[] = "jpeg-thumbnail-width";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT[] = "jpeg-thumbnail-height";
+const char CameraParameters::KEY_SUPPORTED_THUMBNAIL_SIZES[] = "jpeg-thumbnail-size-values";
+const char CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY[] = "jpeg-thumbnail-quality";
+const char CameraParameters::KEY_JPEG_QUALITY[] = "jpeg-quality";
+const char CameraParameters::KEY_ROTATION[] = "rotation";
+const char CameraParameters::KEY_GPS_LATITUDE[] = "gps-latitude";
+const char CameraParameters::KEY_GPS_LONGITUDE[] = "gps-longitude";
+const char CameraParameters::KEY_GPS_ALTITUDE[] = "gps-altitude";
+const char CameraParameters::KEY_GPS_TIMESTAMP[] = "gps-timestamp";
+const char CameraParameters::KEY_WHITE_BALANCE[] = "whitebalance";
+const char CameraParameters::KEY_SUPPORTED_WHITE_BALANCE[] = "whitebalance-values";
+const char CameraParameters::KEY_EFFECT[] = "effect";
+const char CameraParameters::KEY_SUPPORTED_EFFECTS[] = "effect-values";
+const char CameraParameters::KEY_ANTIBANDING[] = "antibanding";
+const char CameraParameters::KEY_SUPPORTED_ANTIBANDING[] = "antibanding-values";
+const char CameraParameters::KEY_SCENE_MODE[] = "scene-mode";
+const char CameraParameters::KEY_SUPPORTED_SCENE_MODES[] = "scene-mode-values";
+const char CameraParameters::KEY_FLASH_MODE[] = "flash-mode";
+const char CameraParameters::KEY_SUPPORTED_FLASH_MODES[] = "flash-mode-values";
+const char CameraParameters::KEY_FOCUS_MODE[] = "focus-mode";
+const char CameraParameters::KEY_SUPPORTED_FOCUS_MODES[] = "focus-mode-values";
+
+// Values for white balance settings.
+const char CameraParameters::WHITE_BALANCE_AUTO[] = "auto";
+const char CameraParameters::WHITE_BALANCE_INCANDESCENT[] = "incandescent";
+const char CameraParameters::WHITE_BALANCE_FLUORESCENT[] = "fluorescent";
+const char CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT[] = "warm-fluorescent";
+const char CameraParameters::WHITE_BALANCE_DAYLIGHT[] = "daylight";
+const char CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT[] = "cloudy-daylight";
+const char CameraParameters::WHITE_BALANCE_TWILIGHT[] = "twilight";
+const char CameraParameters::WHITE_BALANCE_SHADE[] = "shade";
+
+// Values for effect settings.
+const char CameraParameters::EFFECT_NONE[] = "none";
+const char CameraParameters::EFFECT_MONO[] = "mono";
+const char CameraParameters::EFFECT_NEGATIVE[] = "negative";
+const char CameraParameters::EFFECT_SOLARIZE[] = "solarize";
+const char CameraParameters::EFFECT_SEPIA[] = "sepia";
+const char CameraParameters::EFFECT_POSTERIZE[] = "posterize";
+const char CameraParameters::EFFECT_WHITEBOARD[] = "whiteboard";
+const char CameraParameters::EFFECT_BLACKBOARD[] = "blackboard";
+const char CameraParameters::EFFECT_AQUA[] = "aqua";
+
+// Values for antibanding settings.
+const char CameraParameters::ANTIBANDING_AUTO[] = "auto";
+const char CameraParameters::ANTIBANDING_50HZ[] = "50hz";
+const char CameraParameters::ANTIBANDING_60HZ[] = "60hz";
+const char CameraParameters::ANTIBANDING_OFF[] = "off";
+
+// Values for flash mode settings.
+const char CameraParameters::FLASH_MODE_OFF[] = "off";
+const char CameraParameters::FLASH_MODE_AUTO[] = "auto";
+const char CameraParameters::FLASH_MODE_ON[] = "on";
+const char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
+const char CameraParameters::FLASH_MODE_VIDEO_LIGHT[] = "video-light";
+
+// Values for scene mode settings.
+const char CameraParameters::SCENE_MODE_AUTO[] = "auto";
+const char CameraParameters::SCENE_MODE_ACTION[] = "action";
+const char CameraParameters::SCENE_MODE_PORTRAIT[] = "portrait";
+const char CameraParameters::SCENE_MODE_LANDSCAPE[] = "landscape";
+const char CameraParameters::SCENE_MODE_NIGHT[] = "night";
+const char CameraParameters::SCENE_MODE_NIGHT_PORTRAIT[] = "night-portrait";
+const char CameraParameters::SCENE_MODE_THEATRE[] = "theatre";
+const char CameraParameters::SCENE_MODE_BEACH[] = "beach";
+const char CameraParameters::SCENE_MODE_SNOW[] = "snow";
+const char CameraParameters::SCENE_MODE_SUNSET[] = "sunset";
+const char CameraParameters::SCENE_MODE_STEADYPHOTO[] = "steadyphoto";
+const char CameraParameters::SCENE_MODE_FIREWORKS[] = "fireworks";
+const char CameraParameters::SCENE_MODE_SPORTS[] = "sports";
+const char CameraParameters::SCENE_MODE_PARTY[] = "party";
+const char CameraParameters::SCENE_MODE_CANDLELIGHT[] = "candlelight";
+
+// Formats for setPreviewFormat and setPictureFormat.
+const char CameraParameters::PIXEL_FORMAT_YUV422SP[] = "yuv422sp";
+const char CameraParameters::PIXEL_FORMAT_YUV420SP[] = "yuv420sp";
+const char CameraParameters::PIXEL_FORMAT_YUV422I[] = "yuv422i-yuyv";
+const char CameraParameters::PIXEL_FORMAT_RGB565[] = "rgb565";
+const char CameraParameters::PIXEL_FORMAT_JPEG[] = "jpeg";
+
+// Values for focus mode settings.
+const char CameraParameters::FOCUS_MODE_AUTO[] = "auto";
+const char CameraParameters::FOCUS_MODE_INFINITY[] = "infinity";
+const char CameraParameters::FOCUS_MODE_MACRO[] = "macro";
+const char CameraParameters::FOCUS_MODE_FIXED[] = "fixed";
 
 static const char* portrait = "portrait";
 static const char* landscape = "landscape";
@@ -91,7 +188,7 @@
 
 void CameraParameters::set(const char *key, const char *value)
 {
-    // XXX i think i can do this with strspn() 
+    // XXX i think i can do this with strspn()
     if (strchr(key, '=') || strchr(key, ';')) {
         //XXX LOGE("Key \"%s\"contains invalid character (= or ;)", key);
         return;
@@ -150,7 +247,7 @@
 {
     char str[32];
     sprintf(str, "%dx%d", width, height);
-    set("preview-size", str);
+    set(KEY_PREVIEW_SIZE, str);
 }
 
 void CameraParameters::getPreviewSize(int *width, int *height) const
@@ -159,7 +256,7 @@
     *height = -1;
 
     // Get the current string, if it doesn't exist, leave the -1x-1
-    const char *p = get("preview-size");
+    const char *p = get(KEY_PREVIEW_SIZE);
     if (p == 0)
         return;
 
@@ -172,17 +269,17 @@
 
 void CameraParameters::setPreviewFrameRate(int fps)
 {
-    set("preview-frame-rate", fps);
+    set(KEY_PREVIEW_FRAME_RATE, fps);
 }
 
 int CameraParameters::getPreviewFrameRate() const
 {
-    return getInt("preview-frame-rate");
+    return getInt(KEY_PREVIEW_FRAME_RATE);
 }
 
 void CameraParameters::setPreviewFormat(const char *format)
 {
-    set("preview-format", format);
+    set(KEY_PREVIEW_FORMAT, format);
 }
 
 int CameraParameters::getOrientation() const
@@ -196,22 +293,22 @@
 void CameraParameters::setOrientation(int orientation)
 {
     if (orientation == CAMERA_ORIENTATION_PORTRAIT) {
-        set("preview-format", portrait);
+        set("orientation", portrait);
     } else {
-        set("preview-format", landscape);
+        set("orientation", landscape);
     }
 }
 
 const char *CameraParameters::getPreviewFormat() const
 {
-    return get("preview-format");
+    return get(KEY_PREVIEW_FORMAT);
 }
 
 void CameraParameters::setPictureSize(int width, int height)
 {
     char str[32];
     sprintf(str, "%dx%d", width, height);
-    set("picture-size", str);
+    set(KEY_PICTURE_SIZE, str);
 }
 
 void CameraParameters::getPictureSize(int *width, int *height) const
@@ -220,7 +317,7 @@
     *height = -1;
 
     // Get the current string, if it doesn't exist, leave the -1x-1
-    const char *p = get("picture-size");
+    const char *p = get(KEY_PICTURE_SIZE);
     if (p == 0)
         return;
 
@@ -233,12 +330,12 @@
 
 void CameraParameters::setPictureFormat(const char *format)
 {
-    set("picture-format", format);
+    set(KEY_PICTURE_FORMAT, format);
 }
 
 const char *CameraParameters::getPictureFormat() const
 {
-    return get("picture-format");
+    return get(KEY_PICTURE_FORMAT);
 }
 
 void CameraParameters::dump() const
diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java
index 170a9f8..aacae18 100644
--- a/services/java/com/android/server/TelephonyRegistry.java
+++ b/services/java/com/android/server/TelephonyRegistry.java
@@ -109,7 +109,13 @@
     // handler before they get to app code.
 
     TelephonyRegistry(Context context) {
-        CellLocation.getEmpty().fillInNotifierBundle(mCellLocation);
+        CellLocation  location = CellLocation.getEmpty();
+
+        // Note that location can be null for non-phone builds like
+        // like the generic one.
+        if (location != null) {
+            location.fillInNotifierBundle(mCellLocation);
+        }
         mContext = context;
         mBatteryStats = BatteryStatsService.getService();
     }
diff --git a/telephony/java/android/telephony/NeighboringCellInfo.java b/telephony/java/android/telephony/NeighboringCellInfo.java
index f492abd..d698169 100644
--- a/telephony/java/android/telephony/NeighboringCellInfo.java
+++ b/telephony/java/android/telephony/NeighboringCellInfo.java
@@ -18,6 +18,15 @@
 
 import android.os.Parcel;
 import android.os.Parcelable;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
+
+
 
 /**
  * Represents the neighboring cell information, including
@@ -34,19 +43,53 @@
      */
     static final public int UNKNOWN_CID = -1;
 
+    /**
+     * In GSM, mRssi is the Received RSSI;
+     * In UMTS, mRssi is the Level index of CPICH Received Signal Code Power
+     */
     private int mRssi;
+    /**
+     * CID in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
+     */
     private int mCid;
+    /**
+     * LAC in 16 bits format in GSM. Return UNKNOWN_CID in UMTS and CMDA.
+     */
+    private int mLac;
+    /**
+     * Primary Scrambling Code in 9 bits format in UMTS
+     * Return UNKNOWN_CID in GSM and CMDA.
+     */
+    private int mPsc;
+    /**
+     * Radio network type, value is one of following
+     * TelephonyManager.NETWORK_TYPE_XXXXXX.
+     */
+    private int mNetworkType;
 
     /**
+     * @deprecated
      * Empty constructor.  Initializes the RSSI and CID.
+     *
+     * NeighboringCellInfo is one time shot for the neighboring cells based on
+     * the radio network type at that moment. Its constructor needs radio network
+     * type.
      */
     public NeighboringCellInfo() {
         mRssi = UNKNOWN_RSSI;
+        mLac = UNKNOWN_CID;
         mCid = UNKNOWN_CID;
+        mPsc = UNKNOWN_CID;
+        mNetworkType = NETWORK_TYPE_UNKNOWN;
     }
 
     /**
+     * @deprecated
      * Initialize the object from rssi and cid.
+     *
+     * NeighboringCellInfo is one time shot for the neighboring cells based on
+     * the radio network type at that moment. Its constructor needs radio network
+     * type.
      */
     public NeighboringCellInfo(int rssi, int cid) {
         mRssi = rssi;
@@ -54,40 +97,148 @@
     }
 
     /**
+     * @hide
+     * Initialize the object from rssi, location string, and radioType
+     * radioType is one of following
+     * {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS},
+     * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE},
+     * {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
+     * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
+     * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
+     * and {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}.
+     */
+    public NeighboringCellInfo(int rssi, String location, int radioType) {
+        // set default value
+        mRssi = rssi;
+        mNetworkType = NETWORK_TYPE_UNKNOWN;
+        mPsc = UNKNOWN_CID;
+        mLac = UNKNOWN_CID;
+        mCid = UNKNOWN_CID;
+
+
+        // pad location string with leading "0"
+        int l = location.length();
+        if (l > 8) return;
+        if (l < 8) {
+            for (int i = 0; i < (8-l); i++) {
+                location = "0" + location;
+            }
+        }
+
+        try {// set LAC/CID or PSC based on radioType
+            switch (radioType) {
+            case NETWORK_TYPE_GPRS:
+            case NETWORK_TYPE_EDGE:
+                mNetworkType = radioType;
+                mLac = Integer.valueOf(location.substring(0, 4), 16);
+                mCid = Integer.valueOf(location.substring(4), 16);
+                break;
+            case NETWORK_TYPE_UMTS:
+            case NETWORK_TYPE_HSDPA:
+            case NETWORK_TYPE_HSUPA:
+            case NETWORK_TYPE_HSPA:
+                mNetworkType = radioType;
+                mPsc = Integer.valueOf(location, 16);
+                break;
+            }
+        } catch (NumberFormatException e) {
+            // parsing location error
+            mPsc = UNKNOWN_CID;
+            mLac = UNKNOWN_CID;
+            mCid = UNKNOWN_CID;
+            mNetworkType = NETWORK_TYPE_UNKNOWN;
+        }
+    }
+
+    /**
      * Initialize the object from a parcel.
      */
     public NeighboringCellInfo(Parcel in) {
         mRssi = in.readInt();
+        mLac = in.readInt();
         mCid = in.readInt();
+        mPsc = in.readInt();
+        mNetworkType = in.readInt();
     }
 
     /**
-     * @return received signal strength in "asu", ranging from 0 - 31,
-     * or UNKNOWN_RSSI if unknown
+     * @return received signal strength or UNKNOWN_RSSI if unknown
      *
-     * For GSM, dBm = -113 + 2*asu,
+     * For GSM, it is in "asu" ranging from 0 to 31 (dBm = -113 + 2*asu)
      * 0 means "-113 dBm or less" and 31 means "-51 dBm or greater"
+     * For UMTS, it is the Level index of CPICH RSCP defined in TS 25.125
      */
     public int getRssi() {
         return mRssi;
     }
 
     /**
-     * @return cell id, UNKNOWN_CID if unknown, 0xffffffff max legal value
+     * @return LAC in GSM, 0xffff max legal value
+     *  UNKNOWN_CID if in UMTS or CMDA or unknown
+     */
+    public int getLac() {
+        return mLac;
+    }
+
+    /**
+     * @return cell id in GSM, 0xffff max legal value
+     *  UNKNOWN_CID if in UMTS or CDMA or unknown
      */
     public int getCid() {
         return mCid;
     }
 
     /**
+     * @return Primary Scrambling Code in 9 bits format in UMTS, 0x1ff max value
+     *  UNKNOWN_CID if in GSM or CMDA or unknown
+     */
+    public int getPsc() {
+        return mPsc;
+    }
+
+    /**
+     * @return Radio network type while neighboring cell location is stored.
+     *
+     * Return {@link TelephonyManager#NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_UNKNOWN}
+     * means that the location information is unavailable.
+     *
+     * Return {@link TelephonyManager#NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_GPRS} or
+     * {@link TelephonyManager#NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_EDGE}
+     * means that Neighboring Cell information is stored for GSM network, in
+     * which {@link NeighboringCellInfo#getLac NeighboringCellInfo.getLac} and
+     * {@link NeighboringCellInfo#getCid NeighboringCellInfo.getCid} should be
+     * called to access location.
+     *
+     * Return {@link TelephonyManager#NETWORK_TYPE_UMTS TelephonyManager.NETWORK_TYPE_UMTS},
+     * {@link TelephonyManager#NETWORK_TYPE_HSDPA TelephonyManager.NETWORK_TYPE_HSDPA},
+     * {@link TelephonyManager#NETWORK_TYPE_HSUPA TelephonyManager.NETWORK_TYPE_HSUPA},
+     * or {@link TelephonyManager#NETWORK_TYPE_HSPA TelephonyManager.NETWORK_TYPE_HSPA}
+     * means that Neighboring Cell information is stored for UMTS network, in
+     * which {@link NeighboringCellInfo#getPsc NeighboringCellInfo.getPsc}
+     * should be called to access location.
+     */
+    public int getNetworkType() {
+        return mNetworkType;
+    }
+    /**
+     * @deprecated
      * Set the cell id.
+     *
+     * NeighboringCellInfo is a one time shot for the neighboring cells based on
+     * the radio network type at that moment. It shouldn't be changed after
+     * creation.
      */
     public void setCid(int cid) {
         mCid = cid;
     }
 
     /**
+     * @deprecated
      * Set the signal strength of the cell.
+     *
+     * NeighboringCellInfo is a one time shot for the neighboring cells based on
+     * the radio network type at that moment. It shouldn't be changed after
+     * creation.
      */
     public void setRssi(int rssi) {
         mRssi = rssi;
@@ -95,8 +246,20 @@
 
     @Override
     public String toString() {
-        return "["+ ((mCid == UNKNOWN_CID) ? "/" : Integer.toHexString(mCid))
-        + " at " + ((mRssi == UNKNOWN_RSSI)? "/" : mRssi) + "]";
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("[");
+        if (mPsc != UNKNOWN_CID) {
+            sb.append(Integer.toHexString(mPsc))
+                    .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
+        } else if(mLac != UNKNOWN_CID && mCid != UNKNOWN_CID) {
+            sb.append(Integer.toHexString(mLac))
+                    .append(Integer.toHexString(mCid))
+                    .append("@").append(((mRssi == UNKNOWN_RSSI)? "-" : mRssi));
+        }
+        sb.append("]");
+
+        return sb.toString();
     }
 
     public int describeContents() {
@@ -105,7 +268,10 @@
 
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeInt(mRssi);
+        dest.writeInt(mLac);
         dest.writeInt(mCid);
+        dest.writeInt(mPsc);
+        dest.writeInt(mNetworkType);
     }
 
     public static final Parcelable.Creator<NeighboringCellInfo> CREATOR
@@ -118,6 +284,4 @@
             return new NeighboringCellInfo[size];
         }
     };
-}
-
-
+}
\ No newline at end of file
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 6664b08..fb96b2a 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -254,13 +254,13 @@
      * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES}
      */
     public List<NeighboringCellInfo> getNeighboringCellInfo() {
-       try {
-           return getITelephony().getNeighboringCellInfo();
-       } catch (RemoteException ex) {
-           return null;
-       } catch (NullPointerException ex) {
-           return null;
-       }
+        try {
+            return getITelephony().getNeighboringCellInfo();
+        } catch (RemoteException ex) {
+            return null;
+        } catch (NullPointerException ex) {
+            return null;
+        }
     }
 
     /** No phone radio. */
diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java
index d1b446b..f3b59a8 100644
--- a/telephony/java/com/android/internal/telephony/RIL.java
+++ b/telephony/java/com/android/internal/telephony/RIL.java
@@ -17,6 +17,14 @@
 package com.android.internal.telephony;
 
 import static com.android.internal.telephony.RILConstants.*;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSUPA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
+
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -30,6 +38,7 @@
 import android.os.Message;
 import android.os.Parcel;
 import android.os.PowerManager;
+import android.os.SystemProperties;
 import android.os.PowerManager.WakeLock;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.PhoneNumberUtils;
@@ -2876,21 +2885,44 @@
 
    private Object
    responseCellList(Parcel p) {
-       int num;
+       int num, rssi;
+       String location;
        ArrayList<NeighboringCellInfo> response;
        NeighboringCellInfo cell;
 
        num = p.readInt();
-       response = new ArrayList<NeighboringCellInfo>(num);
+       response = new ArrayList<NeighboringCellInfo>();
 
-       for (int i = 0 ; i < num ; i++) {
-           int rssi = p.readInt();
-           int cid = Integer.valueOf(p.readString(), 16);
-           cell = new NeighboringCellInfo(rssi, cid);
-           response.add(cell);
+       // Determine the radio access type
+       String radioString = SystemProperties.get(
+               TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE, "unknown");
+       int radioType;
+       if (radioString.equals("GPRS")) {
+           radioType = NETWORK_TYPE_GPRS;
+       } else if (radioString.equals("EDGE")) {
+           radioType = NETWORK_TYPE_EDGE;
+       } else if (radioString.equals("UMTS")) {
+           radioType = NETWORK_TYPE_UMTS;
+       } else if (radioString.equals("HSDPA")) {
+           radioType = NETWORK_TYPE_HSDPA;
+       } else if (radioString.equals("HSUPA")) {
+           radioType = NETWORK_TYPE_HSUPA;
+       } else if (radioString.equals("HSPA")) {
+           radioType = NETWORK_TYPE_HSPA;
+       } else {
+           radioType = NETWORK_TYPE_UNKNOWN;
        }
 
-    return response;
+       // Interpret the location based on radio access type
+       if (radioType != NETWORK_TYPE_UNKNOWN) {
+           for (int i = 0 ; i < num ; i++) {
+               rssi = p.readInt();
+               location = p.readString();
+               cell = new NeighboringCellInfo(rssi, location, radioType);
+               response.add(cell);
+           }
+       }
+       return response;
     }
 
     private Object responseGmsBroadcastConfig(Parcel p) {
diff --git a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java b/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
index 2bdf1dd..7252aa9 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/NeighboringCellInfoTest.java
@@ -15,41 +15,65 @@
  */
 package com.android.unit_tests;
 
+import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.telephony.NeighboringCellInfo;
 import android.test. suitebuilder.annotation.SmallTest;
 
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;
+
 public class NeighboringCellInfoTest extends AndroidTestCase {
     @SmallTest
     public void testConstructor() {
-        NeighboringCellInfo empty = new NeighboringCellInfo();
-        assertEquals(NeighboringCellInfo.UNKNOWN_RSSI, empty.getRssi());
-        assertEquals(NeighboringCellInfo.UNKNOWN_CID, empty.getCid());
-
         int rssi = 31;
-        int cid = 0xffffffff;
-        NeighboringCellInfo max = new NeighboringCellInfo(rssi, cid);
-        assertEquals(rssi, max.getRssi());
-        assertEquals(cid, max.getCid());
-    }
+        NeighboringCellInfo nc;
 
-    @SmallTest
-    public void testGetAndSet() {
-        int rssi = 16;
-        int cid = 0x12345678;
-        NeighboringCellInfo nc = new NeighboringCellInfo();
-        nc.setRssi(rssi);
-        nc.setCid(cid);
+        nc = new NeighboringCellInfo(rssi, "FFFFFFF", NETWORK_TYPE_EDGE);
+        assertEquals(NETWORK_TYPE_EDGE, nc.getNetworkType());
         assertEquals(rssi, nc.getRssi());
-        assertEquals(cid, nc.getCid());
+        assertEquals(0xfff, nc.getLac());
+        assertEquals(0xffff, nc.getCid());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
+
+        nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UMTS);
+        assertEquals(NETWORK_TYPE_UMTS, nc.getNetworkType());
+        assertEquals(rssi, nc.getRssi());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
+        assertEquals(0x1ff, nc.getPsc());
+
+        nc = new NeighboringCellInfo(rssi, "1FF", NETWORK_TYPE_UNKNOWN);
+        assertEquals(NETWORK_TYPE_UNKNOWN, nc.getNetworkType());
+        assertEquals(rssi, nc.getRssi());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getCid());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getLac());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
     }
 
     @SmallTest
-    public void testToString() {
-        NeighboringCellInfo empty = new NeighboringCellInfo();
-        assertEquals("[/ at /]", empty.toString());
+    public void testParcel() {
+        int rssi = 20;
 
-        NeighboringCellInfo nc = new NeighboringCellInfo(16, 0x12345678);
-        assertEquals("[12345678 at 16]", nc.toString());
-    }
+        NeighboringCellInfo nc = new NeighboringCellInfo(rssi, "12345678", NETWORK_TYPE_GPRS);
+        assertEquals(NETWORK_TYPE_GPRS, nc.getNetworkType());
+        assertEquals(rssi, nc.getRssi());
+        assertEquals(0x1234, nc.getLac());
+        assertEquals(0x5678, nc.getCid());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nc.getPsc());
+
+        Parcel p = Parcel.obtain();
+        p.setDataPosition(0);
+        nc.writeToParcel(p, 0);
+
+        p.setDataPosition(0);
+        NeighboringCellInfo nw = new NeighboringCellInfo(p);
+        assertEquals(NETWORK_TYPE_GPRS, nw.getNetworkType());
+        assertEquals(rssi, nw.getRssi());
+        assertEquals(0x1234, nw.getLac());
+        assertEquals(0x5678, nw.getCid());
+        assertEquals(NeighboringCellInfo.UNKNOWN_CID, nw.getPsc());
+     }
 }