Merge "Fix Screen state change command going two times after reboot"
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index e1cd59f..504d836 100755
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -153,7 +153,6 @@
                                         tNFA_DM_CBACK_DATA* eventData);
 static bool isPeerToPeer(tNFA_ACTIVATED& activated);
 static bool isListenMode(tNFA_ACTIVATED& activated);
-static void enableDisableLptd(bool enable);
 static tNFA_STATUS stopPolling_rfDiscoveryDisabled();
 static tNFA_STATUS startPolling_rfDiscoveryDisabled(
     tNFA_TECHNOLOGY_MASK tech_mask);
@@ -907,7 +906,13 @@
 **
 *******************************************************************************/
 static jboolean nfcManager_commitRouting(JNIEnv* e, jobject) {
-  return RoutingManager::getInstance().commitRouting();
+  if (sRfEnabled) {
+    /*Update routing table only in Idle state.*/
+    startRfDiscovery(false);
+  }
+  jboolean commitStatus = RoutingManager::getInstance().commitRouting();
+  startRfDiscovery(true);
+  return commitStatus;
 }
 
 /*******************************************************************************
@@ -1169,7 +1174,6 @@
   // Check polling configuration
   if (tech_mask != 0) {
     stopPolling_rfDiscoveryDisabled();
-    enableDisableLptd(enable_lptd);
     startPolling_rfDiscoveryDisabled(tech_mask);
 
     // Start P2P listening if tag polling was enabled
@@ -1257,52 +1261,6 @@
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: exit", __func__);
 }
 
-void enableDisableLptd(bool enable) {
-  // This method is *NOT* thread-safe. Right now
-  // it is only called from the same thread so it's
-  // not an issue.
-  static bool sCheckedLptd = false;
-  static bool sHasLptd = false;
-
-  tNFA_STATUS stat = NFA_STATUS_OK;
-  if (!sCheckedLptd) {
-    sCheckedLptd = true;
-    SyncEventGuard guard(sNfaGetConfigEvent);
-    tNFA_PMID configParam[1] = {NCI_PARAM_ID_TAGSNIFF_CFG};
-    stat = NFA_GetConfig(1, configParam);
-    if (stat != NFA_STATUS_OK) {
-      LOG(ERROR) << StringPrintf("%s: NFA_GetConfig failed", __func__);
-      return;
-    }
-    sNfaGetConfigEvent.wait();
-    if (sCurrentConfigLen < 4 || sConfig[1] != NCI_PARAM_ID_TAGSNIFF_CFG) {
-      LOG(ERROR) << StringPrintf(
-          "%s: Config TLV length %d returned is too short", __func__,
-          sCurrentConfigLen);
-      return;
-    }
-    if (sConfig[3] == 0) {
-      LOG(ERROR) << StringPrintf(
-          "%s: LPTD is disabled, not enabling in current config", __func__);
-      return;
-    }
-    sHasLptd = true;
-  }
-  // Bail if we checked and didn't find any LPTD config before
-  if (!sHasLptd) return;
-  uint8_t enable_byte = enable ? 0x01 : 0x00;
-
-  SyncEventGuard guard(sNfaSetConfigEvent);
-
-  stat = NFA_SetConfig(NCI_PARAM_ID_TAGSNIFF_CFG, 1, &enable_byte);
-  if (stat == NFA_STATUS_OK)
-    sNfaSetConfigEvent.wait();
-  else
-    LOG(ERROR) << StringPrintf("%s: Could not configure LPTD feature",
-                               __func__);
-  return;
-}
-
 /*******************************************************************************
 **
 ** Function:        nfcManager_doCreateLlcpServiceSocket
@@ -1578,20 +1536,22 @@
 **
 *******************************************************************************/
 static bool isListenMode(tNFA_ACTIVATED& activated) {
-  return ((NFC_DISCOVERY_TYPE_LISTEN_A ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_B ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_F ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 ==
-           activated.activate_ntf.rf_tech_param.mode) ||
-          (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME ==
-           activated.activate_ntf.rf_tech_param.mode));
+  return (
+      (NFC_DISCOVERY_TYPE_LISTEN_A ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_B ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_F ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_A_ACTIVE ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_F_ACTIVE ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_ISO15693 ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_DISCOVERY_TYPE_LISTEN_B_PRIME ==
+       activated.activate_ntf.rf_tech_param.mode) ||
+      (NFC_INTERFACE_EE_DIRECT_RF == activated.activate_ntf.intf_param.type));
 }
 
 /*******************************************************************************
@@ -1816,7 +1776,8 @@
   }
   if ((state == NFA_SCREEN_STATE_OFF_LOCKED ||
        state == NFA_SCREEN_STATE_OFF_UNLOCKED) &&
-      prevScreenState == NFA_SCREEN_STATE_ON_UNLOCKED) {
+      prevScreenState == NFA_SCREEN_STATE_ON_UNLOCKED && (!sP2pActive) &&
+      (!sSeRfActive)) {
     // screen turns off, disconnect tag if connected
     nativeNfcTag_doDisconnect(NULL, NULL);
   }
@@ -2062,20 +2023,6 @@
 **
 *******************************************************************************/
 void doStartupConfig() {
-  struct nfc_jni_native_data* nat = getNative(0, 0);
-  tNFA_STATUS stat = NFA_STATUS_FAILED;
-
-  // If polling for Active mode, set the ordering so that we choose Active over
-  // Passive mode first.
-  if (nat && (nat->tech_mask &
-              (NFA_TECHNOLOGY_MASK_A_ACTIVE | NFA_TECHNOLOGY_MASK_F_ACTIVE))) {
-    uint8_t act_mode_order_param[] = {0x01};
-    SyncEventGuard guard(sNfaSetConfigEvent);
-    stat = NFA_SetConfig(NCI_PARAM_ID_ACT_ORDER, sizeof(act_mode_order_param),
-                         &act_mode_order_param[0]);
-    if (stat == NFA_STATUS_OK) sNfaSetConfigEvent.wait();
-  }
-
   // configure RF polling frequency for each technology
   static tNFA_DM_DISC_FREQ_CFG nfa_dm_disc_freq_cfg;
   // values in the polling_frequency[] map to members of nfa_dm_disc_freq_cfg
diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp
index cc37431..ba2e3ab 100755
--- a/nci/jni/RoutingManager.cpp
+++ b/nci/jni/RoutingManager.cpp
@@ -84,6 +84,9 @@
     }
   }
 
+  mOffHostAidRoutingPowerState =
+      NfcConfig::getUnsigned(NAME_OFFHOST_AID_ROUTE_PWR_STATE, 0x01);
+
   memset(&mEeInfo, 0, sizeof(mEeInfo));
   mReceivedEeInfo = false;
   mSeTechMask = 0x00;
@@ -143,6 +146,8 @@
           (eeHandle == (mDefaultOffHostRoute | NFA_HANDLE_GROUP_EE))) {
         if (mEeInfo.ee_disc_info[i].la_protocol != 0)
           seTechMask |= NFA_TECHNOLOGY_MASK_A;
+        if (mEeInfo.ee_disc_info[i].lb_protocol != 0)
+          seTechMask |= NFA_TECHNOLOGY_MASK_B;
       }
       if ((mDefaultFelicaRoute != 0) &&
           (eeHandle == (mDefaultFelicaRoute | NFA_HANDLE_GROUP_EE))) {
@@ -359,8 +364,10 @@
                                    int route, int aidInfo) {
   static const char fn[] = "RoutingManager::addAidRouting";
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: enter", fn);
+  uint8_t powerState =
+      (route == mDefaultOffHostRoute) ? mOffHostAidRoutingPowerState : 0x01;
   tNFA_STATUS nfaStat =
-      NFA_EeAddAidRouting(route, aidLen, (uint8_t*)aid, 0x01, aidInfo);
+      NFA_EeAddAidRouting(route, aidLen, (uint8_t*)aid, powerState, aidInfo);
   if (nfaStat == NFA_STATUS_OK) {
     DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("%s: routed AID", fn);
     return true;
diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h
index 843d490..2d3f315 100755
--- a/nci/jni/RoutingManager.h
+++ b/nci/jni/RoutingManager.h
@@ -89,6 +89,7 @@
   uint16_t mDefaultSysCode;
   uint16_t mDefaultSysCodeRoute;
   uint8_t mDefaultSysCodePowerstate;
+  uint8_t mOffHostAidRoutingPowerState;
   bool mReceivedEeInfo;
   tNFA_EE_CBACK_DATA mCbEventData;
   tNFA_EE_DISCOVER_REQ mEeInfo;
diff --git a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
index 8040c24..abda625 100644
--- a/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
+++ b/nci/jni/extns/pn54x/src/utils/phNxpConfig.h
@@ -40,20 +40,6 @@
 #define NAME_NXP_RF_CONF_BLK_4 "NXP_RF_CONF_BLK_4"
 #define NAME_NXP_CORE_CONF_EXTN "NXP_CORE_CONF_EXTN"
 #define NAME_NXP_CORE_CONF "NXP_CORE_CONF"
-#define NAME_NXP_CORE_MFCKEY_SETTING "NXP_CORE_MFCKEY_SETTING"
-#define NAME_NXP_CORE_STANDBY "NXP_CORE_STANDBY"
-#define NAME_NXP_DEFAULT_SE "NXP_DEFAULT_SE"
-#define NAME_NXP_NFC_CHIP "NXP_NFC_CHIP"
-#define NAME_NXP_SWP_RD_START_TIMEOUT "NXP_SWP_RD_START_TIMEOUT"
-#define NAME_NXP_SWP_RD_TAG_OP_TIMEOUT "NXP_SWP_RD_TAG_OP_TIMEOUT"
-#define NAME_NXP_DEFAULT_NFCEE_TIMEOUT "NXP_DEFAULT_NFCEE_TIMEOUT"
-#define NAME_NXP_DEFAULT_NFCEE_DISC_TIMEOUT "NXP_DEFAULT_NFCEE_DISC_TIMEOUT"
-#define NAME_NXP_CE_ROUTE_STRICT_DISABLE "NXP_CE_ROUTE_STRICT_DISABLE"
-#define NAME_NXP_P61_LS_DEFAULT_INTERFACE "NXP_P61_LS_DEFAULT_INTERFACE"
-#define NAME_NXP_P61_JCOP_DEFAULT_INTERFACE "NXP_P61_JCOP_DEFAULT_INTERFACE"
-#define NAME_NXP_JCOPDL_AT_BOOT_ENABLE "NXP_JCOPDL_AT_BOOT_ENABLE"
-#define NAME_NXP_P61_LTSM_DEFAULT_INTERFACE "NXP_P61_LTSM_DEFAULT_INTERFACE"
-#define NAME_NXP_LOADER_SERICE_VERSION "NXP_LOADER_SERVICE_VERSION"
 /* default configuration */
 #define default_storage_location "/data/nfc"
 
diff --git a/src/com/android/nfc/ConfirmConnectToWifiNetworkActivity.java b/src/com/android/nfc/ConfirmConnectToWifiNetworkActivity.java
index b1b2542..9316993 100644
--- a/src/com/android/nfc/ConfirmConnectToWifiNetworkActivity.java
+++ b/src/com/android/nfc/ConfirmConnectToWifiNetworkActivity.java
@@ -114,7 +114,7 @@
 
     @Override
     public void onDismiss(DialogInterface dialog) {
-        if (!mEnableWifiInProgress) {
+        if (!mEnableWifiInProgress && !isChangingConfigurations()) {
             finish();
         }
     }
diff --git a/src/com/android/nfc/NfcDispatcher.java b/src/com/android/nfc/NfcDispatcher.java
index 23a3d51..f9ab131 100644
--- a/src/com/android/nfc/NfcDispatcher.java
+++ b/src/com/android/nfc/NfcDispatcher.java
@@ -224,7 +224,8 @@
         }
 
         public boolean isWebIntent() {
-            return ndefUri != null && ndefUri.normalizeScheme().getScheme().startsWith("http");
+            return ndefUri != null && ndefUri.normalizeScheme().getScheme() != null &&
+                ndefUri.normalizeScheme().getScheme().startsWith("http");
         }
 
         public String getUri() {
@@ -555,9 +556,13 @@
                 return false;
             }
             Intent appLaunchIntent = pm.getLaunchIntentForPackage(firstPackage);
-            if (appLaunchIntent != null && dispatch.tryStartActivity(appLaunchIntent)) {
-                if (DBG) Log.i(TAG, "matched AAR to application launch");
-                return true;
+            if (appLaunchIntent != null) {
+                ResolveInfo ri = pm.resolveActivity(appLaunchIntent, 0);
+                if (ri != null && ri.activityInfo != null && ri.activityInfo.exported &&
+                        dispatch.tryStartActivity(appLaunchIntent)) {
+                    if (DBG) Log.i(TAG, "matched AAR to application launch");
+                    return true;
+                }
             }
             // Find the package in Market:
             Intent marketIntent = getAppSearchIntent(firstPackage);
@@ -576,9 +581,18 @@
             return true;
         }
 
-        if (dispatch.tryStartActivity()) {
-            if (DBG) Log.i(TAG, "matched NDEF");
-            return true;
+        try {
+            UserHandle currentUser = new UserHandle(ActivityManager.getCurrentUser());
+            PackageManager pm = mContext.createPackageContextAsUser("android", 0,
+                        currentUser).getPackageManager();
+            ResolveInfo ri = pm.resolveActivity(intent, 0);
+
+            if (ri != null && ri.activityInfo != null && ri.activityInfo.exported && dispatch.tryStartActivity()) {
+                if (DBG) Log.i(TAG, "matched NDEF");
+                return true;
+            }
+        } catch (NameNotFoundException ignore) {
+            Log.e(TAG, "Could not create user package context");
         }
 
         return false;
@@ -620,7 +634,9 @@
             if (filterMatch(tagTechs, info.techs) &&
                     isComponentEnabled(pm, info.resolveInfo)) {
                 // Add the activity as a match if it's not already in the list
-                if (!matches.contains(info.resolveInfo)) {
+                // Check if exported flag is not explicitly set to false to prevent
+                // SecurityExceptions.
+                if (!matches.contains(info.resolveInfo) && info.resolveInfo.activityInfo.exported) {
                     matches.add(info.resolveInfo);
                 }
             }
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
old mode 100755
new mode 100644
index 18589d8..d6d4fd1
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -514,6 +514,14 @@
                 Context.SECURE_ELEMENT_SERVICE));
     }
 
+    private boolean isSEServiceAvailable() {
+        if (mSEService == null) {
+            mSEService = ISecureElementService.Stub.asInterface(ServiceManager.getService(
+                    Context.SECURE_ELEMENT_SERVICE));
+        }
+        return (mSEService != null);
+    }
+
     void initSoundPool() {
         synchronized (this) {
             if (mSoundPool == null) {
@@ -2241,7 +2249,7 @@
         }
 
         private void sendOffHostTransactionEvent(byte[] aid, byte[] data, byte[] readerByteArray) {
-            if (mSEService == null || mNfcEventInstalledPackages.isEmpty()) {
+            if (!isSEServiceAvailable() || mNfcEventInstalledPackages.isEmpty()) {
                 return;
             }
 
@@ -2281,7 +2289,7 @@
 
         /* Returns the list of packages that have access to NFC Events on any SE */
         private ArrayList<String> getSEAccessAllowedPackages() {
-            if (mSEService == null || mNfcEventInstalledPackages.isEmpty()) {
+            if (!isSEServiceAvailable() || mNfcEventInstalledPackages.isEmpty()) {
                 return null;
             }
             String[] readers = null;