Restore tag records when re-starting MyTag activity.
Ben Komalo [Thu, 28 Oct 2010 16:16:51 +0000 (09:16 -0700)]
TODO vcard support (not sure how to do this yet...)
TODO storing the tag in a db instead of just relying on the
     local message so that contents can be restored even
     if the checkbox is off

Change-Id: I27574d25ecd9d814db7c73189ac30bd060aa7e1e

src/com/android/apps/tag/MyTagActivity.java
src/com/android/apps/tag/record/ImageRecord.java
src/com/android/apps/tag/record/ParsedNdefRecord.java
src/com/android/apps/tag/record/UriRecord.java
src/com/android/apps/tag/record/VCardRecord.java

index e6bd5ec..20d4156 100644 (file)
@@ -19,6 +19,7 @@ package com.android.apps.tag;
 import com.android.apps.tag.message.NdefMessageParser;
 import com.android.apps.tag.message.ParsedNdefMessage;
 import com.android.apps.tag.record.ParsedNdefRecord;
+import com.android.apps.tag.record.RecordEditInfo;
 import com.android.apps.tag.record.TextRecord;
 import com.android.apps.tag.record.UriRecord;
 import com.google.common.collect.Lists;
@@ -70,12 +71,11 @@ public class MyTagActivity extends EditTagActivity implements OnClickListener {
         mTitleView = (EditText) findViewById(R.id.input_tag_title);
         mTextView = (EditText) findViewById(R.id.input_tag_text);
         mEnabled = (CheckBox) findViewById(R.id.toggle_enabled_checkbox);
-    }
 
-    @Override
-    public void onStart() {
-        super.onStart();
+        populateEditor();
+    }
 
+    private void populateEditor() {
         NdefMessage localMessage = NfcAdapter.getDefaultAdapter().getLocalNdefMessage();
 
         if (Intent.ACTION_SEND.equals(getIntent().getAction()) && !mParsedIntent) {
@@ -107,7 +107,14 @@ public class MyTagActivity extends EditTagActivity implements OnClickListener {
             mTitleView.setText(((TextRecord) records.get(0)).getText());
             mTextView.setText(((TextRecord) records.get(1)).getText());
 
-            // TODO: rebuild the records!
+            mRecords.clear();
+            for (int i = 2, len = records.size(); i < len; i++) {
+                RecordEditInfo editInfo = records.get(i).getEditInfo(this);
+                if (editInfo != null) {
+                    addRecord(editInfo);
+                }
+            }
+            rebuildChildViews();
         }
     }
 
index f15f9b5..ebaaf57 100644 (file)
@@ -28,7 +28,6 @@ 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;
@@ -64,6 +63,18 @@ public class ImageRecord extends ParsedNdefRecord {
         return image;
     }
 
+    @Override
+    public RecordEditInfo getEditInfo(Activity host) {
+        return new ImageRecordEditInfo(mBitmap);
+    }
+
+    private static Intent getPickImageIntent() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("image/*");
+        return intent;
+    }
+
     /**
      * Returns a view in a list of record types for adding new records to a message.
      */
@@ -72,10 +83,7 @@ public class ImageRecord extends ParsedNdefRecord {
                 R.layout.tag_add_record_list_item, parent, false);
 
         // Determine which Activity can retrieve images.
-        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
-        intent.addCategory(Intent.CATEGORY_OPENABLE);
-        intent.setType("image/*");
-
+        Intent intent = getPickImageIntent();
         PackageManager pm = context.getPackageManager();
         List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
         if (activities.isEmpty()) {
@@ -86,7 +94,7 @@ public class ImageRecord extends ParsedNdefRecord {
         ((ImageView) root.findViewById(R.id.image)).setImageDrawable(info.loadIcon(pm));
         ((TextView) root.findViewById(R.id.text)).setText(context.getString(R.string.photo));
 
-        root.setTag(new ImageRecordEditInfo(intent));
+        root.setTag(new ImageRecordEditInfo());
         return root;
     }
 
@@ -120,27 +128,49 @@ public class ImageRecord extends ParsedNdefRecord {
     }
 
     private static class ImageRecordEditInfo extends RecordEditInfo {
-        private final Intent mIntent;
+        /**
+         * The path on the device where we can load the image. If this is set, the value will be
+         * lazily loaded from the path.
+         */
         private String mCurrentPath;
+
+        /**
+         * The actual current value of the image for the record.
+         */
         private Bitmap mCachedValue;
 
+        /**
+         * Pixel size to crop loaded images to.
+         */
         public static final int MAX_IMAGE_SIZE = 128;
 
-        public ImageRecordEditInfo(Intent intent) {
+        public ImageRecordEditInfo() {
+            super(RECORD_TYPE);
+            mCurrentPath = "";
+            mCachedValue = null;
+        }
+
+        public ImageRecordEditInfo(String path) {
+            super(RECORD_TYPE);
+            mCurrentPath = path;
+            mCachedValue = null;
+        }
+
+        public ImageRecordEditInfo(Bitmap value) {
             super(RECORD_TYPE);
-            mIntent = intent;
             mCurrentPath = "";
+            mCachedValue = value;
         }
 
         protected ImageRecordEditInfo(Parcel parcel) {
             super(parcel);
-            mIntent = parcel.readParcelable(null);
             mCurrentPath = parcel.readString();
+            mCachedValue = parcel.readParcelable(null);
         }
 
         @Override
         public Intent getPickIntent() {
-            return mIntent;
+            return getPickImageIntent();
         }
 
         @Override
@@ -209,8 +239,8 @@ public class ImageRecord extends ParsedNdefRecord {
         @Override
         public void writeToParcel(Parcel out, int flags) {
             super.writeToParcel(out, flags);
-            out.writeParcelable(mIntent, flags);
             out.writeString(mCurrentPath);
+            out.writeParcelable(mCachedValue, flags);
         }
 
         @SuppressWarnings("unused")
@@ -235,7 +265,7 @@ public class ImageRecord extends ParsedNdefRecord {
         @Override
         public void onClick(View target) {
             if (this == target.getTag()) {
-                mCallbacks.startPickForRecord(this, mIntent);
+                mCallbacks.startPickForRecord(this, getPickIntent());
             } else {
                 super.onClick(target);
             }
index 14c9bcc..75b0fd9 100644 (file)
@@ -31,4 +31,12 @@ public abstract class ParsedNdefRecord {
      */
     public abstract View getView(Activity activity, LayoutInflater inflater, ViewGroup parent,
             int offset);
+
+    // TODO: make abstract.
+    /**
+     * Returns a {@link RecordEditInfo} for editing this record.
+     */
+    public RecordEditInfo getEditInfo(Activity activity) {
+        return null;
+    }
 }
index e11815b..407879d 100644 (file)
@@ -146,6 +146,11 @@ public class UriRecord extends ParsedNdefRecord implements OnClickListener {
     }
 
     @Override
+    public RecordEditInfo getEditInfo(Activity host) {
+        return new UriRecordEditInfo(mUri.toString());
+    }
+
+    @Override
     public void onClick(View view) {
         RecordUtils.ClickInfo info = (RecordUtils.ClickInfo) view.getTag();
         try {
index 9cbc133..1d0b074 100644 (file)
@@ -60,7 +60,7 @@ public class VCardRecord extends ParsedNdefRecord implements OnClickListener {
 
     private final byte[] mVCard;
 
-    private VCardRecord( byte[] content) {
+    private VCardRecord(byte[] content) {
         mVCard = content;
     }