Merge "DO NOT MERGE - Updated media transport controls (hdpi and mdpi)" into gingerbread
diff --git a/cmds/servicemanager/service_manager.c b/cmds/servicemanager/service_manager.c
index 22d5b39..a5a1f01 100644
--- a/cmds/servicemanager/service_manager.c
+++ b/cmds/servicemanager/service_manager.c
@@ -34,6 +34,7 @@
     { AID_MEDIA, "media.player" },
     { AID_MEDIA, "media.camera" },
     { AID_MEDIA, "media.audio_policy" },
+    { AID_NFC,   "nfc" },
     { AID_RADIO, "radio.phone" },
     { AID_RADIO, "radio.sms" },
     { AID_RADIO, "radio.phonesubinfo" },
diff --git a/core/java/android/bluetooth/package.html b/core/java/android/bluetooth/package.html
index 5ff240c..9ac42dc 100644
--- a/core/java/android/bluetooth/package.html
+++ b/core/java/android/bluetooth/package.html
@@ -1,7 +1,11 @@
 <HTML>
 <BODY>
-Provides classes that manage Bluetooth functionality, such as scanning for
-devices, connecting with devices, and managing data transfer between devices.
+<p>Provides classes that manage Bluetooth functionality, such as scanning for
+devices, connecting with devices, and managing data transfer between devices.</p>
+
+<p>For a complete guide to using the Bluetooth APIs, see the <a
+href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth</a> developer guide.</p>
+{@more}
 
 <p>The Bluetooth APIs let applications:</p>
 <ul>
@@ -20,9 +24,6 @@
 permission.
 </p>
 
-<p>For a detailed guide to using the Bluetooth APIs, see the <a
-href="{@docRoot}guide/topics/wireless/bluetooth.html">Bluetooth Dev Guide topic</a>.</p>
-
 <p class="note"><strong>Note:</strong>
 Not all Android devices are guaranteed to have Bluetooth functionality.</p>
 </BODY>
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 693be21..0dd2e4a 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -1555,16 +1555,6 @@
     public static final String SIP_SERVICE = "sip";
 
     /**
-     * Use with {@link #getSystemService} to retrieve an
-     * {@link com.trustedlogic.trustednfc.android.INfcManager.INfcManager} for
-     * accessing NFC methods.
-     *
-     * @see #getSystemService
-     * @hide
-     */
-    public static final String NFC_SERVICE = "nfc";
-
-    /**
      * Determine whether the given permission is allowed for a particular
      * process and user ID running in the system.
      *
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index 02b9fb71..b916b34 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -166,10 +166,10 @@
             }
             sIsInitialized = true;
 
-            // TODO(npelly): check which method to use here to get the service
-            IBinder b = ServiceManager.getService(Context.NFC_SERVICE);
+            IBinder b = ServiceManager.getService("nfc");
             if (b == null) {
-                return null;  // This device does not have NFC
+                Log.d(TAG, "NFC Service not available");
+                return null;
             }
 
             sAdapter = new NfcAdapter(INfcAdapter.Stub.asInterface(b));
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index f695dbb..a718fc6 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -86,6 +86,12 @@
     public static final int WIFI_UID = 1010;
 
     /**
+     * Defines the UID/GID for the NFC service process.
+     * @hide
+     */
+    public static final int NFC_UID = 1022;
+
+    /**
      * Defines the start of a range of UIDs (and GIDs), going from this
      * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning
      * to applications.
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index 1895cf8..58ed986 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -16,6 +16,8 @@
 
 package android.os;
 
+import android.util.Log;
+
 /**
  * Class that operates the vibrator on the device.
  * <p>
@@ -23,6 +25,8 @@
  */
 public class Vibrator
 {
+    private static final String TAG = "Vibrator";
+
     IVibratorService mService;
     private final Binder mToken = new Binder();
 
@@ -40,9 +44,14 @@
      */
     public void vibrate(long milliseconds)
     {
+        if (mService == null) {
+            Log.w(TAG, "Failed to vibrate; no vibrator service.");
+            return;
+        }
         try {
             mService.vibrate(milliseconds, mToken);
-        } catch (RemoteException e) {
+        } catch (Exception e) {
+            Log.w(TAG, "Failed to vibrate.", e);
         }
     }
 
@@ -61,13 +70,18 @@
      */
     public void vibrate(long[] pattern, int repeat)
     {
+        if (mService == null) {
+            Log.w(TAG, "Failed to vibrate; no vibrator service.");
+            return;
+        }
         // catch this here because the server will do nothing.  pattern may
         // not be null, let that be checked, because the server will drop it
         // anyway
         if (repeat < pattern.length) {
             try {
                 mService.vibratePattern(pattern, repeat, mToken);
-            } catch (RemoteException e) {
+            } catch (Exception e) {
+                Log.w(TAG, "Failed to vibrate.", e);
             }
         } else {
             throw new ArrayIndexOutOfBoundsException();
@@ -79,9 +93,13 @@
      */
     public void cancel()
     {
+        if (mService == null) {
+            return;
+        }
         try {
             mService.cancelVibrate(mToken);
         } catch (RemoteException e) {
+            Log.w(TAG, "Failed to cancel vibration.", e);
         }
     }
 }
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index a2c80f2..84deeb0 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -71,6 +71,7 @@
     // that if the UI thread posts any messages after the message
     // queue has been cleared,they are ignored.
     private boolean mBlockMessages = false;
+    private int mOrientation = -1;
 
     // Is this frame the main frame?
     private boolean mIsMainFrame;
@@ -473,7 +474,10 @@
             }
 
             case ORIENTATION_CHANGED: {
-                nativeOrientationChanged(msg.arg1);
+                if (mOrientation != msg.arg1) {
+                    mOrientation = msg.arg1;
+                    nativeOrientationChanged(msg.arg1);
+                }
                 break;
             }
 
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index e82ed9f..f7afdb9 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -288,6 +288,21 @@
         return ptr == mNodePointer;
     }
 
+    /**
+     * Ensure that the underlying textfield is lined up with the WebTextView.
+     */
+    private void lineUpScroll() {
+        if (mWebView != null) {
+            float maxScrollX = Touch.getMaxScrollX(this, getLayout(), mScrollY);
+            if (DebugFlags.WEB_TEXT_VIEW) {
+                Log.v(LOGTAG, "onTouchEvent x=" + mScrollX + " y="
+                        + mScrollY + " maxX=" + maxScrollX);
+            }
+            mWebView.scrollFocusedTextInput(maxScrollX > 0 ?
+                    mScrollX / maxScrollX : 0, mScrollY);
+        }
+    }
+
     @Override public InputConnection onCreateInputConnection(
             EditorInfo outAttrs) {
         InputConnection connection = super.onCreateInputConnection(outAttrs);
@@ -359,6 +374,12 @@
     }
 
     @Override
+    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
+        super.onScrollChanged(l, t, oldl, oldt);
+        lineUpScroll();
+    }
+
+    @Override
     protected void onSelectionChanged(int selStart, int selEnd) {
         if (mInSetTextAndKeepSelection) return;
         // This code is copied from TextView.onDraw().  That code does not get
@@ -378,6 +399,7 @@
                         + " selEnd=" + selEnd);
             }
             mWebView.setSelection(selStart, selEnd);
+            lineUpScroll();
         }
     }
 
@@ -481,16 +503,7 @@
             // to big for the case of a small textfield.
             int smallerSlop = slop/2;
             if (dx > smallerSlop || dy > smallerSlop) {
-                if (mWebView != null) {
-                    float maxScrollX = (float) Touch.getMaxScrollX(this,
-                                getLayout(), mScrollY);
-                    if (DebugFlags.WEB_TEXT_VIEW) {
-                        Log.v(LOGTAG, "onTouchEvent x=" + mScrollX + " y="
-                                + mScrollY + " maxX=" + maxScrollX);
-                    }
-                    mWebView.scrollFocusedTextInput(maxScrollX > 0 ?
-                            mScrollX / maxScrollX : 0, mScrollY);
-                }
+                // Scrolling is handled in onScrollChanged.
                 mScrolled = true;
                 cancelLongPress();
                 return true;
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java
index 714b259..1fcd654 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/core/java/com/android/internal/app/ShutdownThread.java
@@ -364,7 +364,7 @@
             // vibrator is asynchronous so we need to wait to avoid shutting down too soon.
             try {
                 Thread.sleep(SHUTDOWN_VIBRATE_MS);
-            } catch (InterruptedException e) {
+            } catch (InterruptedException unused) {
             }
         }
 
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpConnectionlessSocket.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpConnectionlessSocket.java
deleted file mode 100644
index eff01b6..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpConnectionlessSocket.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeLlcpConnectionLessSocket.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-import android.nfc.LlcpPacket;
-
-/**
- * LlcpConnectionlessSocket represents a LLCP Connectionless object to be used
- * in a connectionless communication
- *
- * @since AA02.01
- * @hide
- */
-
-public class NativeLlcpConnectionlessSocket {
-
-    private int mHandle;
-
-    private int mSap;
-
-    private int mLinkMiu;
-
-    public NativeLlcpConnectionlessSocket(){;
-    }
-
-    public NativeLlcpConnectionlessSocket(int sap){
-        mSap = sap;
-    }
-
-    public native boolean doSendTo(int sap, byte[] data);
-
-    public native LlcpPacket doReceiveFrom(int linkMiu);
-
-    public native boolean doClose();
-
-    public int getLinkMiu(){
-        return mLinkMiu;
-    }
-
-    public int getSap(){
-        return mSap;
-    }
-
-    public int getHandle(){
-        return mHandle;
-    }
-
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpServiceSocket.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpServiceSocket.java
deleted file mode 100644
index 079d69b..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpServiceSocket.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeLlcpServerSocket.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-/**
- * LlcpServiceSocket represents a LLCP Service to be used in a
- * Connection-oriented communication
- * {@hide}
- */
-
-public class NativeLlcpServiceSocket {
-
-    private int mHandle;
-
-    private int mLocalMiu;
-
-    private int mLocalRw;
-
-    private int mLocalLinearBufferLength;
-
-    private int mSap;
-
-    private int mTimeout;
-
-    private String mServiceName;
-
-    public NativeLlcpServiceSocket(){
-
-    }
-
-    public NativeLlcpServiceSocket(String serviceName){
-        mServiceName = serviceName;
-    }
-
-    public native NativeLlcpSocket doAccept(int timeout, int miu, int rw, int linearBufferLength);
-
-    public native boolean doClose();
-
-    public int getHandle(){
-        return mHandle;
-    }
-
-    public void setAcceptTimeout(int timeout){
-        mTimeout = timeout;
-    }
-
-    public int getAcceptTimeout(){
-        return mTimeout;
-    }
-
-    public int getRw(){
-        return mLocalRw;
-    }
-
-    public int getMiu(){
-        return mLocalMiu;
-    }
-
-    public int getLinearBufferLength(){
-        return mLocalLinearBufferLength;
-    }
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpSocket.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpSocket.java
deleted file mode 100644
index 818cfaa..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeLlcpSocket.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeLlcpClientSocket.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-/**
- * LlcpClientSocket represents a LLCP Connection-Oriented client to be used in a
- * connection-oriented communication
- * @hide
- */
-
-public class NativeLlcpSocket {
-
-    private int mHandle;
-
-    private int mSap;
-
-    private int mLocalMiu;
-
-    private int mLocalRw;
-
-    private int mTimeout;
-
-    public NativeLlcpSocket(){
-
-    }
-
-    public NativeLlcpSocket(int sap, int miu, int rw){
-        mSap = sap;
-        mLocalMiu = miu;
-        mLocalRw = rw;
-    }
-
-    public native boolean doConnect(int nSap, int timeout);
-
-    public native boolean doConnectBy(String sn, int timeout);
-
-    public native boolean doClose();
-
-    public native boolean doSend(byte[] data);
-
-    public native int doReceive(byte[] recvBuff);
-
-    public native int doGetRemoteSocketMiu();
-
-    public native int doGetRemoteSocketRw();
-
-
-
-    public void setConnectTimeout(int timeout){
-        mTimeout = timeout;
-    }
-
-    public int getConnectTimeout(){
-        return mTimeout;
-    }
-
-    public int getSap(){
-        return mSap;
-    }
-
-    public int getMiu(){
-        return mLocalMiu;
-    }
-
-    public int getRw(){
-        return mLocalRw;
-    }
-
-    public int getHandle(){
-        return mHandle;
-    }
-
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNdefTag.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeNdefTag.java
deleted file mode 100644
index 819b0395..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNdefTag.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeNdefTag.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-/**
- * Native interface to the NDEF tag functions
- *
- * @hide
- */
-public class NativeNdefTag {
-    private int mHandle;
-
-    public native byte[] doRead();
-
-    public native boolean doWrite(byte[] buf);
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcManager.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcManager.java
deleted file mode 100644
index 5ff348a..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcManager.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeNfcManager.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-import android.annotation.SdkConstant;
-import android.annotation.SdkConstant.SdkConstantType;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-import android.nfc.FormatException;
-import android.nfc.NdefTag;
-import android.nfc.NfcAdapter;
-import android.nfc.NdefMessage;
-import android.nfc.Tag;
-
-/**
- * Native interface to the NFC Manager functions
- * @hide
- */
-public class NativeNfcManager {
-
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String INTERNAL_LLCP_LINK_STATE_CHANGED_EXTRA = "com.trustedlogic.trustednfc.android.extra.INTERNAL_LLCP_LINK_STATE";
-
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String INTERNAL_LLCP_LINK_STATE_CHANGED_ACTION = "com.trustedlogic.trustednfc.android.action.INTERNAL_LLCP_LINK_STATE_CHANGED";
-
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String INTERNAL_TARGET_DESELECTED_ACTION = "com.trustedlogic.trustednfc.android.action.INTERNAL_TARGET_DESELECTED";
-
-    /* Native structure */
-    private int mNative;
-
-    private final Context mContext;
-
-    private final Handler mNfcHandler;
-
-    private static final String TAG = "NativeNfcManager";
-
-    private static final int MSG_NDEF_TAG = 0;
-
-    private static final int MSG_CARD_EMULATION = 1;
-
-    private static final int MSG_LLCP_LINK_ACTIVATION = 2;
-
-    private static final int MSG_LLCP_LINK_DEACTIVATED = 3;
-
-    private static final int MSG_TARGET_DESELECTED = 4;
-
-    public NativeNfcManager(Context context) {
-        mNfcHandler = new NfcHandler();
-        mContext = context;
-    }
-
-    /**
-     * Initializes Native structure
-     */
-    public native boolean initializeNativeStructure();
-
-    /**
-     * Initializes NFC stack.
-     */
-    public native boolean initialize();
-
-    /**
-     * Deinitializes NFC stack.
-     */
-    public native boolean deinitialize();
-
-    /**
-     * Enable discory for the NdefMessage and Transaction notification
-     */
-    public native void enableDiscovery(int mode);
-
-    public native void disableDiscovery();
-
-    public native void readerDiscovery();
-
-    /**
-     * Disables an NFCManager mode of operation. Allows to disable tag reader,
-     * peer to peer initiator or target modes.
-     *
-     * @param mode discovery mode to enable. Must be one of the provided
-     *            NFCManager.DISCOVERY_MODE_* constants.
-     */
-    public native void disableDiscoveryMode(int mode);
-
-    public native int[] doGetSecureElementList();
-
-    public native void doSelectSecureElement(int seID);
-
-    public native void doDeselectSecureElement(int seID);
-
-    public native NativeP2pDevice doOpenP2pConnection(int timeout);
-
-    public native NativeNfcTag doOpenTagConnection(int timeout);
-
-    public native int doGetLastError();
-
-    public native void doSetProperties(int param, int value);
-
-    public native void doCancel();
-
-    public native NativeLlcpConnectionlessSocket doCreateLlcpConnectionlessSocket(int nSap);
-
-    public native NativeLlcpServiceSocket doCreateLlcpServiceSocket(int nSap, String sn, int miu,
-            int rw, int linearBufferLength);
-
-    public native NativeLlcpSocket doCreateLlcpSocket(int sap, int miu, int rw,
-            int linearBufferLength);
-
-    public native boolean doCheckLlcp();
-
-    public native boolean doActivateLlcp();
-
-    private class NfcHandler extends Handler {
-
-        private int convertType(String typeName) {
-            if (typeName.equals("Iso14443")) {
-                return Tag.NFC_TAG_ISO14443_4B;
-            } else if (typeName.equals("MifareUL")) {
-                return Tag.NFC_TAG_MIFARE;
-            } else if (typeName.equals("Mifare1K")) {
-                return Tag.NFC_TAG_MIFARE;
-            } else if (typeName.equals("Mifare4K")) {
-                return Tag.NFC_TAG_MIFARE;
-            } else if (typeName.equals("MifareDESFIRE")) {
-                return Tag.NFC_TAG_MIFARE;
-            } else if (typeName.equals("Unknown Mifare")) {
-                return Tag.NFC_TAG_MIFARE;
-            } else if (typeName.equals("Felica")) {
-                return Tag.NFC_TAG_FELICA;
-            } else if (typeName.equals("Jewel")) {
-                return Tag.NFC_TAG_JEWEL;
-            } else {
-                return Tag.NFC_TAG_OTHER;
-            }
-        }
-
-        @Override
-        public void handleMessage(Message msg) {
-
-            try {
-                switch (msg.what) {
-                    case MSG_NDEF_TAG:
-                        Log.d(TAG, "Tag detected, notifying applications");
-                        NativeNfcTag nativeTag = (NativeNfcTag) msg.obj;
-                        if (nativeTag.doConnect()) {
-                            if (nativeTag.checkNDEF()) {
-                                byte[] buff = nativeTag.doRead();
-                                if (buff != null) {
-                                    NdefMessage[] msgNdef = new NdefMessage[1];
-                                    try {
-                                        msgNdef[0] = new NdefMessage(buff);
-                                        NdefTag tag = new NdefTag(convertType(nativeTag.getType()), nativeTag.getUid(), nativeTag.getHandle(), msgNdef);
-                                        Intent intent = new Intent();
-                                        intent.setAction(NfcAdapter.ACTION_NDEF_TAG_DISCOVERED);
-                                        intent.putExtra(NfcAdapter.EXTRA_TAG, tag);
-                                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                                        Log.d(TAG, "NDEF tag found, starting corresponding activity");
-                                        try {
-                                            mContext.startActivity(intent);
-                                        } catch (ActivityNotFoundException e) {
-                                            Log.w(TAG, "No activity found, disconnecting");
-                                            nativeTag.doAsyncDisconnect();
-                                        }
-                                    } catch (FormatException e) {
-                                        Log.w(TAG, "Unable to create NDEF message object (tag empty or not well formated)");
-                                        nativeTag.doAsyncDisconnect();
-                                    }
-                                } else {
-                                    Log.w(TAG, "Unable to read NDEF message (tag empty or not well formated)");
-                                    nativeTag.doAsyncDisconnect();
-                                }
-                            } else {
-                                Intent intent = new Intent();
-                                Tag tag = new Tag(convertType(nativeTag.getType()), false, nativeTag.getUid(), nativeTag.getHandle());
-                                intent.setAction(NfcAdapter.ACTION_TAG_DISCOVERED);
-                                intent.putExtra(NfcAdapter.EXTRA_TAG, tag);
-                                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                                Log.d(TAG, "Non-NDEF tag found, starting corresponding activity");
-                                try {
-                                    mContext.startActivity(intent);
-                                } catch (ActivityNotFoundException e) {
-                                    Log.w(TAG, "No activity found, disconnecting");
-                                    nativeTag.doAsyncDisconnect();
-                                }
-                            }
-                        } else {
-                            Log.w(TAG, "Failed to connect to tag");
-                            nativeTag.doAsyncDisconnect();
-                        }
-                        break;
-                    case MSG_CARD_EMULATION:
-                        Log.d(TAG, "Card Emulation message");
-                        byte[] aid = (byte[]) msg.obj;
-                        /* Send broadcast ordered */
-                        Intent TransactionIntent = new Intent();
-                        TransactionIntent.setAction(NfcAdapter.ACTION_TRANSACTION_DETECTED);
-                        TransactionIntent.putExtra(NfcAdapter.EXTRA_AID, aid);
-                        Log.d(TAG, "Broadcasting Card Emulation event");
-                        mContext.sendOrderedBroadcast(TransactionIntent,
-                                android.Manifest.permission.NFC_NOTIFY);
-                        break;
-
-                    case MSG_LLCP_LINK_ACTIVATION:
-                        NativeP2pDevice device = (NativeP2pDevice) msg.obj;
-
-                        Log.d(TAG, "LLCP Activation message");
-
-                        if (device.getMode() == NativeP2pDevice.MODE_P2P_TARGET) {
-                            if (device.doConnect()) {
-                                /* Check Llcp compliancy */
-                                if (doCheckLlcp()) {
-                                    /* Activate Llcp Link */
-                                    if (doActivateLlcp()) {
-                                        Log.d(TAG, "Initiator Activate LLCP OK");
-                                        /* Broadcast Intent Link LLCP activated */
-                                        Intent LlcpLinkIntent = new Intent();
-                                        LlcpLinkIntent
-                                                .setAction(INTERNAL_LLCP_LINK_STATE_CHANGED_ACTION);
-                                        LlcpLinkIntent.putExtra(
-                                                INTERNAL_LLCP_LINK_STATE_CHANGED_EXTRA,
-                                                NfcAdapter.LLCP_LINK_STATE_ACTIVATED);
-                                        Log.d(TAG, "Broadcasting internal LLCP activation");
-                                        mContext.sendBroadcast(LlcpLinkIntent);
-                                    }
-
-                                } else {
-                                    device.doDisconnect();
-                                }
-
-                            }
-
-                        } else if (device.getMode() == NativeP2pDevice.MODE_P2P_INITIATOR) {
-                            /* Check Llcp compliancy */
-                            if (doCheckLlcp()) {
-                                /* Activate Llcp Link */
-                                if (doActivateLlcp()) {
-                                    Log.d(TAG, "Target Activate LLCP OK");
-                                    /* Broadcast Intent Link LLCP activated */
-                                    Intent LlcpLinkIntent = new Intent();
-                                    LlcpLinkIntent
-                                            .setAction(INTERNAL_LLCP_LINK_STATE_CHANGED_ACTION);
-                                    LlcpLinkIntent.putExtra(INTERNAL_LLCP_LINK_STATE_CHANGED_EXTRA,
-                                            NfcAdapter.LLCP_LINK_STATE_ACTIVATED);
-                                    Log.d(TAG, "Broadcasting internal LLCP activation");
-                                    mContext.sendBroadcast(LlcpLinkIntent);
-                                }
-                            }
-                        }
-                        break;
-
-                    case MSG_LLCP_LINK_DEACTIVATED:
-                        /* Broadcast Intent Link LLCP activated */
-                        Log.d(TAG, "LLCP Link Deactivated message");
-                        Intent LlcpLinkIntent = new Intent();
-                        LlcpLinkIntent.setAction(NfcAdapter.ACTION_LLCP_LINK_STATE_CHANGED);
-                        LlcpLinkIntent.putExtra(NfcAdapter.EXTRA_LLCP_LINK_STATE_CHANGED,
-                                NfcAdapter.LLCP_LINK_STATE_DEACTIVATED);
-                        Log.d(TAG, "Broadcasting LLCP deactivation");
-                        mContext.sendOrderedBroadcast(LlcpLinkIntent,
-                                android.Manifest.permission.NFC_LLCP);
-                        break;
-
-                    case MSG_TARGET_DESELECTED:
-                        /* Broadcast Intent Target Deselected */
-                        Log.d(TAG, "Target Deselected");
-                        Intent TargetDeselectedIntent = new Intent();
-                        TargetDeselectedIntent.setAction(INTERNAL_TARGET_DESELECTED_ACTION);
-                        Log.d(TAG, "Broadcasting Intent");
-                        mContext.sendOrderedBroadcast(TargetDeselectedIntent,
-                                android.Manifest.permission.NFC_LLCP);
-                        break;
-
-                    default:
-                        Log.e(TAG, "Unknown message received");
-                        break;
-                }
-            } catch (Exception e) {
-                // Log, don't crash!
-                Log.e(TAG, "Exception in NfcHandler.handleMessage:", e);
-            }
-        }
-    };
-
-    /**
-     * Notifies Ndef Message
-     */
-    private void notifyNdefMessageListeners(NativeNfcTag tag) {
-        Message msg = mNfcHandler.obtainMessage();
-
-        msg.what = MSG_NDEF_TAG;
-        msg.obj = tag;
-
-        mNfcHandler.sendMessage(msg);
-    }
-
-    /**
-     * Notifies transaction
-     */
-    private void notifyTargetDeselected() {
-        Message msg = mNfcHandler.obtainMessage();
-
-        msg.what = MSG_TARGET_DESELECTED;
-
-        mNfcHandler.sendMessage(msg);
-    }
-
-    /**
-     * Notifies transaction
-     */
-    private void notifyTransactionListeners(byte[] aid) {
-        Message msg = mNfcHandler.obtainMessage();
-
-        msg.what = MSG_CARD_EMULATION;
-        msg.obj = aid;
-
-        mNfcHandler.sendMessage(msg);
-    }
-
-    /**
-     * Notifies P2P Device detected, to activate LLCP link
-     */
-    private void notifyLlcpLinkActivation(NativeP2pDevice device) {
-        Message msg = mNfcHandler.obtainMessage();
-
-        msg.what = MSG_LLCP_LINK_ACTIVATION;
-        msg.obj = device;
-
-        mNfcHandler.sendMessage(msg);
-    }
-
-    /**
-     * Notifies P2P Device detected, to activate LLCP link
-     */
-    private void notifyLlcpLinkDeactivated() {
-        Message msg = mNfcHandler.obtainMessage();
-
-        msg.what = MSG_LLCP_LINK_DEACTIVATED;
-
-        mNfcHandler.sendMessage(msg);
-    }
-
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcTag.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcTag.java
deleted file mode 100644
index 47cf45b..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeNfcTag.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeNfcTag.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-/**
- * Native interface to the NFC tag functions
- *
- * @hide
- */
-public class NativeNfcTag {
-    private int mHandle;
-
-    private String mType;
-
-    private byte[] mUid;
-
-    public native boolean doConnect();
-
-    public native boolean doDisconnect();
-
-    public native void doAsyncDisconnect();
-
-    public native byte[] doTransceive(byte[] data);
-
-    public native boolean checkNDEF();
-
-    public native byte[] doRead();
-
-    public native boolean doWrite(byte[] buf);
-
-    private NativeNfcTag() {
-    }
-
-    public NativeNfcTag(int handle, String type, byte[] uid) {
-        mHandle = handle;
-        mType = type;
-        mUid = uid.clone();
-    }
-
-    public int getHandle() {
-        return mHandle;
-    }
-
-    public String getType() {
-        return mType;
-    }
-
-    public byte[] getUid() {
-        return mUid;
-    }
-}
diff --git a/core/java/com/trustedlogic/trustednfc/android/internal/NativeP2pDevice.java b/core/java/com/trustedlogic/trustednfc/android/internal/NativeP2pDevice.java
deleted file mode 100644
index c674309..0000000
--- a/core/java/com/trustedlogic/trustednfc/android/internal/NativeP2pDevice.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-/**
- * File            : NativeP2pDevice.java
- * Original-Author : Trusted Logic S.A. (Sylvain Fonteneau)
- * Created         : 18-02-2010
- */
-
-package com.trustedlogic.trustednfc.android.internal;
-
-/**
- * Native interface to the P2P Initiator functions
- *
- * @hide
- */
-public class NativeP2pDevice {
-
-    /**
-    * Peer-to-Peer Target.
-    */
-    public static final short MODE_P2P_TARGET          = 0x00;
-
-    /**
-    * Peer-to-Peer Initiator.
-    */
-    public static final short MODE_P2P_INITIATOR       = 0x01;
-
-    /**
-    * Invalid target type.
-    */
-    public static final short MODE_INVALID             = 0xff;
-
-    private int mHandle;
-
-    private int mMode;
-
-    private byte[] mGeneralBytes;
-
-    public native byte[] doReceive();
-
-    public native boolean doSend(byte[] data);
-
-    public native boolean doConnect();
-
-    public native boolean doDisconnect();
-
-    public native byte[] doTransceive(byte[] data);
-
-    public int getHandle() {
-        return mHandle;
-    }
-
-    public int getMode() {
-        return mMode;
-    }
-
-    public byte[] getGeneralBytes() {
-        return mGeneralBytes;
-    }
-
-}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index d51c0b7..c3f393d 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -67,6 +67,8 @@
 	android_net_TrafficStats.cpp \
 	android_net_wifi_Wifi.cpp \
 	android_nio_utils.cpp \
+	android_nfc_NdefMessage.cpp \
+	android_nfc_NdefRecord.cpp \
 	android_pim_EventRecurrence.cpp \
 	android_text_format_Time.cpp \
 	android_security_Md5MessageDigest.cpp \
@@ -190,15 +192,8 @@
 	libicui18n \
 	libmedia \
 	libwpa_client \
-	libjpeg
-
-ifeq ($(BOARD_HAVE_NFC),true)
-LOCAL_SHARED_LIBRARIES += \
-	libnfc_jni \
-	libnfc
-
-LOCAL_CFLAGS += -DHAVE_NFC
-endif
+	libjpeg \
+	libnfc_ndef
 
 ifeq ($(BOARD_HAVE_BLUETOOTH),true)
 LOCAL_C_INCLUDES += \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5f73443..648d93f 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -125,6 +125,8 @@
 extern int register_android_database_SQLiteStatement(JNIEnv* env);
 extern int register_android_debug_JNITest(JNIEnv* env);
 extern int register_android_nio_utils(JNIEnv* env);
+extern int register_android_nfc_NdefMessage(JNIEnv *env);
+extern int register_android_nfc_NdefRecord(JNIEnv *env);
 extern int register_android_pim_EventRecurrence(JNIEnv* env);
 extern int register_android_text_format_Time(JNIEnv* env);
 extern int register_android_os_Debug(JNIEnv* env);
@@ -169,18 +171,6 @@
 extern int register_android_content_res_ObbScanner(JNIEnv* env);
 extern int register_android_content_res_Configuration(JNIEnv* env);
 
-#ifdef HAVE_NFC
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeNfcManager(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeNfcTag(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeNdefTag(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_NdefMessage(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_NdefRecord(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeP2pDevice(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeLlcpSocket(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeLlcpConnectionlessSocket(JNIEnv *env);
-extern int register_com_trustedlogic_trustednfc_android_internal_NativeLlcpServiceSocket(JNIEnv *env);
-#endif
-
 static AndroidRuntime* gCurRuntime = NULL;
 
 static void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
@@ -1263,6 +1253,8 @@
     REG_JNI(register_android_net_NetworkUtils),
     REG_JNI(register_android_net_TrafficStats),
     REG_JNI(register_android_net_wifi_WifiManager),
+    REG_JNI(register_android_nfc_NdefMessage),
+    REG_JNI(register_android_nfc_NdefRecord),
     REG_JNI(register_android_os_MemoryFile),
     REG_JNI(register_com_android_internal_os_ZygoteInit),
     REG_JNI(register_android_hardware_Camera),
@@ -1297,18 +1289,6 @@
 
     REG_JNI(register_android_content_res_ObbScanner),
     REG_JNI(register_android_content_res_Configuration),
-
-#ifdef HAVE_NFC
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeNfcManager),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeNfcTag),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeNdefTag),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_NdefMessage),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_NdefRecord),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeP2pDevice),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeLlcpSocket),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeLlcpConnectionlessSocket),
-    REG_JNI(register_com_trustedlogic_trustednfc_android_internal_NativeLlcpServiceSocket),
-#endif
 };
 
 /*
diff --git a/core/jni/android_nfc.h b/core/jni/android_nfc.h
new file mode 100644
index 0000000..df660f2
--- /dev/null
+++ b/core/jni/android_nfc.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 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
+ *
+ *      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
+ * limitations under the License.
+ */
+
+/*
+ * Contains the bare minimum header so that framework NFC jni can link
+ * against NFC native library
+ */
+
+#ifndef __ANDROID_NFC_H__
+#define __ANDROID_NFC_H__
+
+extern "C" {
+
+typedef struct phFriNfc_NdefRecord {
+    uint8_t                 Flags;
+    uint8_t                 Tnf;
+    uint8_t                 TypeLength;
+    uint8_t                *Type;
+    uint8_t                 IdLength;
+    uint8_t                *Id;
+    uint32_t                PayloadLength;
+    uint8_t                *PayloadData;
+} phFriNfc_NdefRecord_t;
+
+uint16_t phFriNfc_NdefRecord_GetRecords(uint8_t*      pBuffer,
+                                        uint32_t      BufferLength,
+                                        uint8_t*      pRawRecords[ ],
+                                        uint8_t       IsChunked[ ],
+                                        uint32_t*     pNumberOfRawRecords
+                                        );
+uint16_t phFriNfc_NdefRecord_Parse(phFriNfc_NdefRecord_t* pRecord,
+                                   uint8_t*               pRawRecord);
+
+uint16_t phFriNfc_NdefRecord_Generate(phFriNfc_NdefRecord_t*  pRecord,
+                                      uint8_t*                pBuffer,
+                                      uint32_t                MaxBufferSize,
+                                      uint32_t*               pBytesWritten
+                                      );
+}
+
+#endif
diff --git a/core/jni/android_nfc_NdefMessage.cpp b/core/jni/android_nfc_NdefMessage.cpp
new file mode 100644
index 0000000..99295f4
--- /dev/null
+++ b/core/jni/android_nfc_NdefMessage.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2010 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
+ *
+ *      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
+ * limitations under the License.
+ */
+
+#define LOG_TAG "NdefMessage"
+
+#include "jni.h"
+#include "JNIHelp.h"
+
+#include "android_nfc.h"
+
+#include <utils/Log.h>
+
+namespace android {
+
+static jint android_nfc_NdefMessage_parseNdefMessage(JNIEnv *e, jobject o,
+        jbyteArray array)
+{
+    uint16_t status;
+    uint32_t i;
+    jbyte *raw_msg;
+    jsize raw_msg_size;
+    uint32_t num_of_records = 0;
+    uint8_t **records = NULL;
+    uint8_t *is_chunked = NULL;
+    jint ret = -1;
+    phFriNfc_NdefRecord_t record;
+
+    jclass record_cls;
+    jobjectArray records_array;
+    jmethodID ctor;
+
+    jclass msg_cls;
+    jfieldID mrecords;
+
+    raw_msg_size = e->GetArrayLength(array);
+    raw_msg = e->GetByteArrayElements(array, NULL);
+    if (raw_msg == NULL)
+        return -1;
+
+    /* Get the number of records in the message so we can allocate buffers */
+    LOGD("phFriNfc_NdefRecord_GetRecords(NULL)");
+
+    status = phFriNfc_NdefRecord_GetRecords((uint8_t *)raw_msg,
+            (uint32_t)raw_msg_size, NULL, NULL, &num_of_records);
+
+    if (status) {
+        LOGE("phFriNfc_NdefRecord_GetRecords(NULL) returned 0x%04x", status);
+        goto end;
+    }
+    LOGD("phFriNfc_NdefRecord_GetRecords(NULL) returned 0x%04x", status);
+
+    LOGD("found %d records in message", num_of_records);
+
+    is_chunked = (uint8_t*)malloc(num_of_records);
+    if (is_chunked == NULL)
+        goto end;
+    records = (uint8_t**)malloc(num_of_records * sizeof(uint8_t *));
+    if (records == NULL)
+        goto end;
+
+    /* Now, actually retrieve records position in message */
+    LOGD("phFriNfc_NdefRecord_GetRecords()");
+
+    status = phFriNfc_NdefRecord_GetRecords((uint8_t *)raw_msg,
+            (uint32_t)raw_msg_size, records, is_chunked, &num_of_records);
+
+    if (status) {
+        LOGE("phFriNfc_NdefRecord_GetRecords() returned 0x%04x", status);
+        goto end;
+    }
+    LOGD("phFriNfc_NdefRecord_GetRecords() returned 0x%04x", status);
+
+    /* Build NDEF records array */
+    record_cls = e->FindClass("android/nfc/NdefRecord");
+    records_array = e->NewObjectArray((jsize)num_of_records, record_cls,
+            NULL);
+    if (records_array == NULL)
+        goto end;
+
+    ctor = e->GetMethodID(record_cls, "<init>", "(S[B[B[B)V");
+
+    LOGD("NFC_Number of records = %d\n", num_of_records);
+
+    for (i = 0; i < num_of_records; i++) {
+        jbyteArray type, id, payload;
+        jobject new_record;
+
+        LOGD("phFriNfc_NdefRecord_Parse()");
+
+        status = phFriNfc_NdefRecord_Parse(&record, records[i]);
+
+        if (status) {
+            LOGE("phFriNfc_NdefRecord_Parse() returned 0x%04x", status);
+            goto end;
+        }
+        LOGD("phFriNfc_NdefRecord_Parse() returned 0x%04x", status);
+
+        type = e->NewByteArray(record.TypeLength);
+        if (type == NULL) {
+            LOGD("NFC_Set Record Type Error\n");
+            goto end;
+        }
+
+        id = e->NewByteArray(record.IdLength);
+        if(id == NULL) {
+            LOGD("NFC_Set Record ID Error\n");
+            goto end;
+        }
+
+        payload = e->NewByteArray(record.PayloadLength);
+        if(payload == NULL) {
+            LOGD("NFC_Set Record Payload Error\n");
+            goto end;
+        }
+
+        e->SetByteArrayRegion(type, 0, record.TypeLength,
+                (jbyte *)record.Type);
+        e->SetByteArrayRegion(id, 0, record.IdLength,
+                (jbyte *)record.Id);
+        e->SetByteArrayRegion(payload, 0, record.PayloadLength,
+                (jbyte *)record.PayloadData);
+
+        new_record = e->NewObject(record_cls, ctor,
+                (jshort)record.Tnf, type, id, payload);
+
+        e->SetObjectArrayElement(records_array, i, new_record);
+
+        /* Try not to clutter the Java stack too much */
+        e->DeleteLocalRef(new_record);
+        e->DeleteLocalRef(type);
+        e->DeleteLocalRef(id);
+        e->DeleteLocalRef(payload);
+    }
+
+    /* Store built array in our NDEFMessage instance */
+    msg_cls = e->GetObjectClass(o);
+    mrecords = e->GetFieldID(msg_cls, "mRecords", "[Landroid/nfc/NdefRecord;");
+
+    e->SetObjectField(o, mrecords, (jobject)records_array);
+
+    ret = 0;
+
+end:
+    if(is_chunked)
+        free(is_chunked);
+    if(records)
+        free(records);
+    e->ReleaseByteArrayElements(array, raw_msg, JNI_ABORT);
+
+    return ret;
+}
+
+static JNINativeMethod gMethods[] = {
+        {"parseNdefMessage", "([B)I", (void *)android_nfc_NdefMessage_parseNdefMessage},
+};
+
+int register_android_nfc_NdefMessage(JNIEnv *e)
+{
+    return jniRegisterNativeMethods(e, "android/nfc/NdefMessage", gMethods, NELEM(gMethods));
+}
+
+} // namespace android
diff --git a/core/jni/android_nfc_NdefRecord.cpp b/core/jni/android_nfc_NdefRecord.cpp
new file mode 100644
index 0000000..8ce1837
--- /dev/null
+++ b/core/jni/android_nfc_NdefRecord.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2010 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
+ *
+ *      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
+ * limitations under the License.
+ */
+
+#define LOG_TAG "NdefRecord"
+
+#include "jni.h"
+#include "JNIHelp.h"
+
+#include "android_nfc.h"
+
+#include <utils/Log.h>
+
+namespace android {
+
+static jbyteArray android_nfc_NdefRecord_generate(
+        JNIEnv *e, jobject o, jshort flags, jshort tnf, jbyteArray type,
+        jbyteArray id, jbyteArray payload)
+{
+    uint32_t status;
+    phFriNfc_NdefRecord_t record;
+    uint32_t buf_size;
+    uint32_t record_size;
+    uint8_t *buf = NULL;
+    jbyteArray result = NULL;
+
+    /* Prepare NDEF record structure */
+    record.Flags = (uint8_t)flags;
+    record.Tnf = (uint8_t)tnf;
+    record.TypeLength = (uint32_t)e->GetArrayLength(type);
+    record.Type = (uint8_t *)e->GetByteArrayElements(type, NULL);
+    record.IdLength = (uint32_t)e->GetArrayLength(id);
+    record.Id = (uint8_t *)e->GetByteArrayElements(id, NULL);
+    record.PayloadLength = (uint32_t)e->GetArrayLength(payload);
+    record.PayloadData = (uint8_t *)e->GetByteArrayElements(payload, NULL);
+
+    buf_size = record.PayloadLength + record.IdLength + record.TypeLength + 8;
+
+    buf = (uint8_t*)malloc(buf_size);
+    if (buf == NULL)
+        goto end;
+
+    LOGD("phFriNfc_NdefRecord_Generate()");
+
+    status = phFriNfc_NdefRecord_Generate(&record, buf, buf_size,
+            &record_size);
+
+    if (status) {
+        LOGE("phFriNfc_NdefRecord_Generate() returned 0x%04x", status);
+        goto end;
+    }
+    LOGD("phFriNfc_NdefRecord_Generate() returned 0x%04x", status);
+
+    result = e->NewByteArray(record_size);
+    if (result == NULL)
+        goto end;
+
+    e->SetByteArrayRegion(result, 0, record_size, (jbyte *)buf);
+
+end:
+    e->ReleaseByteArrayElements(type, (jbyte *)record.Type, JNI_ABORT);
+    e->ReleaseByteArrayElements(id, (jbyte *)record.Id, JNI_ABORT);
+    e->ReleaseByteArrayElements(payload, (jbyte *)record.PayloadData, JNI_ABORT);
+
+    if(buf)
+        free(buf);
+
+    return result;
+}
+
+static JNINativeMethod gMethods[] = {
+    {"generate", "(SS[B[B[B)[B", (void *)android_nfc_NdefRecord_generate},
+};
+
+int register_android_nfc_NdefRecord(JNIEnv *e)
+{
+    return jniRegisterNativeMethods(e, "android/nfc/NdefRecord", gMethods, NELEM(gMethods));
+}
+
+} // namespace android
diff --git a/docs/html/guide/topics/providers/content-providers.jd b/docs/html/guide/topics/providers/content-providers.jd
index 2aed5e1..2a84c26 100644
--- a/docs/html/guide/topics/providers/content-providers.jd
+++ b/docs/html/guide/topics/providers/content-providers.jd
@@ -838,8 +838,8 @@
 </p>
 
 <pre>
-&lt;provider name="com.example.autos.AutoInfoProvider"
-          authorities="com.example.autos.autoinfoprovider" 
+&lt;provider android:name="com.example.autos.AutoInfoProvider"
+          android:authorities="com.example.autos.autoinfoprovider" 
           . . . /&gt
 &lt;/provider&gt;
 </pre>
@@ -891,8 +891,8 @@
 (reduced to lowercase) to ensure uniqueness.  The authority is declared in 
 the {@code &lt;provider&gt;} element's {@code authorities} attribute:</p>
 
-<pre>&lt;provider name=".TransportationProvider"
-          authorities="com.example.transportationprovider"
+<pre>&lt;provider android:name=".TransportationProvider"
+          android:authorities="com.example.transportationprovider"
           . . .  &gt;</pre></li>
 
 <li><p>The path that the content provider uses to determine what kind of data is
diff --git a/docs/html/guide/topics/wireless/bluetooth.jd b/docs/html/guide/topics/wireless/bluetooth.jd
index fa2875b..98b6e7d 100644
--- a/docs/html/guide/topics/wireless/bluetooth.jd
+++ b/docs/html/guide/topics/wireless/bluetooth.jd
@@ -9,7 +9,7 @@
     <li>Android's bluetooth APIs allow your application to perform wireless data transactions with
 other devices</li>
   </ul>
-  
+
   <h2>In this document</h2>
   <ol>
     <li><a href="#TheBasics">The Basics</a></li>
@@ -32,7 +32,7 @@
     </li>
     <li><a href="#ManagingAConnection">Managing a Connection</a></li>
   </ol>
-  
+
   <h2>Key classes</h2>
   <ol>
     <li>{@link android.bluetooth.BluetoothAdapter}</li>
@@ -289,7 +289,7 @@
 of paired devices to see if the desired device is already known. To do so,
 call {@link android.bluetooth.BluetoothAdapter#getBondedDevices()}. This
 will return a Set of {@link android.bluetooth.BluetoothDevice}s representing
-paired devices. For example, you can query all paired devices and then add then
+paired devices. For example, you can query all paired devices and then
 show the name of each device to the user, using an ArrayAdapter:</p>
 <pre>
 Set&lt;BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h
index c15e382..923cdbf 100644
--- a/include/ui/InputReader.h
+++ b/include/ui/InputReader.h
@@ -571,31 +571,36 @@
 
     // Immutable calibration parameters in parsed form.
     struct Calibration {
-        // Touch Area
-        enum TouchAreaCalibration {
-            TOUCH_AREA_CALIBRATION_DEFAULT,
-            TOUCH_AREA_CALIBRATION_NONE,
-            TOUCH_AREA_CALIBRATION_GEOMETRIC,
-            TOUCH_AREA_CALIBRATION_PRESSURE,
+        // Touch Size
+        enum TouchSizeCalibration {
+            TOUCH_SIZE_CALIBRATION_DEFAULT,
+            TOUCH_SIZE_CALIBRATION_NONE,
+            TOUCH_SIZE_CALIBRATION_GEOMETRIC,
+            TOUCH_SIZE_CALIBRATION_PRESSURE,
         };
 
-        TouchAreaCalibration touchAreaCalibration;
+        TouchSizeCalibration touchSizeCalibration;
 
-        // Tool Area
-        enum ToolAreaCalibration {
-            TOOL_AREA_CALIBRATION_DEFAULT,
-            TOOL_AREA_CALIBRATION_NONE,
-            TOOL_AREA_CALIBRATION_GEOMETRIC,
-            TOOL_AREA_CALIBRATION_LINEAR,
+        // Tool Size
+        enum ToolSizeCalibration {
+            TOOL_SIZE_CALIBRATION_DEFAULT,
+            TOOL_SIZE_CALIBRATION_NONE,
+            TOOL_SIZE_CALIBRATION_GEOMETRIC,
+            TOOL_SIZE_CALIBRATION_LINEAR,
+            TOOL_SIZE_CALIBRATION_AREA,
         };
 
-        ToolAreaCalibration toolAreaCalibration;
-        bool haveToolAreaLinearScale;
-        float toolAreaLinearScale;
-        bool haveToolAreaLinearBias;
-        float toolAreaLinearBias;
-        bool haveToolAreaIsSummed;
-        int32_t toolAreaIsSummed;
+        ToolSizeCalibration toolSizeCalibration;
+        bool haveToolSizeLinearScale;
+        float toolSizeLinearScale;
+        bool haveToolSizeLinearBias;
+        float toolSizeLinearBias;
+        bool haveToolSizeAreaScale;
+        float toolSizeAreaScale;
+        bool haveToolSizeAreaBias;
+        float toolSizeAreaBias;
+        bool haveToolSizeIsSummed;
+        int32_t toolSizeIsSummed;
 
         // Pressure
         enum PressureCalibration {
@@ -671,8 +676,10 @@
 
         float geometricScale;
 
-        float toolAreaLinearScale;
-        float toolAreaLinearBias;
+        float toolSizeLinearScale;
+        float toolSizeLinearBias;
+        float toolSizeAreaScale;
+        float toolSizeAreaBias;
 
         float pressureScale;
 
@@ -691,11 +698,11 @@
             bool haveSize;
             InputDeviceInfo::MotionRange size;
 
-            bool haveTouchArea;
+            bool haveTouchSize;
             InputDeviceInfo::MotionRange touchMajor;
             InputDeviceInfo::MotionRange touchMinor;
 
-            bool haveToolArea;
+            bool haveToolSize;
             InputDeviceInfo::MotionRange toolMajor;
             InputDeviceInfo::MotionRange toolMinor;
 
diff --git a/include/utils/Looper.h b/include/utils/Looper.h
index cc51490..eefff31 100644
--- a/include/utils/Looper.h
+++ b/include/utils/Looper.h
@@ -24,10 +24,10 @@
 
 #include <android/looper.h>
 
-// Currently using poll() instead of epoll_wait() since it does a better job of meeting a
-// timeout deadline.  epoll_wait() typically causes additional delays of up to 10ms
-// beyond the requested timeout.
-//#define LOOPER_USES_EPOLL
+// When defined, uses epoll_wait() for polling, otherwise uses poll().
+#define LOOPER_USES_EPOLL
+
+// When defined, logs performance statistics for tuning and debugging purposes.
 //#define LOOPER_STATISTICS
 
 #ifdef LOOPER_USES_EPOLL
diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp
index 0560bb8..ce0d880 100644
--- a/libs/ui/InputReader.cpp
+++ b/libs/ui/InputReader.cpp
@@ -1246,14 +1246,14 @@
                     mLocked.orientedRanges.size);
         }
 
-        if (mLocked.orientedRanges.haveTouchArea) {
+        if (mLocked.orientedRanges.haveTouchSize) {
             info->addMotionRange(AINPUT_MOTION_RANGE_TOUCH_MAJOR,
                     mLocked.orientedRanges.touchMajor);
             info->addMotionRange(AINPUT_MOTION_RANGE_TOUCH_MINOR,
                     mLocked.orientedRanges.touchMinor);
         }
 
-        if (mLocked.orientedRanges.haveToolArea) {
+        if (mLocked.orientedRanges.haveToolSize) {
             info->addMotionRange(AINPUT_MOTION_RANGE_TOOL_MAJOR,
                     mLocked.orientedRanges.toolMajor);
             info->addMotionRange(AINPUT_MOTION_RANGE_TOOL_MINOR,
@@ -1277,8 +1277,21 @@
         dumpRawAxes(dump);
         dumpCalibration(dump);
         dumpSurfaceLocked(dump);
-        dump.appendFormat(INDENT3 "XPrecision: %0.3f\n", mLocked.xPrecision);
-        dump.appendFormat(INDENT3 "YPrecision: %0.3f\n", mLocked.yPrecision);
+        dump.appendFormat(INDENT3 "Translation and Scaling Factors:");
+        dump.appendFormat(INDENT4 "XOrigin: %d\n", mLocked.xOrigin);
+        dump.appendFormat(INDENT4 "YOrigin: %d\n", mLocked.yOrigin);
+        dump.appendFormat(INDENT4 "XScale: %0.3f\n", mLocked.xScale);
+        dump.appendFormat(INDENT4 "YScale: %0.3f\n", mLocked.yScale);
+        dump.appendFormat(INDENT4 "XPrecision: %0.3f\n", mLocked.xPrecision);
+        dump.appendFormat(INDENT4 "YPrecision: %0.3f\n", mLocked.yPrecision);
+        dump.appendFormat(INDENT4 "GeometricScale: %0.3f\n", mLocked.geometricScale);
+        dump.appendFormat(INDENT4 "ToolSizeLinearScale: %0.3f\n", mLocked.toolSizeLinearScale);
+        dump.appendFormat(INDENT4 "ToolSizeLinearBias: %0.3f\n", mLocked.toolSizeLinearBias);
+        dump.appendFormat(INDENT4 "ToolSizeAreaScale: %0.3f\n", mLocked.toolSizeAreaScale);
+        dump.appendFormat(INDENT4 "ToolSizeAreaBias: %0.3f\n", mLocked.toolSizeAreaBias);
+        dump.appendFormat(INDENT4 "PressureScale: %0.3f\n", mLocked.pressureScale);
+        dump.appendFormat(INDENT4 "SizeScale: %0.3f\n", mLocked.sizeScale);
+        dump.appendFormat(INDENT4 "OrientationSCale: %0.3f\n", mLocked.orientationScale);
     } // release lock
 }
 
@@ -1298,8 +1311,8 @@
 
     mLocked.orientedRanges.havePressure = false;
     mLocked.orientedRanges.haveSize = false;
-    mLocked.orientedRanges.haveTouchArea = false;
-    mLocked.orientedRanges.haveToolArea = false;
+    mLocked.orientedRanges.haveTouchSize = false;
+    mLocked.orientedRanges.haveToolSize = false;
     mLocked.orientedRanges.haveOrientation = false;
 }
 
@@ -1428,8 +1441,8 @@
         float diagonalSize = pythag(width, height);
 
         // TouchMajor and TouchMinor factors.
-        if (mCalibration.touchAreaCalibration != Calibration::TOUCH_AREA_CALIBRATION_NONE) {
-            mLocked.orientedRanges.haveTouchArea = true;
+        if (mCalibration.touchSizeCalibration != Calibration::TOUCH_SIZE_CALIBRATION_NONE) {
+            mLocked.orientedRanges.haveTouchSize = true;
             mLocked.orientedRanges.touchMajor.min = 0;
             mLocked.orientedRanges.touchMajor.max = diagonalSize;
             mLocked.orientedRanges.touchMajor.flat = 0;
@@ -1438,23 +1451,46 @@
         }
 
         // ToolMajor and ToolMinor factors.
-        if (mCalibration.toolAreaCalibration != Calibration::TOOL_AREA_CALIBRATION_NONE) {
-            mLocked.toolAreaLinearScale = 0;
-            mLocked.toolAreaLinearBias = 0;
-            if (mCalibration.toolAreaCalibration == Calibration::TOOL_AREA_CALIBRATION_LINEAR) {
-                if (mCalibration.haveToolAreaLinearScale) {
-                    mLocked.toolAreaLinearScale = mCalibration.toolAreaLinearScale;
+        mLocked.toolSizeLinearScale = 0;
+        mLocked.toolSizeLinearBias = 0;
+        mLocked.toolSizeAreaScale = 0;
+        mLocked.toolSizeAreaBias = 0;
+        if (mCalibration.toolSizeCalibration != Calibration::TOOL_SIZE_CALIBRATION_NONE) {
+            if (mCalibration.toolSizeCalibration == Calibration::TOOL_SIZE_CALIBRATION_LINEAR) {
+                if (mCalibration.haveToolSizeLinearScale) {
+                    mLocked.toolSizeLinearScale = mCalibration.toolSizeLinearScale;
                 } else if (mRawAxes.toolMajor.valid && mRawAxes.toolMajor.maxValue != 0) {
-                    mLocked.toolAreaLinearScale = float(min(width, height))
+                    mLocked.toolSizeLinearScale = float(min(width, height))
                             / mRawAxes.toolMajor.maxValue;
                 }
 
-                if (mCalibration.haveToolAreaLinearBias) {
-                    mLocked.toolAreaLinearBias = mCalibration.toolAreaLinearBias;
+                if (mCalibration.haveToolSizeLinearBias) {
+                    mLocked.toolSizeLinearBias = mCalibration.toolSizeLinearBias;
+                }
+            } else if (mCalibration.toolSizeCalibration ==
+                    Calibration::TOOL_SIZE_CALIBRATION_AREA) {
+                if (mCalibration.haveToolSizeLinearScale) {
+                    mLocked.toolSizeLinearScale = mCalibration.toolSizeLinearScale;
+                } else {
+                    mLocked.toolSizeLinearScale = min(width, height);
+                }
+
+                if (mCalibration.haveToolSizeLinearBias) {
+                    mLocked.toolSizeLinearBias = mCalibration.toolSizeLinearBias;
+                }
+
+                if (mCalibration.haveToolSizeAreaScale) {
+                    mLocked.toolSizeAreaScale = mCalibration.toolSizeAreaScale;
+                } else if (mRawAxes.toolMajor.valid && mRawAxes.toolMajor.maxValue != 0) {
+                    mLocked.toolSizeAreaScale = 1.0f / mRawAxes.toolMajor.maxValue;
+                }
+
+                if (mCalibration.haveToolSizeAreaBias) {
+                    mLocked.toolSizeAreaBias = mCalibration.toolSizeAreaBias;
                 }
             }
 
-            mLocked.orientedRanges.haveToolArea = true;
+            mLocked.orientedRanges.haveToolSize = true;
             mLocked.orientedRanges.toolMajor.min = 0;
             mLocked.orientedRanges.toolMajor.max = diagonalSize;
             mLocked.orientedRanges.toolMajor.flat = 0;
@@ -1463,6 +1499,7 @@
         }
 
         // Pressure factors.
+        mLocked.pressureScale = 0;
         if (mCalibration.pressureCalibration != Calibration::PRESSURE_CALIBRATION_NONE) {
             RawAbsoluteAxisInfo rawPressureAxis;
             switch (mCalibration.pressureSource) {
@@ -1476,7 +1513,6 @@
                 rawPressureAxis.clear();
             }
 
-            mLocked.pressureScale = 0;
             if (mCalibration.pressureCalibration == Calibration::PRESSURE_CALIBRATION_PHYSICAL
                     || mCalibration.pressureCalibration
                             == Calibration::PRESSURE_CALIBRATION_AMPLITUDE) {
@@ -1495,8 +1531,8 @@
         }
 
         // Size factors.
+        mLocked.sizeScale = 0;
         if (mCalibration.sizeCalibration != Calibration::SIZE_CALIBRATION_NONE) {
-            mLocked.sizeScale = 0;
             if (mCalibration.sizeCalibration == Calibration::SIZE_CALIBRATION_NORMALIZED) {
                 if (mRawAxes.toolMajor.valid && mRawAxes.toolMajor.maxValue != 0) {
                     mLocked.sizeScale = 1.0f / mRawAxes.toolMajor.maxValue;
@@ -1511,8 +1547,8 @@
         }
 
         // Orientation
+        mLocked.orientationScale = 0;
         if (mCalibration.orientationCalibration != Calibration::ORIENTATION_CALIBRATION_NONE) {
-            mLocked.orientationScale = 0;
             if (mCalibration.orientationCalibration
                     == Calibration::ORIENTATION_CALIBRATION_INTERPOLATED) {
                 if (mRawAxes.orientation.valid && mRawAxes.orientation.maxValue != 0) {
@@ -1647,49 +1683,55 @@
     const InputDeviceCalibration& in = getDevice()->getCalibration();
     Calibration& out = mCalibration;
 
-    // Touch Area
-    out.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_DEFAULT;
-    String8 touchAreaCalibrationString;
-    if (in.tryGetProperty(String8("touch.touchArea.calibration"), touchAreaCalibrationString)) {
-        if (touchAreaCalibrationString == "none") {
-            out.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_NONE;
-        } else if (touchAreaCalibrationString == "geometric") {
-            out.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_GEOMETRIC;
-        } else if (touchAreaCalibrationString == "pressure") {
-            out.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_PRESSURE;
-        } else if (touchAreaCalibrationString != "default") {
-            LOGW("Invalid value for touch.touchArea.calibration: '%s'",
-                    touchAreaCalibrationString.string());
+    // Touch Size
+    out.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_DEFAULT;
+    String8 touchSizeCalibrationString;
+    if (in.tryGetProperty(String8("touch.touchSize.calibration"), touchSizeCalibrationString)) {
+        if (touchSizeCalibrationString == "none") {
+            out.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_NONE;
+        } else if (touchSizeCalibrationString == "geometric") {
+            out.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_GEOMETRIC;
+        } else if (touchSizeCalibrationString == "pressure") {
+            out.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_PRESSURE;
+        } else if (touchSizeCalibrationString != "default") {
+            LOGW("Invalid value for touch.touchSize.calibration: '%s'",
+                    touchSizeCalibrationString.string());
         }
     }
 
-    // Tool Area
-    out.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_DEFAULT;
-    String8 toolAreaCalibrationString;
-    if (in.tryGetProperty(String8("tool.toolArea.calibration"), toolAreaCalibrationString)) {
-        if (toolAreaCalibrationString == "none") {
-            out.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_NONE;
-        } else if (toolAreaCalibrationString == "geometric") {
-            out.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_GEOMETRIC;
-        } else if (toolAreaCalibrationString == "linear") {
-            out.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_LINEAR;
-        } else if (toolAreaCalibrationString != "default") {
-            LOGW("Invalid value for tool.toolArea.calibration: '%s'",
-                    toolAreaCalibrationString.string());
+    // Tool Size
+    out.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_DEFAULT;
+    String8 toolSizeCalibrationString;
+    if (in.tryGetProperty(String8("touch.toolSize.calibration"), toolSizeCalibrationString)) {
+        if (toolSizeCalibrationString == "none") {
+            out.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_NONE;
+        } else if (toolSizeCalibrationString == "geometric") {
+            out.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_GEOMETRIC;
+        } else if (toolSizeCalibrationString == "linear") {
+            out.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_LINEAR;
+        } else if (toolSizeCalibrationString == "area") {
+            out.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_AREA;
+        } else if (toolSizeCalibrationString != "default") {
+            LOGW("Invalid value for touch.toolSize.calibration: '%s'",
+                    toolSizeCalibrationString.string());
         }
     }
 
-    out.haveToolAreaLinearScale = in.tryGetProperty(String8("touch.toolArea.linearScale"),
-            out.toolAreaLinearScale);
-    out.haveToolAreaLinearBias = in.tryGetProperty(String8("touch.toolArea.linearBias"),
-            out.toolAreaLinearBias);
-    out.haveToolAreaIsSummed = in.tryGetProperty(String8("touch.toolArea.isSummed"),
-            out.toolAreaIsSummed);
+    out.haveToolSizeLinearScale = in.tryGetProperty(String8("touch.toolSize.linearScale"),
+            out.toolSizeLinearScale);
+    out.haveToolSizeLinearBias = in.tryGetProperty(String8("touch.toolSize.linearBias"),
+            out.toolSizeLinearBias);
+    out.haveToolSizeAreaScale = in.tryGetProperty(String8("touch.toolSize.areaScale"),
+            out.toolSizeAreaScale);
+    out.haveToolSizeAreaBias = in.tryGetProperty(String8("touch.toolSize.areaBias"),
+            out.toolSizeAreaBias);
+    out.haveToolSizeIsSummed = in.tryGetProperty(String8("touch.toolSize.isSummed"),
+            out.toolSizeIsSummed);
 
     // Pressure
     out.pressureCalibration = Calibration::PRESSURE_CALIBRATION_DEFAULT;
     String8 pressureCalibrationString;
-    if (in.tryGetProperty(String8("tool.pressure.calibration"), pressureCalibrationString)) {
+    if (in.tryGetProperty(String8("touch.pressure.calibration"), pressureCalibrationString)) {
         if (pressureCalibrationString == "none") {
             out.pressureCalibration = Calibration::PRESSURE_CALIBRATION_NONE;
         } else if (pressureCalibrationString == "physical") {
@@ -1697,7 +1739,7 @@
         } else if (pressureCalibrationString == "amplitude") {
             out.pressureCalibration = Calibration::PRESSURE_CALIBRATION_AMPLITUDE;
         } else if (pressureCalibrationString != "default") {
-            LOGW("Invalid value for tool.pressure.calibration: '%s'",
+            LOGW("Invalid value for touch.pressure.calibration: '%s'",
                     pressureCalibrationString.string());
         }
     }
@@ -1721,13 +1763,13 @@
     // Size
     out.sizeCalibration = Calibration::SIZE_CALIBRATION_DEFAULT;
     String8 sizeCalibrationString;
-    if (in.tryGetProperty(String8("tool.size.calibration"), sizeCalibrationString)) {
+    if (in.tryGetProperty(String8("touch.size.calibration"), sizeCalibrationString)) {
         if (sizeCalibrationString == "none") {
             out.sizeCalibration = Calibration::SIZE_CALIBRATION_NONE;
         } else if (sizeCalibrationString == "normalized") {
             out.sizeCalibration = Calibration::SIZE_CALIBRATION_NORMALIZED;
         } else if (sizeCalibrationString != "default") {
-            LOGW("Invalid value for tool.size.calibration: '%s'",
+            LOGW("Invalid value for touch.size.calibration: '%s'",
                     sizeCalibrationString.string());
         }
     }
@@ -1735,13 +1777,13 @@
     // Orientation
     out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_DEFAULT;
     String8 orientationCalibrationString;
-    if (in.tryGetProperty(String8("tool.orientation.calibration"), orientationCalibrationString)) {
+    if (in.tryGetProperty(String8("touch.orientation.calibration"), orientationCalibrationString)) {
         if (orientationCalibrationString == "none") {
             out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_NONE;
         } else if (orientationCalibrationString == "interpolated") {
             out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_INTERPOLATED;
         } else if (orientationCalibrationString != "default") {
-            LOGW("Invalid value for tool.orientation.calibration: '%s'",
+            LOGW("Invalid value for touch.orientation.calibration: '%s'",
                     orientationCalibrationString.string());
         }
     }
@@ -1789,13 +1831,13 @@
         break;
     }
 
-    // Tool Area
-    switch (mCalibration.toolAreaCalibration) {
-    case Calibration::TOOL_AREA_CALIBRATION_DEFAULT:
+    // Tool Size
+    switch (mCalibration.toolSizeCalibration) {
+    case Calibration::TOOL_SIZE_CALIBRATION_DEFAULT:
         if (mRawAxes.toolMajor.valid) {
-            mCalibration.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_LINEAR;
+            mCalibration.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_LINEAR;
         } else {
-            mCalibration.toolAreaCalibration = Calibration::TOOL_AREA_CALIBRATION_NONE;
+            mCalibration.toolSizeCalibration = Calibration::TOOL_SIZE_CALIBRATION_NONE;
         }
         break;
 
@@ -1803,14 +1845,14 @@
         break;
     }
 
-    // Touch Area
-    switch (mCalibration.touchAreaCalibration) {
-    case Calibration::TOUCH_AREA_CALIBRATION_DEFAULT:
+    // Touch Size
+    switch (mCalibration.touchSizeCalibration) {
+    case Calibration::TOUCH_SIZE_CALIBRATION_DEFAULT:
         if (mCalibration.pressureCalibration != Calibration::PRESSURE_CALIBRATION_NONE
-                && mCalibration.toolAreaCalibration != Calibration::TOOL_AREA_CALIBRATION_NONE) {
-            mCalibration.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_PRESSURE;
+                && mCalibration.toolSizeCalibration != Calibration::TOOL_SIZE_CALIBRATION_NONE) {
+            mCalibration.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_PRESSURE;
         } else {
-            mCalibration.touchAreaCalibration = Calibration::TOUCH_AREA_CALIBRATION_NONE;
+            mCalibration.touchSizeCalibration = Calibration::TOUCH_SIZE_CALIBRATION_NONE;
         }
         break;
 
@@ -1850,49 +1892,62 @@
 void TouchInputMapper::dumpCalibration(String8& dump) {
     dump.append(INDENT3 "Calibration:\n");
 
-    // Touch Area
-    switch (mCalibration.touchAreaCalibration) {
-    case Calibration::TOUCH_AREA_CALIBRATION_NONE:
-        dump.append(INDENT4 "touch.touchArea.calibration: none\n");
+    // Touch Size
+    switch (mCalibration.touchSizeCalibration) {
+    case Calibration::TOUCH_SIZE_CALIBRATION_NONE:
+        dump.append(INDENT4 "touch.touchSize.calibration: none\n");
         break;
-    case Calibration::TOUCH_AREA_CALIBRATION_GEOMETRIC:
-        dump.append(INDENT4 "touch.touchArea.calibration: geometric\n");
+    case Calibration::TOUCH_SIZE_CALIBRATION_GEOMETRIC:
+        dump.append(INDENT4 "touch.touchSize.calibration: geometric\n");
         break;
-    case Calibration::TOUCH_AREA_CALIBRATION_PRESSURE:
-        dump.append(INDENT4 "touch.touchArea.calibration: pressure\n");
+    case Calibration::TOUCH_SIZE_CALIBRATION_PRESSURE:
+        dump.append(INDENT4 "touch.touchSize.calibration: pressure\n");
         break;
     default:
         assert(false);
     }
 
-    // Tool Area
-    switch (mCalibration.toolAreaCalibration) {
-    case Calibration::TOOL_AREA_CALIBRATION_NONE:
-        dump.append(INDENT4 "touch.toolArea.calibration: none\n");
+    // Tool Size
+    switch (mCalibration.toolSizeCalibration) {
+    case Calibration::TOOL_SIZE_CALIBRATION_NONE:
+        dump.append(INDENT4 "touch.toolSize.calibration: none\n");
         break;
-    case Calibration::TOOL_AREA_CALIBRATION_GEOMETRIC:
-        dump.append(INDENT4 "touch.toolArea.calibration: geometric\n");
+    case Calibration::TOOL_SIZE_CALIBRATION_GEOMETRIC:
+        dump.append(INDENT4 "touch.toolSize.calibration: geometric\n");
         break;
-    case Calibration::TOOL_AREA_CALIBRATION_LINEAR:
-        dump.append(INDENT4 "touch.toolArea.calibration: linear\n");
+    case Calibration::TOOL_SIZE_CALIBRATION_LINEAR:
+        dump.append(INDENT4 "touch.toolSize.calibration: linear\n");
+        break;
+    case Calibration::TOOL_SIZE_CALIBRATION_AREA:
+        dump.append(INDENT4 "touch.toolSize.calibration: area\n");
         break;
     default:
         assert(false);
     }
 
-    if (mCalibration.haveToolAreaLinearScale) {
-        dump.appendFormat(INDENT4 "touch.toolArea.linearScale: %0.3f\n",
-                mCalibration.toolAreaLinearScale);
+    if (mCalibration.haveToolSizeLinearScale) {
+        dump.appendFormat(INDENT4 "touch.toolSize.linearScale: %0.3f\n",
+                mCalibration.toolSizeLinearScale);
     }
 
-    if (mCalibration.haveToolAreaLinearBias) {
-        dump.appendFormat(INDENT4 "touch.toolArea.linearBias: %0.3f\n",
-                mCalibration.toolAreaLinearBias);
+    if (mCalibration.haveToolSizeLinearBias) {
+        dump.appendFormat(INDENT4 "touch.toolSize.linearBias: %0.3f\n",
+                mCalibration.toolSizeLinearBias);
     }
 
-    if (mCalibration.haveToolAreaIsSummed) {
-        dump.appendFormat(INDENT4 "touch.toolArea.isSummed: %d\n",
-                mCalibration.toolAreaIsSummed);
+    if (mCalibration.haveToolSizeAreaScale) {
+        dump.appendFormat(INDENT4 "touch.toolSize.areaScale: %0.3f\n",
+                mCalibration.toolSizeAreaScale);
+    }
+
+    if (mCalibration.haveToolSizeAreaBias) {
+        dump.appendFormat(INDENT4 "touch.toolSize.areaBias: %0.3f\n",
+                mCalibration.toolSizeAreaBias);
+    }
+
+    if (mCalibration.haveToolSizeIsSummed) {
+        dump.appendFormat(INDENT4 "touch.toolSize.isSummed: %d\n",
+                mCalibration.toolSizeIsSummed);
     }
 
     // Pressure
@@ -2207,8 +2262,8 @@
 
             // ToolMajor and ToolMinor
             float toolMajor, toolMinor;
-            switch (mCalibration.toolAreaCalibration) {
-            case Calibration::TOOL_AREA_CALIBRATION_GEOMETRIC:
+            switch (mCalibration.toolSizeCalibration) {
+            case Calibration::TOOL_SIZE_CALIBRATION_GEOMETRIC:
                 toolMajor = in.toolMajor * mLocked.geometricScale;
                 if (mRawAxes.toolMinor.valid) {
                     toolMinor = in.toolMinor * mLocked.geometricScale;
@@ -2216,26 +2271,36 @@
                     toolMinor = toolMajor;
                 }
                 break;
-            case Calibration::TOOL_AREA_CALIBRATION_LINEAR:
+            case Calibration::TOOL_SIZE_CALIBRATION_LINEAR:
                 toolMajor = in.toolMajor != 0
-                        ? in.toolMajor * mLocked.toolAreaLinearScale + mLocked.toolAreaLinearBias
+                        ? in.toolMajor * mLocked.toolSizeLinearScale + mLocked.toolSizeLinearBias
                         : 0;
                 if (mRawAxes.toolMinor.valid) {
                     toolMinor = in.toolMinor != 0
-                            ? in.toolMinor * mLocked.toolAreaLinearScale
-                                    + mLocked.toolAreaLinearBias
+                            ? in.toolMinor * mLocked.toolSizeLinearScale
+                                    + mLocked.toolSizeLinearBias
                             : 0;
                 } else {
                     toolMinor = toolMajor;
                 }
                 break;
+            case Calibration::TOOL_SIZE_CALIBRATION_AREA:
+                if (in.toolMajor != 0) {
+                    float diameter = sqrtf(in.toolMajor
+                            * mLocked.toolSizeAreaScale + mLocked.toolSizeAreaBias);
+                    toolMajor = diameter * mLocked.toolSizeLinearScale + mLocked.toolSizeLinearBias;
+                } else {
+                    toolMajor = 0;
+                }
+                toolMinor = toolMajor;
+                break;
             default:
                 toolMajor = 0;
                 toolMinor = 0;
                 break;
             }
 
-            if (mCalibration.haveToolAreaIsSummed && mCalibration.toolAreaIsSummed) {
+            if (mCalibration.haveToolSizeIsSummed && mCalibration.toolSizeIsSummed) {
                 toolMajor /= pointerCount;
                 toolMinor /= pointerCount;
             }
@@ -2266,8 +2331,8 @@
 
             // TouchMajor and TouchMinor
             float touchMajor, touchMinor;
-            switch (mCalibration.touchAreaCalibration) {
-            case Calibration::TOUCH_AREA_CALIBRATION_GEOMETRIC:
+            switch (mCalibration.touchSizeCalibration) {
+            case Calibration::TOUCH_SIZE_CALIBRATION_GEOMETRIC:
                 touchMajor = in.touchMajor * mLocked.geometricScale;
                 if (mRawAxes.touchMinor.valid) {
                     touchMinor = in.touchMinor * mLocked.geometricScale;
@@ -2275,7 +2340,7 @@
                     touchMinor = touchMajor;
                 }
                 break;
-            case Calibration::TOUCH_AREA_CALIBRATION_PRESSURE:
+            case Calibration::TOUCH_SIZE_CALIBRATION_PRESSURE:
                 touchMajor = toolMajor * pressure;
                 touchMinor = toolMinor * pressure;
                 break;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 4bbc251..f404708 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -498,7 +498,9 @@
             if (chunk_type == FOURCC('s', 't', 'b', 'l')) {
                 LOGV("sampleTable chunk is %d bytes long.", (size_t)chunk_size);
 
-                if (mDataSource->flags() & DataSource::kWantsPrefetching) {
+                if (mDataSource->flags()
+                        & (DataSource::kWantsPrefetching
+                            | DataSource::kIsCachingDataSource)) {
                     sp<MPEG4DataSource> cachedSource =
                         new MPEG4DataSource(mDataSource);
 
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 9d7c58e..174b3ef 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -144,6 +144,7 @@
     private static final boolean MULTIPLE_APPLICATION_UIDS = true;
     private static final int RADIO_UID = Process.PHONE_UID;
     private static final int LOG_UID = Process.LOG_UID;
+    private static final int NFC_UID = Process.NFC_UID;
     private static final int FIRST_APPLICATION_UID =
         Process.FIRST_APPLICATION_UID;
     private static final int MAX_APPLICATION_UIDS = 1000;
@@ -740,6 +741,10 @@
                 MULTIPLE_APPLICATION_UIDS
                         ? LOG_UID : FIRST_APPLICATION_UID,
                 ApplicationInfo.FLAG_SYSTEM);
+        mSettings.addSharedUserLP("android.uid.nfc",
+                MULTIPLE_APPLICATION_UIDS
+                        ? NFC_UID : FIRST_APPLICATION_UID,
+                ApplicationInfo.FLAG_SYSTEM);
 
         String separateProcesses = SystemProperties.get("debug.separate_processes");
         if (separateProcesses != null && separateProcesses.length() > 0) {
@@ -8825,7 +8830,7 @@
                 try {
                     str = new FileInputStream(mBackupSettingsFilename);
                     mReadMessages.append("Reading from backup settings file\n");
-                    Log.i(TAG, "Reading from backup settings file!");
+                    reportSettingsProblem(Log.INFO, "Need to read from backup settings file");
                     if (mSettingsFilename.exists()) {
                         // If both the backup and settings file exist, we
                         // ignore the settings since it might have been
@@ -8844,7 +8849,7 @@
                 if (str == null) {
                     if (!mSettingsFilename.exists()) {
                         mReadMessages.append("No settings file found\n");
-                        Slog.i(TAG, "No current settings file!");
+                        reportSettingsProblem(Log.INFO, "No settings file; creating initial state");
                         return false;
                     }
                     str = new FileInputStream(mSettingsFilename);
@@ -8860,7 +8865,7 @@
 
                 if (type != XmlPullParser.START_TAG) {
                     mReadMessages.append("No start tag found in settings file\n");
-                    Slog.e(TAG, "No start tag found in package manager settings");
+                    reportSettingsProblem(Log.WARN, "No start tag found in package manager settings");
                     return false;
                 }
 
@@ -8923,10 +8928,12 @@
 
             } catch(XmlPullParserException e) {
                 mReadMessages.append("Error reading: " + e.toString());
+                reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
                 Slog.e(TAG, "Error reading package manager settings", e);
 
             } catch(java.io.IOException e) {
                 mReadMessages.append("Error reading: " + e.toString());
+                reportSettingsProblem(Log.ERROR, "Error reading settings: " + e);
                 Slog.e(TAG, "Error reading package manager settings", e);
 
             }
@@ -8940,7 +8947,7 @@
                             (SharedUserSetting) idObj, pp.codePath, pp.resourcePath,
                             pp.nativeLibraryPathString, pp.versionCode, pp.pkgFlags, true, true);
                     if (p == null) {
-                        Slog.w(TAG, "Unable to create application package for "
+                        reportSettingsProblem(Log.WARN, "Unable to create application package for "
                                 + pp.name);
                         continue;
                     }
@@ -8950,13 +8957,13 @@
                             + " has shared uid " + pp.sharedId
                             + " that is not a shared uid\n";
                     mReadMessages.append(msg);
-                    Slog.e(TAG, msg);
+                    reportSettingsProblem(Log.ERROR, msg);
                 } else {
                     String msg = "Bad package setting: package " + pp.name
                             + " has shared uid " + pp.sharedId
                             + " that is not defined\n";
                     mReadMessages.append(msg);
-                    Slog.e(TAG, msg);
+                    reportSettingsProblem(Log.ERROR, msg);
                 }
             }
             mPendingPackages.clear();
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index a2a5e67..df69b76 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -20,7 +20,6 @@
 import com.android.internal.app.ShutdownThread;
 import com.android.internal.os.BinderInternal;
 import com.android.internal.os.SamplingProfilerIntegration;
-import com.trustedlogic.trustednfc.android.server.NfcService;
 
 import dalvik.system.VMRuntime;
 import dalvik.system.Zygote;
@@ -437,20 +436,6 @@
             }
             
             try {
-                Slog.i(TAG, "Nfc Service");
-                NfcService nfc;
-                try {
-                    nfc = new NfcService(context);
-                } catch (UnsatisfiedLinkError e) { // gross hack to detect NFC
-                    nfc = null;
-                    Slog.w(TAG, "No NFC support");
-                }
-                ServiceManager.addService(Context.NFC_SERVICE, nfc);
-            } catch (Throwable e) {
-                Slog.e(TAG, "Failure starting NFC Service", e);
-            }
-
-            try {
                 Slog.i(TAG, "DiskStats Service");
                 ServiceManager.addService("diskstats", new DiskStatsService(context));
             } catch (Throwable e) {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 86c7bdf..f52d322 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -1881,7 +1881,27 @@
             String resultWho, int requestCode,
             int callingPid, int callingUid, boolean onlyIfNeeded,
             boolean componentSpecified) {
-        Slog.i(TAG, "Starting: " + intent);
+
+        int err = START_SUCCESS;
+
+        ProcessRecord callerApp = null;
+        if (caller != null) {
+            callerApp = mService.getRecordForAppLocked(caller);
+            if (callerApp != null) {
+                callingPid = callerApp.pid;
+                callingUid = callerApp.info.uid;
+            } else {
+                Slog.w(TAG, "Unable to find app for caller " + caller
+                      + " (pid=" + callingPid + ") when starting: "
+                      + intent.toString());
+                err = START_PERMISSION_DENIED;
+            }
+        }
+
+        if (err == START_SUCCESS) {
+            Slog.i(TAG, "Starting: " + intent + " from pid "
+                    + (callerApp != null ? callerApp.pid : callingPid));
+        }
 
         ActivityRecord sourceRecord = null;
         ActivityRecord resultRecord = null;
@@ -1916,9 +1936,7 @@
             }
         }
 
-        int err = START_SUCCESS;
-
-        if (intent.getComponent() == null) {
+        if (err == START_SUCCESS && intent.getComponent() == null) {
             // We couldn't find a class that can handle the given Intent.
             // That's the end of that!
             err = START_INTENT_NOT_RESOLVED;
@@ -1930,20 +1948,6 @@
             err = START_CLASS_NOT_FOUND;
         }
 
-        ProcessRecord callerApp = null;
-        if (err == START_SUCCESS && caller != null) {
-            callerApp = mService.getRecordForAppLocked(caller);
-            if (callerApp != null) {
-                callingPid = callerApp.pid;
-                callingUid = callerApp.info.uid;
-            } else {
-                Slog.w(TAG, "Unable to find app for caller " + caller
-                      + " (pid=" + callingPid + ") when starting: "
-                      + intent.toString());
-                err = START_PERMISSION_DENIED;
-            }
-        }
-
         if (err != START_SUCCESS) {
             if (resultRecord != null) {
                 sendActivityResultLocked(-1,
diff --git a/services/java/com/trustedlogic/trustednfc/android/server/NfcService.java b/services/java/com/trustedlogic/trustednfc/android/server/NfcService.java
deleted file mode 100644
index bddbafc..0000000
--- a/services/java/com/trustedlogic/trustednfc/android/server/NfcService.java
+++ /dev/null
@@ -1,2157 +0,0 @@
-/*
- * Copyright (C) 2010 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
- *
- *      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
- * limitations under the License.
- */
-
-package com.trustedlogic.trustednfc.android.server;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import android.nfc.ErrorCodes;
-import android.nfc.FormatException;
-import android.nfc.ILlcpConnectionlessSocket;
-import android.nfc.ILlcpServiceSocket;
-import android.nfc.INfcAdapter;
-import android.nfc.ILlcpSocket;
-import android.nfc.INfcTag;
-import android.nfc.IP2pInitiator;
-import android.nfc.IP2pTarget;
-import android.nfc.LlcpPacket;
-import android.nfc.NdefMessage;
-import android.nfc.Tag;
-//import android.nfc.NfcException;
-//import android.nfc.NfcManager;
-import android.nfc.NfcAdapter;
-import com.trustedlogic.trustednfc.android.internal.NativeLlcpConnectionlessSocket;
-import com.trustedlogic.trustednfc.android.internal.NativeLlcpServiceSocket;
-import com.trustedlogic.trustednfc.android.internal.NativeLlcpSocket;
-import com.trustedlogic.trustednfc.android.internal.NativeNfcManager;
-import com.trustedlogic.trustednfc.android.internal.NativeNfcTag;
-import com.trustedlogic.trustednfc.android.internal.NativeP2pDevice;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Process;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.util.Log;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-public class NfcService extends INfcAdapter.Stub implements Runnable {
-
-    /**
-     * NFC Service tag
-     */
-    private static final String TAG = "NfcService";
-
-    /**
-     * NFC features disabled state
-     */
-    private static final short NFC_STATE_DISABLED = 0x00;
-
-    /**
-     * NFC features enabled state
-     */
-    private static final short NFC_STATE_ENABLED = 0x01;
-
-    /**
-     * NFC Discovery for Reader mode
-     */
-    private static final int DISCOVERY_MODE_READER = 0;
-
-    /**
-     * NFC Discovery for Card Emulation Mode
-     */
-    private static final int DISCOVERY_MODE_CARD_EMULATION = 2;
-
-    /**
-     * LLCP Service Socket type
-     */
-    private static final int LLCP_SERVICE_SOCKET_TYPE = 0;
-
-    /**
-     * LLCP Socket type
-     */
-    private static final int LLCP_SOCKET_TYPE = 1;
-
-    /**
-     * LLCP Connectionless socket type
-     */
-    private static final int LLCP_CONNECTIONLESS_SOCKET_TYPE = 2;
-
-    /**
-     * Maximun number of sockets managed
-     */
-    private static final int LLCP_SOCKET_NB_MAX = 5;
-
-    /**
-     * Default value for the Maximum Information Unit parameter
-     */
-    private static final int LLCP_LTO_DEFAULT_VALUE = 150;
-
-    /**
-     * Default value for the Maximum Information Unit parameter
-     */
-    private static final int LLCP_LTO_MAX_VALUE = 255;
-
-    /**
-     * Maximun value for the Receive Window
-     */
-    private static final int LLCP_RW_MAX_VALUE = 15;
-
-    /**
-     * Default value for the Maximum Information Unit parameter
-     */
-    private static final int LLCP_MIU_DEFAULT_VALUE = 128;
-
-    /**
-     * Default value for the Maximum Information Unit parameter
-     */
-    private static final int LLCP_MIU_MAX_VALUE = 2176;
-
-    /**
-     * Default value for the Well Known Service List parameter
-     */
-    private static final int LLCP_WKS_DEFAULT_VALUE = 1;
-
-    /**
-     * Max value for the Well Known Service List parameter
-     */
-    private static final int LLCP_WKS_MAX_VALUE = 15;
-
-    /**
-     * Default value for the Option parameter
-     */
-    private static final int LLCP_OPT_DEFAULT_VALUE = 0;
-
-    /**
-     * Max value for the Option parameter
-     */
-    private static final int LLCP_OPT_MAX_VALUE = 3;
-
-    /**
-     * LLCP Properties
-     */
-    private static final int PROPERTY_LLCP_LTO = 0;
-
-    private static final int PROPERTY_LLCP_MIU = 1;
-
-    private static final int PROPERTY_LLCP_WKS = 2;
-
-    private static final int PROPERTY_LLCP_OPT = 3;
-
-    private static final String PROPERTY_LLCP_LTO_VALUE = "llcp.lto";
-
-    private static final String PROPERTY_LLCP_MIU_VALUE = "llcp.miu";
-
-    private static final String PROPERTY_LLCP_WKS_VALUE = "llcp.wks";
-
-    private static final String PROPERTY_LLCP_OPT_VALUE = "llcp.opt";
-
-    /**
-     * NFC Reader Properties
-     */
-    private static final int PROPERTY_NFC_DISCOVERY_A = 4;
-
-    private static final int PROPERTY_NFC_DISCOVERY_B = 5;
-
-    private static final int PROPERTY_NFC_DISCOVERY_F = 6;
-
-    private static final int PROPERTY_NFC_DISCOVERY_15693 = 7;
-
-    private static final int PROPERTY_NFC_DISCOVERY_NFCIP = 8;
-
-    private static final String PROPERTY_NFC_DISCOVERY_A_VALUE = "discovery.iso14443A";
-
-    private static final String PROPERTY_NFC_DISCOVERY_B_VALUE = "discovery.iso14443B";
-
-    private static final String PROPERTY_NFC_DISCOVERY_F_VALUE = "discovery.felica";
-
-    private static final String PROPERTY_NFC_DISCOVERY_15693_VALUE = "discovery.iso15693";
-
-    private static final String PROPERTY_NFC_DISCOVERY_NFCIP_VALUE = "discovery.nfcip";
-
-    private final Context mContext;
-
-    private final HashMap<Integer, Object> mObjectMap = new HashMap<Integer, Object>();
-
-    private final HashMap<Integer, Object> mSocketMap = new HashMap<Integer, Object>();
-
-    private final LinkedList<RegisteredSocket> mRegisteredSocketList = new LinkedList<RegisteredSocket>();
-
-    private int mLlcpLinkState = NfcAdapter.LLCP_LINK_STATE_DEACTIVATED;
-
-    private int mGeneratedSocketHandle = 0;
-
-    private int mNbSocketCreated = 0;
-
-    private boolean mIsNfcEnabled = false;
-
-    private NfcHandler mNfcHandler;
-
-    private int mSelectedSeId = 0;
-
-    private int mTimeout = 0;
-
-    private int mNfcState;
-
-    private int mNfcSecureElementState;
-
-    private boolean mOpenPending = false;
-
-    private final NativeNfcManager mManager;
-
-    private final ILlcpSocket mLlcpSocket = new ILlcpSocket.Stub() {
-
-        private final int CONNECT_FLAG = 0x01;
-        private final int CLOSE_FLAG   = 0x02;
-        private final int RECV_FLAG    = 0x04;
-        private final int SEND_FLAG    = 0x08;
-
-        private int concurrencyFlags;
-        private Object sync;
-
-        private void enterCritical(int mask, int current) {
-            int result = -1;
-            try {
-                while (result != 0) {
-                    synchronized(this) {
-                        result = concurrencyFlags & mask;
-                    }
-                    sync.wait();
-                }
-            }
-            catch(InterruptedException e) {
-            }
-            // Set flag
-            concurrencyFlags |= current;
-        }
-
-        private void leaveCritical(int current) {
-            synchronized(this) {
-                // Clear flag
-                concurrencyFlags &= ~current;
-            }
-            // Release waiting threads
-            sync.notifyAll();
-        }
-
-        public int close(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                    isSuccess = socket.doClose();
-                    if (isSuccess) {
-                        /* Remove the socket closed from the hmap */
-                        RemoveSocket(nativeHandle);
-                        /* Update mNbSocketCreated */
-                        mNbSocketCreated--;
-                        return ErrorCodes.SUCCESS;
-                    } else {
-                        return ErrorCodes.ERROR_IO;
-                    }
-                } else {
-                    /* Remove the socket closed from the hmap */
-                    RemoveSocket(nativeHandle);
-
-                    /* Remove registered socket from the list */
-                    RemoveRegisteredSocket(nativeHandle);
-
-                    /* Update mNbSocketCreated */
-                    mNbSocketCreated--;
-
-                    return ErrorCodes.SUCCESS;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-        }
-
-        public int connect(int nativeHandle, int sap) throws RemoteException {
-            NativeLlcpSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                isSuccess = socket.doConnect(sap, socket.getConnectTimeout());
-                if (isSuccess) {
-                    return ErrorCodes.SUCCESS;
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-
-        }
-
-        public int connectByName(int nativeHandle, String sn) throws RemoteException {
-            NativeLlcpSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                isSuccess = socket.doConnectBy(sn, socket.getConnectTimeout());
-                if (isSuccess) {
-                    return ErrorCodes.SUCCESS;
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-
-        }
-
-        public int getConnectTimeout(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getConnectTimeout();
-            } else {
-                return 0;
-            }
-        }
-
-        public int getLocalSap(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getSap();
-            } else {
-                return 0;
-            }
-        }
-
-        public int getLocalSocketMiu(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getMiu();
-            } else {
-                return 0;
-            }
-        }
-
-        public int getLocalSocketRw(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getRw();
-            } else {
-                return 0;
-            }
-        }
-
-        public int getRemoteSocketMiu(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                if (socket.doGetRemoteSocketMiu() != 0) {
-                    return socket.doGetRemoteSocketMiu();
-                } else {
-                    return ErrorCodes.ERROR_SOCKET_NOT_CONNECTED;
-                }
-            } else {
-                return ErrorCodes.ERROR_SOCKET_NOT_CONNECTED;
-            }
-        }
-
-        public int getRemoteSocketRw(int nativeHandle) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                if (socket.doGetRemoteSocketRw() != 0) {
-                    return socket.doGetRemoteSocketRw();
-                } else {
-                    return ErrorCodes.ERROR_SOCKET_NOT_CONNECTED;
-                }
-            } else {
-                return ErrorCodes.ERROR_SOCKET_NOT_CONNECTED;
-            }
-        }
-
-        public int receive(int nativeHandle, byte[] receiveBuffer) throws RemoteException {
-            NativeLlcpSocket socket = null;
-            int receiveLength = 0;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                receiveLength = socket.doReceive(receiveBuffer);
-                if (receiveLength != 0) {
-                    return receiveLength;
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-        }
-
-        public int send(int nativeHandle, byte[] data) throws RemoteException {
-            NativeLlcpSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                isSuccess = socket.doSend(data);
-                if (isSuccess) {
-                    return ErrorCodes.SUCCESS;
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-        }
-
-        public void setConnectTimeout(int nativeHandle, int timeout) throws RemoteException {
-            NativeLlcpSocket socket = null;
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                socket.setConnectTimeout(timeout);
-            }
-        }
-
-    };
-
-    private final ILlcpServiceSocket mLlcpServerSocketService = new ILlcpServiceSocket.Stub() {
-
-        public int accept(int nativeHandle) throws RemoteException {
-            NativeLlcpServiceSocket socket = null;
-            NativeLlcpSocket clientSocket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            if (mNbSocketCreated < LLCP_SOCKET_NB_MAX) {
-                /* find the socket in the hmap */
-                socket = (NativeLlcpServiceSocket) findSocket(nativeHandle);
-                if (socket != null) {
-                    clientSocket = socket.doAccept(socket.getAcceptTimeout(), socket.getMiu(),
-                            socket.getRw(), socket.getLinearBufferLength());
-                    if (clientSocket != null) {
-                        /* Add the socket into the socket map */
-                        mSocketMap.put(clientSocket.getHandle(), clientSocket);
-                        mNbSocketCreated++;
-                        return clientSocket.getHandle();
-                    } else {
-                        return ErrorCodes.ERROR_IO;
-                    }
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-            }
-
-        }
-
-        public void close(int nativeHandle) throws RemoteException {
-            NativeLlcpServiceSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpServiceSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                    isSuccess = socket.doClose();
-                    if (isSuccess) {
-                        /* Remove the socket closed from the hmap */
-                        RemoveSocket(nativeHandle);
-                        /* Update mNbSocketCreated */
-                        mNbSocketCreated--;
-                    }
-                } else {
-                    /* Remove the socket closed from the hmap */
-                    RemoveSocket(nativeHandle);
-
-                    /* Remove registered socket from the list */
-                    RemoveRegisteredSocket(nativeHandle);
-
-                    /* Update mNbSocketCreated */
-                    mNbSocketCreated--;
-                }
-            }
-        }
-
-        public int getAcceptTimeout(int nativeHandle) throws RemoteException {
-            NativeLlcpServiceSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpServiceSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getAcceptTimeout();
-            } else {
-                return 0;
-            }
-        }
-
-        public void setAcceptTimeout(int nativeHandle, int timeout) throws RemoteException {
-            NativeLlcpServiceSocket socket = null;
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpServiceSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                socket.setAcceptTimeout(timeout);
-            }
-        }
-    };
-
-    private final ILlcpConnectionlessSocket mLlcpConnectionlessSocketService = new ILlcpConnectionlessSocket.Stub() {
-
-        public void close(int nativeHandle) throws RemoteException {
-            NativeLlcpConnectionlessSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpConnectionlessSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                    isSuccess = socket.doClose();
-                    if (isSuccess) {
-                        /* Remove the socket closed from the hmap */
-                        RemoveSocket(nativeHandle);
-                        /* Update mNbSocketCreated */
-                        mNbSocketCreated--;
-                    }
-                } else {
-                    /* Remove the socket closed from the hmap */
-                    RemoveSocket(nativeHandle);
-
-                    /* Remove registered socket from the list */
-                    RemoveRegisteredSocket(nativeHandle);
-
-                    /* Update mNbSocketCreated */
-                    mNbSocketCreated--;
-                }
-            }
-        }
-
-        public int getSap(int nativeHandle) throws RemoteException {
-            NativeLlcpConnectionlessSocket socket = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpConnectionlessSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                return socket.getSap();
-            } else {
-                return 0;
-            }
-        }
-
-        public LlcpPacket receiveFrom(int nativeHandle) throws RemoteException {
-            NativeLlcpConnectionlessSocket socket = null;
-            LlcpPacket packet;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpConnectionlessSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                packet = socket.doReceiveFrom(socket.getLinkMiu());
-                if (packet != null) {
-                    return packet;
-                }
-                return null;
-            } else {
-                return null;
-            }
-        }
-
-        public int sendTo(int nativeHandle, LlcpPacket packet) throws RemoteException {
-            NativeLlcpConnectionlessSocket socket = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the socket in the hmap */
-            socket = (NativeLlcpConnectionlessSocket) findSocket(nativeHandle);
-            if (socket != null) {
-                isSuccess = socket.doSendTo(packet.getRemoteSap(), packet.getDataBuffer());
-                if (isSuccess) {
-                    return ErrorCodes.SUCCESS;
-                } else {
-                    return ErrorCodes.ERROR_IO;
-                }
-            } else {
-                return ErrorCodes.ERROR_IO;
-            }
-        }
-    };
-
-    private final INfcTag mNfcTagService = new INfcTag.Stub() {
-
-        public int close(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                if (tag.doDisconnect()) {
-                    /* Remove the device from the hmap */
-                    RemoveObject(nativeHandle);
-                    /* Restart polling loop for notification */
-                    mManager.enableDiscovery(DISCOVERY_MODE_READER);
-                    mOpenPending = false;
-                    return ErrorCodes.SUCCESS;
-                }
-
-            }
-            /* Restart polling loop for notification */
-            mManager.enableDiscovery(DISCOVERY_MODE_READER);
-            mOpenPending = false;
-            return ErrorCodes.ERROR_DISCONNECT;
-        }
-
-        public int connect(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag = null;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                if (tag.doConnect())
-                    return ErrorCodes.SUCCESS;
-            }
-            /* Restart polling loop for notification */
-            mManager.enableDiscovery(DISCOVERY_MODE_READER);
-            mOpenPending = false;
-            return ErrorCodes.ERROR_CONNECT;
-        }
-
-        public String getType(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag = null;
-            String type;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                type = tag.getType();
-                return type;
-            }
-            return null;
-        }
-
-        public byte[] getUid(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag = null;
-            byte[] uid;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                uid = tag.getUid();
-                return uid;
-            }
-            return null;
-        }
-
-        public boolean isNdef(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag = null;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return isSuccess;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                isSuccess = tag.checkNDEF();
-            }
-            return isSuccess;
-        }
-
-        public byte[] transceive(int nativeHandle, byte[] data) throws RemoteException {
-            NativeNfcTag tag = null;
-            byte[] response;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                response = tag.doTransceive(data);
-                return response;
-            }
-            return null;
-        }
-
-        public NdefMessage read(int nativeHandle) throws RemoteException {
-            NativeNfcTag tag;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag != null) {
-                byte[] buf = tag.doRead();
-                if (buf == null)
-                    return null;
-
-                /* Create an NdefMessage */
-                try {
-                    return new NdefMessage(buf);
-                } catch (FormatException e) {
-                    return null;
-                }
-            }
-            return null;
-        }
-
-        public int write(int nativeHandle, NdefMessage msg) throws RemoteException {
-            NativeNfcTag tag;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the tag in the hmap */
-            tag = (NativeNfcTag) findObject(nativeHandle);
-            if (tag == null) {
-                return ErrorCodes.ERROR_IO;
-            }
-
-            if (tag.doWrite(msg.toByteArray())) {
-                return ErrorCodes.SUCCESS;
-            }
-            else {
-                return ErrorCodes.ERROR_IO;
-            }
-
-        }
-
-        public int getLastError(int nativeHandle) throws RemoteException {
-            // TODO Auto-generated method stub
-            return 0;
-        }
-
-        public int getModeHint(int nativeHandle) throws RemoteException {
-            // TODO Auto-generated method stub
-            return 0;
-        }
-
-        public int makeReadOnly(int nativeHandle) throws RemoteException {
-            // TODO Auto-generated method stub
-            return 0;
-        }
-
-
-    };
-
-    private final IP2pInitiator mP2pInitiatorService = new IP2pInitiator.Stub() {
-
-        public byte[] getGeneralBytes(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                byte[] buff = device.getGeneralBytes();
-                if (buff == null)
-                    return null;
-                return buff;
-            }
-            return null;
-        }
-
-        public int getMode(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                return device.getMode();
-            }
-            return ErrorCodes.ERROR_INVALID_PARAM;
-        }
-
-        public byte[] receive(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                byte[] buff = device.doReceive();
-                if (buff == null)
-                    return null;
-                return buff;
-            }
-            /* Restart polling loop for notification */
-            mManager.enableDiscovery(DISCOVERY_MODE_READER);
-            mOpenPending = false;
-            return null;
-        }
-
-        public boolean send(int nativeHandle, byte[] data) throws RemoteException {
-            NativeP2pDevice device;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return isSuccess;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                isSuccess = device.doSend(data);
-            }
-            return isSuccess;
-        }
-    };
-
-    private final IP2pTarget mP2pTargetService = new IP2pTarget.Stub() {
-
-        public int connect(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                if (device.doConnect()) {
-                    return ErrorCodes.SUCCESS;
-                }
-            }
-            return ErrorCodes.ERROR_CONNECT;
-        }
-
-        public boolean disconnect(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-            boolean isSuccess = false;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return isSuccess;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                if (isSuccess = device.doDisconnect()) {
-                    mOpenPending = false;
-                    /* remove the device from the hmap */
-                    RemoveObject(nativeHandle);
-                    /* Restart polling loop for notification */
-                    mManager.enableDiscovery(DISCOVERY_MODE_READER);
-                }
-            }
-            return isSuccess;
-
-        }
-
-        public byte[] getGeneralBytes(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                byte[] buff = device.getGeneralBytes();
-                if (buff == null)
-                    return null;
-                return buff;
-            }
-            return null;
-        }
-
-        public int getMode(int nativeHandle) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return ErrorCodes.ERROR_NOT_INITIALIZED;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                return device.getMode();
-            }
-            return ErrorCodes.ERROR_INVALID_PARAM;
-        }
-
-        public byte[] transceive(int nativeHandle, byte[] data) throws RemoteException {
-            NativeP2pDevice device;
-
-            // Check if NFC is enabled
-            if (!mIsNfcEnabled) {
-                return null;
-            }
-
-            /* find the device in the hmap */
-            device = (NativeP2pDevice) findObject(nativeHandle);
-            if (device != null) {
-                byte[] buff = device.doTransceive(data);
-                if (buff == null)
-                    return null;
-                return buff;
-            }
-            return null;
-        }
-    };
-
-    private class NfcHandler extends Handler {
-
-        @Override
-        public void handleMessage(Message msg) {
-            try {
-
-            } catch (Exception e) {
-                // Log, don't crash!
-                Log.e(TAG, "Exception in NfcHandler.handleMessage:", e);
-            }
-        }
-
-    };
-
-    public NfcService(Context context) {
-        super();
-        mContext = context;
-        mManager = new NativeNfcManager(mContext);
-
-        mContext.registerReceiver(mNfcServiceReceiver, new IntentFilter(
-                NativeNfcManager.INTERNAL_LLCP_LINK_STATE_CHANGED_ACTION));
-
-        mContext.registerReceiver(mNfcServiceReceiver, new IntentFilter(
-                NfcAdapter.ACTION_LLCP_LINK_STATE_CHANGED));
-
-        mContext.registerReceiver(mNfcServiceReceiver, new IntentFilter(
-                NativeNfcManager.INTERNAL_TARGET_DESELECTED_ACTION));
-
-        Thread thread = new Thread(null, this, "NfcService");
-        thread.start();
-
-        mManager.initializeNativeStructure();
-
-            int nfcState = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_ON, 0);
-
-            if (nfcState == NFC_STATE_ENABLED) {
-                if (this._enable()) {
-                }
-            }
-
-    }
-
-    public void run() {
-        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-        Looper.prepare();
-        mNfcHandler = new NfcHandler();
-        Looper.loop();
-    }
-
-    public void cancel() throws RemoteException {
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_RAW,
-                "NFC_RAW permission required to cancel NFC opening");
-        if (mOpenPending) {
-            mOpenPending = false;
-            mManager.doCancel();
-            /* Restart polling loop for notification */
-            mManager.enableDiscovery(DISCOVERY_MODE_READER);
-        }
-    }
-
-    public int createLlcpConnectionlessSocket(int sap) throws RemoteException {
-
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_LLCP,
-                "NFC_LLCP permission required for LLCP operations with NFC service");
-
-        /* Check SAP is not already used */
-
-        /* Check nb socket created */
-        if (mNbSocketCreated < LLCP_SOCKET_NB_MAX) {
-            /* Store the socket handle */
-            int sockeHandle = mGeneratedSocketHandle;
-
-            if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                NativeLlcpConnectionlessSocket socket;
-
-                socket = mManager.doCreateLlcpConnectionlessSocket(sap);
-                if (socket != null) {
-                    /* Update the number of socket created */
-                    mNbSocketCreated++;
-
-                    /* Add the socket into the socket map */
-                    mSocketMap.put(sockeHandle, socket);
-
-                    return sockeHandle;
-                } else {
-                    /*
-                     * socket creation error - update the socket handle
-                     * generation
-                     */
-                    mGeneratedSocketHandle -= 1;
-
-                    /* Get Error Status */
-                    int errorStatus = mManager.doGetLastError();
-
-                    switch (errorStatus) {
-                        case ErrorCodes.ERROR_BUFFER_TO_SMALL:
-                            return ErrorCodes.ERROR_BUFFER_TO_SMALL;
-                        case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
-                            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-                        default:
-                            return ErrorCodes.ERROR_SOCKET_CREATION;
-                    }
-                }
-            } else {
-                /* Check SAP is not already used */
-                if (!CheckSocketSap(sap)) {
-                    return ErrorCodes.ERROR_SAP_USED;
-                }
-
-                NativeLlcpConnectionlessSocket socket = new NativeLlcpConnectionlessSocket(sap);
-
-                /* Add the socket into the socket map */
-                mSocketMap.put(sockeHandle, socket);
-
-                /* Update the number of socket created */
-                mNbSocketCreated++;
-
-                /* Create new registered socket */
-                RegisteredSocket registeredSocket = new RegisteredSocket(
-                        LLCP_CONNECTIONLESS_SOCKET_TYPE, sockeHandle, sap);
-
-                /* Put this socket into a list of registered socket */
-                mRegisteredSocketList.add(registeredSocket);
-            }
-
-            /* update socket handle generation */
-            mGeneratedSocketHandle++;
-
-            return sockeHandle;
-
-        } else {
-            /* No socket available */
-            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-        }
-
-    }
-
-    public int createLlcpServiceSocket(int sap, String sn, int miu, int rw, int linearBufferLength)
-            throws RemoteException {
-
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_LLCP,
-                "NFC_LLCP permission required for LLCP operations with NFC service");
-
-        if (mNbSocketCreated < LLCP_SOCKET_NB_MAX) {
-            int sockeHandle = mGeneratedSocketHandle;
-
-            if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                NativeLlcpServiceSocket socket;
-
-                socket = mManager.doCreateLlcpServiceSocket(sap, sn, miu, rw, linearBufferLength);
-                if (socket != null) {
-                    /* Update the number of socket created */
-                    mNbSocketCreated++;
-                    /* Add the socket into the socket map */
-                    mSocketMap.put(sockeHandle, socket);
-                } else {
-                    /* socket creation error - update the socket handle counter */
-                    mGeneratedSocketHandle -= 1;
-
-                    /* Get Error Status */
-                    int errorStatus = mManager.doGetLastError();
-
-                    switch (errorStatus) {
-                        case ErrorCodes.ERROR_BUFFER_TO_SMALL:
-                            return ErrorCodes.ERROR_BUFFER_TO_SMALL;
-                        case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
-                            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-                        default:
-                            return ErrorCodes.ERROR_SOCKET_CREATION;
-                    }
-                }
-            } else {
-
-                /* Check SAP is not already used */
-                if (!CheckSocketSap(sap)) {
-                    return ErrorCodes.ERROR_SAP_USED;
-                }
-
-                /* Service Name */
-                if (!CheckSocketServiceName(sn)) {
-                    return ErrorCodes.ERROR_SERVICE_NAME_USED;
-                }
-
-                /* Check socket options */
-                if (!CheckSocketOptions(miu, rw, linearBufferLength)) {
-                    return ErrorCodes.ERROR_SOCKET_OPTIONS;
-                }
-
-                NativeLlcpServiceSocket socket = new NativeLlcpServiceSocket(sn);
-
-                /* Add the socket into the socket map */
-                mSocketMap.put(sockeHandle, socket);
-
-                /* Update the number of socket created */
-                mNbSocketCreated++;
-
-                /* Create new registered socket */
-                RegisteredSocket registeredSocket = new RegisteredSocket(LLCP_SERVICE_SOCKET_TYPE,
-                        sockeHandle, sap, sn, miu, rw, linearBufferLength);
-
-                /* Put this socket into a list of registered socket */
-                mRegisteredSocketList.add(registeredSocket);
-            }
-
-            /* update socket handle generation */
-            mGeneratedSocketHandle += 1;
-
-            Log.d(TAG, "Llcp Service Socket Handle =" + sockeHandle);
-            return sockeHandle;
-        } else {
-            /* No socket available */
-            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-        }
-    }
-
-    public int createLlcpSocket(int sap, int miu, int rw, int linearBufferLength)
-            throws RemoteException {
-
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_LLCP,
-                "NFC_LLCP permission required for LLCP operations with NFC service");
-
-        if (mNbSocketCreated < LLCP_SOCKET_NB_MAX) {
-
-            int sockeHandle = mGeneratedSocketHandle;
-
-            if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                NativeLlcpSocket socket;
-
-                socket = mManager.doCreateLlcpSocket(sap, miu, rw, linearBufferLength);
-
-                if (socket != null) {
-                    /* Update the number of socket created */
-                    mNbSocketCreated++;
-                    /* Add the socket into the socket map */
-                    mSocketMap.put(sockeHandle, socket);
-                } else {
-                    /*
-                     * socket creation error - update the socket handle
-                     * generation
-                     */
-                    mGeneratedSocketHandle -= 1;
-
-                    /* Get Error Status */
-                    int errorStatus = mManager.doGetLastError();
-
-                    switch (errorStatus) {
-                        case ErrorCodes.ERROR_BUFFER_TO_SMALL:
-                            return ErrorCodes.ERROR_BUFFER_TO_SMALL;
-                        case ErrorCodes.ERROR_INSUFFICIENT_RESOURCES:
-                            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-                        default:
-                            return ErrorCodes.ERROR_SOCKET_CREATION;
-                    }
-                }
-            } else {
-
-                /* Check SAP is not already used */
-                if (!CheckSocketSap(sap)) {
-                    return ErrorCodes.ERROR_SAP_USED;
-                }
-
-                /* Check Socket options */
-                if (!CheckSocketOptions(miu, rw, linearBufferLength)) {
-                    return ErrorCodes.ERROR_SOCKET_OPTIONS;
-                }
-
-                NativeLlcpSocket socket = new NativeLlcpSocket(sap, miu, rw);
-
-                /* Add the socket into the socket map */
-                mSocketMap.put(sockeHandle, socket);
-
-                /* Update the number of socket created */
-                mNbSocketCreated++;
-                /* Create new registered socket */
-                RegisteredSocket registeredSocket = new RegisteredSocket(LLCP_SOCKET_TYPE,
-                        sockeHandle, sap, miu, rw, linearBufferLength);
-
-                /* Put this socket into a list of registered socket */
-                mRegisteredSocketList.add(registeredSocket);
-            }
-
-            /* update socket handle generation */
-            mGeneratedSocketHandle++;
-
-            return sockeHandle;
-        } else {
-            /* No socket available */
-            return ErrorCodes.ERROR_INSUFFICIENT_RESOURCES;
-        }
-    }
-
-    public int deselectSecureElement() throws RemoteException {
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        if (mSelectedSeId == 0) {
-            return ErrorCodes.ERROR_NO_SE_CONNECTED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_ADMIN,
-                "NFC_ADMIN permission required to deselect NFC Secure Element");
-
-            mManager.doDeselectSecureElement(mSelectedSeId);
-        mNfcSecureElementState = 0;
-            mSelectedSeId = 0;
-
-        /* Store that a secure element is deselected */
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NFC_SECURE_ELEMENT_ON, 0);
-
-        /* Reset Secure Element ID */
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NFC_SECURE_ELEMENT_ID, 0);
-
-
-        return ErrorCodes.SUCCESS;
-    }
-
-    public boolean disable() throws RemoteException {
-        boolean isSuccess = false;
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_ADMIN,
-                "NFC_ADMIN permission required to disable NFC service");
-        if (isEnabled()) {
-            isSuccess = mManager.deinitialize();
-            if (isSuccess) {
-                mIsNfcEnabled = false;
-            }
-        }
-
-        updateNfcOnSetting();
-
-        return isSuccess;
-    }
-
-    public boolean enable() throws RemoteException {
-        boolean isSuccess = false;
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_ADMIN,
-                "NFC_ADMIN permission required to enable NFC service");
-        if (!isEnabled()) {
-            reset();
-            isSuccess = _enable();
-        }
-        return isSuccess;
-    }
-
-    private boolean _enable() {
-        boolean isSuccess = mManager.initialize();
-        if (isSuccess) {
-            /* Check persistent properties */
-            checkProperties();
-
-            /* Check Secure Element setting */
-            mNfcSecureElementState = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_SECURE_ELEMENT_ON, 0);
-
-            if (mNfcSecureElementState == 1) {
-
-                int secureElementId = Settings.System.getInt(mContext.getContentResolver(),
-                        Settings.System.NFC_SECURE_ELEMENT_ID, 0);
-                int[] Se_list = mManager.doGetSecureElementList();
-                if (Se_list != null) {
-                    for (int i = 0; i < Se_list.length; i++) {
-                        if (Se_list[i] == secureElementId) {
-                            mManager.doSelectSecureElement(Se_list[i]);
-                            mSelectedSeId = Se_list[i];
-                            break;
-                        }
-                    }
-                }
-            }
-
-            /* Start polling loop */
-            mManager.enableDiscovery(DISCOVERY_MODE_READER);
-
-            mIsNfcEnabled = true;
-        } else {
-            mIsNfcEnabled = false;
-        }
-
-        updateNfcOnSetting();
-
-        return isSuccess;
-    }
-
-    private void updateNfcOnSetting() {
-        int state;
-
-        if (mIsNfcEnabled) {
-            state = NFC_STATE_ENABLED;
-        } else {
-            state = NFC_STATE_DISABLED;
-        }
-
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_ON, state);
-    }
-
-    private void checkProperties() {
-        int value;
-
-        /* LLCP LTO */
-        value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_LTO,
-                LLCP_LTO_DEFAULT_VALUE);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_LTO, value);
-        mManager.doSetProperties(PROPERTY_LLCP_LTO, value);
-
-        /* LLCP MIU */
-        value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_MIU,
-                LLCP_MIU_DEFAULT_VALUE);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_MIU, value);
-        mManager.doSetProperties(PROPERTY_LLCP_MIU, value);
-
-        /* LLCP WKS */
-        value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_WKS,
-                LLCP_WKS_DEFAULT_VALUE);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_WKS, value);
-        mManager.doSetProperties(PROPERTY_LLCP_WKS, value);
-
-        /* LLCP OPT */
-        value = Settings.System.getInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_OPT,
-                LLCP_OPT_DEFAULT_VALUE);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_OPT, value);
-        mManager.doSetProperties(PROPERTY_LLCP_OPT, value);
-
-        /* NFC READER A */
-        value = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_DISCOVERY_A, 1);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_A,
-                value);
-        mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_A, value);
-
-        /* NFC READER B */
-        value = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_DISCOVERY_B, 1);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_B,
-                value);
-        mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_B, value);
-
-        /* NFC READER F */
-        value = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_DISCOVERY_F, 1);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_F,
-                value);
-        mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_F, value);
-
-        /* NFC READER 15693 */
-        value = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_DISCOVERY_15693, 1);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_15693,
-                value);
-        mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_15693, value);
-
-        /* NFC NFCIP */
-        value = Settings.System.getInt(mContext.getContentResolver(),
-                Settings.System.NFC_DISCOVERY_NFCIP, 1);
-        Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_NFCIP,
-                value);
-        mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_NFCIP, value);
-    }
-
-    public ILlcpConnectionlessSocket getLlcpConnectionlessInterface() throws RemoteException {
-        return mLlcpConnectionlessSocketService;
-    }
-
-    public ILlcpSocket getLlcpInterface() throws RemoteException {
-        return mLlcpSocket;
-    }
-
-    public ILlcpServiceSocket getLlcpServiceInterface() throws RemoteException {
-        return mLlcpServerSocketService;
-    }
-
-    public INfcTag getNfcTagInterface() throws RemoteException {
-        return mNfcTagService;
-    }
-
-    public int getOpenTimeout() throws RemoteException {
-        return mTimeout;
-    }
-
-    public IP2pInitiator getP2pInitiatorInterface() throws RemoteException {
-        return mP2pInitiatorService;
-    }
-
-    public IP2pTarget getP2pTargetInterface() throws RemoteException {
-        return mP2pTargetService;
-    }
-
-    public String getProperties(String param) throws RemoteException {
-        int value;
-
-        if (param == null) {
-            return "Wrong parameter";
-        }
-
-        if (param.equals(PROPERTY_LLCP_LTO_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_LLCP_LTO, 0);
-        } else if (param.equals(PROPERTY_LLCP_MIU_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_LLCP_MIU, 0);
-        } else if (param.equals(PROPERTY_LLCP_WKS_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_LLCP_WKS, 0);
-        } else if (param.equals(PROPERTY_LLCP_OPT_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_LLCP_OPT, 0);
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_A_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_A, 0);
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_B_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_B, 0);
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_F_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_F, 0);
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_NFCIP_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_NFCIP, 0);
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_15693_VALUE)) {
-            value = Settings.System.getInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_15693, 0);
-        } else {
-            return "Unknown property";
-        }
-
-        if (param.equals(PROPERTY_NFC_DISCOVERY_A_VALUE)
-                || param.equals(PROPERTY_NFC_DISCOVERY_B_VALUE)
-                || param.equals(PROPERTY_NFC_DISCOVERY_F_VALUE)
-                || param.equals(PROPERTY_NFC_DISCOVERY_NFCIP_VALUE)
-                || param.equals(PROPERTY_NFC_DISCOVERY_15693_VALUE)) {
-            if (value == 0) {
-                return "false";
-            } else if (value == 1) {
-                return "true";
-            } else {
-                return "Unknown Value";
-            }
-        }else{
-            return "" + value;
-        }
-
-    }
-
-    public int[] getSecureElementList() throws RemoteException {
-        int[] list = null;
-        if (mIsNfcEnabled == true) {
-            list = mManager.doGetSecureElementList();
-        }
-        return list;
-    }
-
-    public int getSelectedSecureElement() throws RemoteException {
-        return mSelectedSeId;
-    }
-
-    public boolean isEnabled() throws RemoteException {
-        return mIsNfcEnabled;
-    }
-
-    public int openP2pConnection() throws RemoteException {
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_RAW,
-                "NFC_RAW permission required to open NFC P2P connection");
-        if (!mOpenPending) {
-            NativeP2pDevice device;
-            mOpenPending = true;
-            device = mManager.doOpenP2pConnection(mTimeout);
-            if (device != null) {
-                /* add device to the Hmap */
-                mObjectMap.put(device.getHandle(), device);
-                return device.getHandle();
-            } else {
-                mOpenPending = false;
-                /* Restart polling loop for notification */
-                mManager.enableDiscovery(DISCOVERY_MODE_READER);
-                return ErrorCodes.ERROR_IO;
-            }
-        } else {
-            return ErrorCodes.ERROR_BUSY;
-        }
-
-    }
-
-    public void openTagConnection(Tag tag) throws RemoteException {
-        NativeNfcTag nativeTag = new NativeNfcTag(tag.getHandle(), "", tag.getId());
-
-        mObjectMap.put(nativeTag.getHandle(), nativeTag);
-    }
-
-    public int selectSecureElement(int seId) throws RemoteException {
-        // Check if NFC is enabled
-        if (!mIsNfcEnabled) {
-            return ErrorCodes.ERROR_NOT_INITIALIZED;
-        }
-
-        if (mSelectedSeId == seId) {
-            return ErrorCodes.ERROR_SE_ALREADY_SELECTED;
-        }
-
-        if (mSelectedSeId != 0) {
-            return ErrorCodes.ERROR_SE_CONNECTED;
-        }
-
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_ADMIN,
-                "NFC_ADMIN permission required to select NFC Secure Element");
-
-            mSelectedSeId = seId;
-            mManager.doSelectSecureElement(mSelectedSeId);
-
-        /* Store that a secure element is selected */
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NFC_SECURE_ELEMENT_ON, 1);
-
-        /* Store the ID of the Secure Element Selected */
-        Settings.System.putInt(mContext.getContentResolver(),
-                Settings.System.NFC_SECURE_ELEMENT_ID, mSelectedSeId);
-
-        mNfcSecureElementState = 1;
-
-        return ErrorCodes.SUCCESS;
-
-    }
-
-    public void setOpenTimeout(int timeout) throws RemoteException {
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_RAW,
-                "NFC_RAW permission required to set NFC connection timeout");
-        mTimeout = timeout;
-    }
-
-    public int setProperties(String param, String value) throws RemoteException {
-        mContext.enforceCallingPermission(android.Manifest.permission.NFC_ADMIN,
-                "NFC_ADMIN permission required to set NFC Properties");
-
-        if (isEnabled()) {
-            return ErrorCodes.ERROR_NFC_ON;
-        }
-
-        int val;
-
-        /* Check params validity */
-        if (param == null || value == null) {
-            return ErrorCodes.ERROR_INVALID_PARAM;
-        }
-
-        if (param.equals(PROPERTY_LLCP_LTO_VALUE)) {
-            val = Integer.parseInt(value);
-
-            /* Check params */
-            if (val > LLCP_LTO_MAX_VALUE)
-                return ErrorCodes.ERROR_INVALID_PARAM;
-
-            /* Store value */
-            Settings.System
-                    .putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_LTO, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_LLCP_LTO, val);
-
-        } else if (param.equals(PROPERTY_LLCP_MIU_VALUE)) {
-            val = Integer.parseInt(value);
-
-            /* Check params */
-            if ((val < LLCP_MIU_DEFAULT_VALUE) || (val > LLCP_MIU_MAX_VALUE))
-                return ErrorCodes.ERROR_INVALID_PARAM;
-
-            /* Store value */
-            Settings.System
-                    .putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_MIU, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_LLCP_MIU, val);
-
-        } else if (param.equals(PROPERTY_LLCP_WKS_VALUE)) {
-            val = Integer.parseInt(value);
-
-            /* Check params */
-            if (val > LLCP_WKS_MAX_VALUE)
-                return ErrorCodes.ERROR_INVALID_PARAM;
-
-            /* Store value */
-            Settings.System
-                    .putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_WKS, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_LLCP_WKS, val);
-
-        } else if (param.equals(PROPERTY_LLCP_OPT_VALUE)) {
-            val = Integer.parseInt(value);
-
-            /* Check params */
-            if (val > LLCP_OPT_MAX_VALUE)
-                return ErrorCodes.ERROR_INVALID_PARAM;
-
-            /* Store value */
-            Settings.System
-                    .putInt(mContext.getContentResolver(), Settings.System.NFC_LLCP_OPT, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_LLCP_OPT, val);
-
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_A_VALUE)) {
-
-            /* Check params */
-            if (value.equals("true")) {
-                val = 1;
-            } else if (value.equals("false")) {
-                val = 0;
-            } else {
-                return ErrorCodes.ERROR_INVALID_PARAM;
-            }
-            /* Store value */
-            Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_A,
-                    val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_A, val);
-
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_B_VALUE)) {
-
-            /* Check params */
-            if (value.equals("true")) {
-                val = 1;
-            } else if (value.equals("false")) {
-                val = 0;
-            } else {
-                return ErrorCodes.ERROR_INVALID_PARAM;
-            }
-
-            /* Store value */
-            Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_B,
-                    val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_B, val);
-
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_F_VALUE)) {
-
-            /* Check params */
-            if (value.equals("true")) {
-                val = 1;
-            } else if (value.equals("false")) {
-                val = 0;
-            } else {
-                return ErrorCodes.ERROR_INVALID_PARAM;
-            }
-
-            /* Store value */
-            Settings.System.putInt(mContext.getContentResolver(), Settings.System.NFC_DISCOVERY_F,
-                    val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_F, val);
-
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_15693_VALUE)) {
-
-            /* Check params */
-            if (value.equals("true")) {
-                val = 1;
-            } else if (value.equals("false")) {
-                val = 0;
-            } else {
-                return ErrorCodes.ERROR_INVALID_PARAM;
-            }
-
-            /* Store value */
-            Settings.System.putInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_15693, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_15693, val);
-
-        } else if (param.equals(PROPERTY_NFC_DISCOVERY_NFCIP_VALUE)) {
-
-            /* Check params */
-            if (value.equals("true")) {
-                val = 1;
-            } else if (value.equals("false")) {
-                val = 0;
-            } else {
-                return ErrorCodes.ERROR_INVALID_PARAM;
-            }
-
-            /* Store value */
-            Settings.System.putInt(mContext.getContentResolver(),
-                    Settings.System.NFC_DISCOVERY_NFCIP, val);
-
-            /* Update JNI */
-            mManager.doSetProperties(PROPERTY_NFC_DISCOVERY_NFCIP, val);
-        } else {
-            return ErrorCodes.ERROR_INVALID_PARAM;
-        }
-
-        return ErrorCodes.SUCCESS;
-    }
-
-    public NdefMessage localGet() throws RemoteException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    public void localSet(NdefMessage message) throws RemoteException {
-        // TODO Auto-generated method stub
-
-    }
-
-    // Reset all internals
-    private void reset() {
-
-        // Clear tables
-        mObjectMap.clear();
-        mSocketMap.clear();
-        mRegisteredSocketList.clear();
-
-        // Reset variables
-        mLlcpLinkState = NfcAdapter.LLCP_LINK_STATE_DEACTIVATED;
-        mNbSocketCreated = 0;
-        mIsNfcEnabled = false;
-        mSelectedSeId = 0;
-        mTimeout = 0;
-        mNfcState = NFC_STATE_DISABLED;
-        mOpenPending = false;
-    }
-
-    private Object findObject(int key) {
-        Object device = null;
-
-        device = mObjectMap.get(key);
-        if (device == null) {
-            Log.w(TAG, "Handle not found !");
-        }
-
-        return device;
-    }
-
-    private void RemoveObject(int key) {
-        mObjectMap.remove(key);
-    }
-
-    private Object findSocket(int key) {
-        Object socket = null;
-
-        socket = mSocketMap.get(key);
-
-        return socket;
-    }
-
-    private void RemoveSocket(int key) {
-        mSocketMap.remove(key);
-    }
-
-    private boolean CheckSocketSap(int sap) {
-        /* List of sockets registered */
-        ListIterator<RegisteredSocket> it = mRegisteredSocketList.listIterator();
-
-        while (it.hasNext()) {
-            RegisteredSocket registeredSocket = it.next();
-
-            if (sap == registeredSocket.mSap) {
-                /* SAP already used */
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean CheckSocketOptions(int miu, int rw, int linearBufferlength) {
-
-        if (rw > LLCP_RW_MAX_VALUE || miu < LLCP_MIU_DEFAULT_VALUE || linearBufferlength < miu) {
-            return false;
-        }
-        return true;
-    }
-
-    private boolean CheckSocketServiceName(String sn) {
-
-        /* List of sockets registered */
-        ListIterator<RegisteredSocket> it = mRegisteredSocketList.listIterator();
-
-        while (it.hasNext()) {
-            RegisteredSocket registeredSocket = it.next();
-
-            if (sn.equals(registeredSocket.mServiceName)) {
-                /* Service Name already used */
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private void RemoveRegisteredSocket(int nativeHandle) {
-        /* check if sockets are registered */
-        ListIterator<RegisteredSocket> it = mRegisteredSocketList.listIterator();
-
-        while (it.hasNext()) {
-            RegisteredSocket registeredSocket = it.next();
-            if (registeredSocket.mHandle == nativeHandle) {
-                /* remove the registered socket from the list */
-                it.remove();
-                Log.d(TAG, "socket removed");
-            }
-        }
-    }
-
-    /*
-     * RegisteredSocket class to store the creation request of socket until the
-     * LLCP link in not activated
-     */
-    private class RegisteredSocket {
-        private final int mType;
-
-        private final int mHandle;
-
-        private final int mSap;
-
-        private int mMiu;
-
-        private int mRw;
-
-        private String mServiceName;
-
-        private int mlinearBufferLength;
-
-        RegisteredSocket(int type, int handle, int sap, String sn, int miu, int rw,
-                int linearBufferLength) {
-            mType = type;
-            mHandle = handle;
-            mSap = sap;
-            mServiceName = sn;
-            mRw = rw;
-            mMiu = miu;
-            mlinearBufferLength = linearBufferLength;
-        }
-
-        RegisteredSocket(int type, int handle, int sap, int miu, int rw, int linearBufferLength) {
-            mType = type;
-            mHandle = handle;
-            mSap = sap;
-            mRw = rw;
-            mMiu = miu;
-            mlinearBufferLength = linearBufferLength;
-        }
-
-        RegisteredSocket(int type, int handle, int sap) {
-            mType = type;
-            mHandle = handle;
-            mSap = sap;
-        }
-    }
-
-    private final BroadcastReceiver mNfcServiceReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            Log.d(TAG, "Internal NFC Intent received");
-
-            /* LLCP Link deactivation */
-            if (intent.getAction().equals(NfcAdapter.ACTION_LLCP_LINK_STATE_CHANGED)) {
-                mLlcpLinkState = intent.getIntExtra(NfcAdapter.EXTRA_LLCP_LINK_STATE_CHANGED,
-                        NfcAdapter.LLCP_LINK_STATE_DEACTIVATED);
-
-                if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_DEACTIVATED) {
-                    /* restart polling loop */
-                    mManager.enableDiscovery(DISCOVERY_MODE_READER);
-                }
-
-            }
-            /* LLCP Link activation */
-            else if (intent.getAction().equals(
-                    NativeNfcManager.INTERNAL_LLCP_LINK_STATE_CHANGED_ACTION)) {
-
-                mLlcpLinkState = intent.getIntExtra(
-                        NativeNfcManager.INTERNAL_LLCP_LINK_STATE_CHANGED_EXTRA,
-                        NfcAdapter.LLCP_LINK_STATE_DEACTIVATED);
-
-                if (mLlcpLinkState == NfcAdapter.LLCP_LINK_STATE_ACTIVATED) {
-                    /* check if sockets are registered */
-                    ListIterator<RegisteredSocket> it = mRegisteredSocketList.listIterator();
-
-                    Log.d(TAG, "Nb socket resgistered = " + mRegisteredSocketList.size());
-
-                    while (it.hasNext()) {
-                        RegisteredSocket registeredSocket = it.next();
-
-                        switch (registeredSocket.mType) {
-                            case LLCP_SERVICE_SOCKET_TYPE:
-                                Log.d(TAG, "Registered Llcp Service Socket");
-                                NativeLlcpServiceSocket serviceSocket;
-
-                                serviceSocket = mManager.doCreateLlcpServiceSocket(
-                                        registeredSocket.mSap, registeredSocket.mServiceName,
-                                        registeredSocket.mMiu, registeredSocket.mRw,
-                                        registeredSocket.mlinearBufferLength);
-
-                                if (serviceSocket != null) {
-                                    /* Add the socket into the socket map */
-                                    mSocketMap.put(registeredSocket.mHandle, serviceSocket);
-                                } else {
-                                    /*
-                                     * socket creation error - update the socket
-                                     * handle counter
-                                     */
-                                    mGeneratedSocketHandle -= 1;
-                                }
-                                break;
-
-                            case LLCP_SOCKET_TYPE:
-                                Log.d(TAG, "Registered Llcp Socket");
-                                NativeLlcpSocket clientSocket;
-                                clientSocket = mManager.doCreateLlcpSocket(registeredSocket.mSap,
-                                        registeredSocket.mMiu, registeredSocket.mRw,
-                                        registeredSocket.mlinearBufferLength);
-                                if (clientSocket != null) {
-                                    /* Add the socket into the socket map */
-                                    mSocketMap.put(registeredSocket.mHandle, clientSocket);
-                                } else {
-                                    /*
-                                     * socket creation error - update the socket
-                                     * handle counter
-                                     */
-                                    mGeneratedSocketHandle -= 1;
-                                }
-                                break;
-
-                            case LLCP_CONNECTIONLESS_SOCKET_TYPE:
-                                Log.d(TAG, "Registered Llcp Connectionless Socket");
-                                NativeLlcpConnectionlessSocket connectionlessSocket;
-                                connectionlessSocket = mManager
-                                        .doCreateLlcpConnectionlessSocket(registeredSocket.mSap);
-                                if (connectionlessSocket != null) {
-                                    /* Add the socket into the socket map */
-                                    mSocketMap.put(registeredSocket.mHandle, connectionlessSocket);
-                                } else {
-                                    /*
-                                     * socket creation error - update the socket
-                                     * handle counter
-                                     */
-                                    mGeneratedSocketHandle -= 1;
-                                }
-                                break;
-
-                        }
-                    }
-
-                    /* Remove all registered socket from the list */
-                    mRegisteredSocketList.clear();
-
-                    /* Broadcast Intent Link LLCP activated */
-                    Intent LlcpLinkIntent = new Intent();
-                    LlcpLinkIntent.setAction(NfcAdapter.ACTION_LLCP_LINK_STATE_CHANGED);
-
-                    LlcpLinkIntent.putExtra(NfcAdapter.EXTRA_LLCP_LINK_STATE_CHANGED,
-                            NfcAdapter.LLCP_LINK_STATE_ACTIVATED);
-
-                    Log.d(TAG, "Broadcasting LLCP activation");
-                    mContext.sendOrderedBroadcast(LlcpLinkIntent,
-                            android.Manifest.permission.NFC_LLCP);
-                }
-            }
-            /* Target Deactivated */
-            else if (intent.getAction().equals(
-                    NativeNfcManager.INTERNAL_TARGET_DESELECTED_ACTION)) {
-                if(mOpenPending != false){
-                    mOpenPending = false;
-                }
-                /* Restart polling loop for notification */
-                mManager.enableDiscovery(DISCOVERY_MODE_READER);
-
-            }
-        }
-    };
-}
\ No newline at end of file
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java
index f41f156c..1df08c0 100644
--- a/voip/java/com/android/server/sip/SipService.java
+++ b/voip/java/com/android/server/sip/SipService.java
@@ -55,7 +55,6 @@
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Timer;
@@ -67,8 +66,8 @@
  * @hide
  */
 public final class SipService extends ISipService.Stub {
-    private static final String TAG = "SipService";
-    private static final boolean DEBUGV = false;
+    static final String TAG = "SipService";
+    static final boolean DEBUGV = false;
     private static final boolean DEBUG = true;
     private static final boolean DEBUG_TIMER = DEBUG && false;
     private static final int EXPIRY_TIME = 3600;
@@ -95,7 +94,7 @@
 
     private ConnectivityReceiver mConnectivityReceiver;
     private boolean mWifiEnabled;
-    private MyWakeLock mMyWakeLock;
+    private SipWakeLock mMyWakeLock;
 
     /**
      * Starts the SIP service. Do nothing if the SIP API is not supported on the
@@ -117,7 +116,7 @@
                 new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
         context.registerReceiver(mWifiStateReceiver,
                 new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
-        mMyWakeLock = new MyWakeLock((PowerManager)
+        mMyWakeLock = new SipWakeLock((PowerManager)
                 context.getSystemService(Context.POWER_SERVICE));
 
         mTimer = new WakeupTimer(context);
@@ -459,7 +458,8 @@
         private SipSessionGroup createSipSessionGroup(String localIp,
                 SipProfile localProfile, String password) throws SipException {
             try {
-                return new SipSessionGroup(localIp, localProfile, password);
+                return new SipSessionGroup(localIp, localProfile, password,
+                        mMyWakeLock);
             } catch (IOException e) {
                 // network disconnected
                 Log.w(TAG, "createSipSessionGroup(): network disconnected?");
@@ -546,6 +546,7 @@
         @Override
         public void onRinging(ISipSession s, SipProfile caller,
                 String sessionDescription) {
+            if (DEBUGV) Log.d(TAG, "<<<<< onRinging()");
             SipSessionGroup.SipSessionImpl session =
                     (SipSessionGroup.SipSessionImpl) s;
             synchronized (SipService.this) {
@@ -1360,41 +1361,4 @@
             }
         }
     }
-
-    private static class MyWakeLock {
-        private PowerManager mPowerManager;
-        private PowerManager.WakeLock mWakeLock;
-        private HashSet<Object> mHolders = new HashSet<Object>();
-
-        MyWakeLock(PowerManager powerManager) {
-            mPowerManager = powerManager;
-        }
-
-        synchronized void reset() {
-            mHolders.clear();
-            release(null);
-            if (DEBUGV) Log.v(TAG, "~~~ hard reset wakelock");
-        }
-
-        synchronized void acquire(Object holder) {
-            mHolders.add(holder);
-            if (mWakeLock == null) {
-                mWakeLock = mPowerManager.newWakeLock(
-                        PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock");
-            }
-            if (!mWakeLock.isHeld()) mWakeLock.acquire();
-            if (DEBUGV) Log.v(TAG, "acquire wakelock: holder count="
-                    + mHolders.size());
-        }
-
-        synchronized void release(Object holder) {
-            mHolders.remove(holder);
-            if ((mWakeLock != null) && mHolders.isEmpty()
-                    && mWakeLock.isHeld()) {
-                mWakeLock.release();
-            }
-            if (DEBUGV) Log.v(TAG, "release wakelock: holder count="
-                    + mHolders.size());
-        }
-    }
 }
diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java
index 2b8058f..d861fa5 100644
--- a/voip/java/com/android/server/sip/SipSessionGroup.java
+++ b/voip/java/com/android/server/sip/SipSessionGroup.java
@@ -84,6 +84,7 @@
     private static final String ANONYMOUS = "anonymous";
     private static final int EXPIRY_TIME = 3600; // in seconds
     private static final int CANCEL_CALL_TIMER = 3; // in seconds
+    private static final long WAKE_LOCK_HOLDING_TIME = 500; // in milliseconds
 
     private static final EventObject DEREGISTER = new EventObject("Deregister");
     private static final EventObject END_CALL = new EventObject("End call");
@@ -101,6 +102,8 @@
     private SipSessionImpl mCallReceiverSession;
     private String mLocalIp;
 
+    private SipWakeLock mWakeLock;
+
     // call-id-to-SipSession map
     private Map<String, SipSessionImpl> mSessionMap =
             new HashMap<String, SipSessionImpl>();
@@ -110,10 +113,11 @@
      * @param password the password of the profile
      * @throws IOException if cannot assign requested address
      */
-    public SipSessionGroup(String localIp, SipProfile myself, String password)
-            throws SipException, IOException {
+    public SipSessionGroup(String localIp, SipProfile myself, String password,
+            SipWakeLock wakeLock) throws SipException, IOException {
         mLocalProfile = myself;
         mPassword = password;
+        mWakeLock = wakeLock;
         reset(localIp);
     }
 
@@ -271,7 +275,14 @@
         }
     }
 
-    public void processRequest(RequestEvent event) {
+    public void processRequest(final RequestEvent event) {
+        if (isRequestEvent(Request.INVITE, event)) {
+            if (DEBUG) Log.d(TAG, "<<<<< got INVITE, thread:"
+                    + Thread.currentThread());
+            // Acquire a wake lock and keep it for WAKE_LOCK_HOLDING_TIME;
+            // should be large enough to bring up the app.
+            mWakeLock.acquire(WAKE_LOCK_HOLDING_TIME);
+        }
         process(event);
     }
 
diff --git a/voip/java/com/android/server/sip/SipWakeLock.java b/voip/java/com/android/server/sip/SipWakeLock.java
new file mode 100644
index 0000000..52bc094
--- /dev/null
+++ b/voip/java/com/android/server/sip/SipWakeLock.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010, 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
+ *
+ *     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
+ * limitations under the License.
+ */
+
+package com.android.server.sip;
+
+import android.os.PowerManager;
+import android.util.Log;
+
+import java.util.HashSet;
+
+class SipWakeLock {
+    private static final boolean DEBUGV = SipService.DEBUGV;
+    private static final String TAG = SipService.TAG;
+    private PowerManager mPowerManager;
+    private PowerManager.WakeLock mWakeLock;
+    private PowerManager.WakeLock mTimerWakeLock;
+    private HashSet<Object> mHolders = new HashSet<Object>();
+
+    SipWakeLock(PowerManager powerManager) {
+        mPowerManager = powerManager;
+    }
+
+    synchronized void reset() {
+        mHolders.clear();
+        release(null);
+        if (DEBUGV) Log.v(TAG, "~~~ hard reset wakelock");
+    }
+
+    synchronized void acquire(long timeout) {
+        if (mTimerWakeLock == null) {
+            mTimerWakeLock = mPowerManager.newWakeLock(
+                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock.timer");
+            mTimerWakeLock.setReferenceCounted(true);
+        }
+        mTimerWakeLock.acquire(timeout);
+    }
+
+    synchronized void acquire(Object holder) {
+        mHolders.add(holder);
+        if (mWakeLock == null) {
+            mWakeLock = mPowerManager.newWakeLock(
+                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock");
+        }
+        if (!mWakeLock.isHeld()) mWakeLock.acquire();
+        if (DEBUGV) Log.v(TAG, "acquire wakelock: holder count="
+                + mHolders.size());
+    }
+
+    synchronized void release(Object holder) {
+        mHolders.remove(holder);
+        if ((mWakeLock != null) && mHolders.isEmpty()
+                && mWakeLock.isHeld()) {
+            mWakeLock.release();
+        }
+        if (DEBUGV) Log.v(TAG, "release wakelock: holder count="
+                + mHolders.size());
+    }
+}
diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java
index 06f6696..95e3945 100644
--- a/wifi/java/android/net/wifi/WifiStateTracker.java
+++ b/wifi/java/android/net/wifi/WifiStateTracker.java
@@ -840,9 +840,15 @@
         switch (msg.what) {
             case EVENT_SUPPLICANT_CONNECTION:
                 mRunState = RUN_STATE_RUNNING;
+                String macaddr;
                 synchronized (this) {
                     updateBatteryWorkSourceLocked(null);
+                    macaddr = WifiNative.getMacAddressCommand();
                 }
+                if (macaddr != null) {
+                    mWifiInfo.setMacAddress(macaddr);
+                }
+
                 checkUseStaticIp();
                 /* Reset notification state on new connection */
                 resetNotificationTimer();