Prevent NPE when gallery (picasa) doesn't give us a cursor for the image
Ben Komalo [Wed, 27 Oct 2010 20:20:26 +0000 (13:20 -0700)]
(can happen on flaky network or in airplane mode, etc).

Bug: 3120721
Change-Id: I01945b6d0d0de10ca3d002c024cb173a57307632

res/values/strings.xml
src/com/android/apps/tag/EditTagActivity.java
src/com/android/apps/tag/record/ImageRecord.java

index f4045ff..e36cff1 100644 (file)
@@ -76,6 +76,9 @@
     <!-- Title for image type for writing content to a tag -->
     <string name="photo">Photo</string>
 
+    <!-- Error message when a selected photo could not be loaded -->
+    <string name="bad_photo">Could not open image.</string>
+
     <!-- Title for URL type for writing content to a tag -->
     <string name="url">URL</string>
 
index c1683d2..cbef8f0 100644 (file)
@@ -36,7 +36,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-
 import java.util.ArrayList;
 import java.util.Set;
 
@@ -146,6 +145,7 @@ public abstract class EditTagActivity extends Activity implements OnClickListene
 
     private void rebuildChildViews() {
         ViewGroup root = getContentRoot();
+        root.removeAllViews();
         for (RecordEditInfo editInfo : mRecords) {
             addViewForRecord(editInfo);
         }
@@ -202,24 +202,32 @@ public abstract class EditTagActivity extends Activity implements OnClickListene
     @Override
     public void deleteRecord(RecordEditInfo editInfo) {
         mRecords.remove(editInfo);
-        ViewGroup root = getContentRoot();
-        root.removeAllViews();
         rebuildChildViews();
     }
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if ((resultCode != RESULT_OK) || (data == null) || (mRecordWithOutstandingPick == null)) {
+        if ((resultCode != RESULT_OK) || (data == null)) {
+            mRecordWithOutstandingPick = null;
             return;
         }
+        if (mRecordWithOutstandingPick == null) {
+            return;
+        }
+
         // Handles results from another Activity that picked content to write to a tag.
         RecordEditInfo recordInfo = mRecordWithOutstandingPick;
-        recordInfo.handlePickResult(this, data);
+        try {
+            recordInfo.handlePickResult(this, data);
+        } catch (IllegalArgumentException ex) {
+            if (mRecords.contains(recordInfo)) {
+                deleteRecord(recordInfo);
+            }
+            return;
+        }
 
         if (mRecords.contains(recordInfo)) {
             // Editing an existing record. Just rebuild everything.
-            ViewGroup root = getContentRoot();
-            root.removeAllViews();
             rebuildChildViews();
 
         } else {
index 4361c9b..a012ea1 100644 (file)
@@ -28,6 +28,7 @@ import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.media.ThumbnailUtils;
+import android.net.Uri;
 import android.nfc.NdefRecord;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -38,6 +39,7 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import java.io.ByteArrayOutputStream;
 import java.util.List;
@@ -166,10 +168,20 @@ public class ImageRecord implements ParsedNdefRecord {
         public void handlePickResult(Context context, Intent data) {
             Cursor cursor = null;
             mCachedValue = null;
+
             try {
                 String[] projection = { MediaStore.Images.Media.DATA, OpenableColumns.SIZE };
                 cursor = context.getContentResolver().query(
                         data.getData(), projection, null, null, null);
+
+                if (cursor == null) {
+                    Toast.makeText(
+                            context,
+                            context.getResources().getString(R.string.bad_photo),
+                            Toast.LENGTH_LONG).show();
+                    throw new IllegalArgumentException("Selected image could not be loaded");
+                }
+
                 cursor.moveToFirst();
                 int size = cursor.getInt(1);
                 mCurrentPath = cursor.getString(0);