Merge cherrypicks of [2647454, 2647904, 2647905, 2647455, 2648036, 2648037, 2648038, 2648039, 2648040, 2648041, 2648042, 2647918, 2647429, 2647906, 2647907, 2647951, 2647952, 2647953, 2647954, 2647955, 2648056, 2648057, 2648058, 2648059, 2648060, 2648061, 2648062, 2648063, 2648064, 2647919, 2648065, 2647908, 2648049, 2647909, 2647910, 2648066, 2648050, 2647430, 2647431, 2647432, 2647433, 2647434, 2647435, 2648076, 2648051] into nyc-mr1-security-e-release

Change-Id: I62499da2eabed94db84f211a8f27471e37bfd5dc
diff --git a/src/com/android/nfc/BeamShareActivity.java b/src/com/android/nfc/BeamShareActivity.java
index 5b8acac..f06bfdb 100644
--- a/src/com/android/nfc/BeamShareActivity.java
+++ b/src/com/android/nfc/BeamShareActivity.java
@@ -19,6 +19,8 @@
 import java.util.ArrayList;
 
 import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
 import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -26,6 +28,7 @@
 import android.content.ClipData;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.nfc.BeamShareData;
 import android.nfc.NdefMessage;
@@ -33,8 +36,11 @@
 import android.nfc.NfcAdapter;
 import android.os.Bundle;
 import android.os.UserHandle;
+import android.os.RemoteException;
 import android.util.Log;
+import android.util.EventLog;
 import android.webkit.URLUtil;
+import android.Manifest.permission;
 
 import com.android.internal.R;
 
@@ -211,16 +217,26 @@
             int numValidUris = 0;
             for (Uri uri : mUris) {
                 try {
+                    int uid = ActivityManagerNative.getDefault().getLaunchedFromUid(getActivityToken());
+                    if (uri.getScheme().equalsIgnoreCase("file") &&
+                            getApplicationContext().checkPermission(permission.READ_EXTERNAL_STORAGE, -1, uid) !=
+                            PackageManager.PERMISSION_GRANTED) {
+                        Log.e(TAG, "File based Uri doesn't have External Storage Permission.");
+                        EventLog.writeEvent(0x534e4554, "37287958", uid, uri.getPath());
+                        break;
+                    }
                     grantUriPermission("com.android.nfc", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
                     uriArray[numValidUris++] = uri;
                     if (DBG) Log.d(TAG, "Found uri: " + uri);
                 } catch (SecurityException e) {
                     Log.e(TAG, "Security exception granting uri permission to NFC process.");
-                    numValidUris = 0;
+                    break;
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Remote exception accessing uid of the calling process.");
                     break;
                 }
             }
-            if (numValidUris > 0) {
+            if (numValidUris != 0 && numValidUris == mUris.size()) {
                 shareData = new BeamShareData(null, uriArray, myUserHandle, 0);
             } else {
                 // No uris left