Issue 521, avoid an NPE
[zxing.git] / android / src / com / google / zxing / client / android / share / ShareActivity.java
index 3578b1a..696b389 100755 (executable)
@@ -26,8 +26,10 @@ import android.provider.Browser;
 import android.provider.Contacts;
 import android.provider.BaseColumns;
 import android.text.ClipboardManager;
+import android.util.Log;
 import android.view.View;
 import android.widget.Button;
+import com.google.zxing.BarcodeFormat;
 import com.google.zxing.client.android.Intents;
 import com.google.zxing.client.android.Contents;
 import com.google.zxing.client.android.R;
@@ -39,8 +41,12 @@ import com.google.zxing.client.android.R;
  * @author dswitkin@google.com (Daniel Switkin)
  */
 public final class ShareActivity extends Activity {
+
+  private static final String TAG = ShareActivity.class.getSimpleName();
+
   private static final int PICK_BOOKMARK = 0;
   private static final int PICK_CONTACT = 1;
+  private static final int PICK_APP = 2;
 
   //private static final int METHODS_ID_COLUMN = 0;
   private static final int METHODS_KIND_COLUMN = 1;
@@ -63,28 +69,40 @@ public final class ShareActivity extends Activity {
 
   private final Button.OnClickListener contactListener = new Button.OnClickListener() {
     public void onClick(View v) {
-      startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.People.CONTENT_URI),
-          PICK_CONTACT);
+      Intent intent = new Intent(Intent.ACTION_PICK, Contacts.People.CONTENT_URI);
+      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      startActivityForResult(intent, PICK_CONTACT);
     }
   };
 
   private final Button.OnClickListener bookmarkListener = new Button.OnClickListener() {
     public void onClick(View v) {
       Intent intent = new Intent(Intent.ACTION_PICK);
+      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
       intent.setClassName(ShareActivity.this, BookmarkPickerActivity.class.getName());
       startActivityForResult(intent, PICK_BOOKMARK);
     }
   };
 
+  private final Button.OnClickListener appListener = new Button.OnClickListener() {
+    public void onClick(View v) {
+      Intent intent = new Intent(Intent.ACTION_PICK);
+      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+      intent.setClassName(ShareActivity.this, AppPickerActivity.class.getName());
+      startActivityForResult(intent, PICK_APP);
+    }
+  };
+
   private final Button.OnClickListener clipboardListener = new Button.OnClickListener() {
     public void onClick(View v) {
       ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
       // Should always be true, because we grey out the clipboard button in onResume() if it's empty
       if (clipboard.hasText()) {
         Intent intent = new Intent(Intents.Encode.ACTION);
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
         intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
-        intent.putExtra(Intents.Encode.DATA, clipboard.getText());
-        intent.putExtra(Intents.Encode.FORMAT, Contents.Format.QR_CODE);
+        intent.putExtra(Intents.Encode.DATA, clipboard.getText().toString());
+        intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
         startActivity(intent);
       }
     }
@@ -95,10 +113,9 @@ public final class ShareActivity extends Activity {
     super.onCreate(icicle);
     setContentView(R.layout.share);
 
-    Button mContactButton = (Button) findViewById(R.id.contact_button);
-    mContactButton.setOnClickListener(contactListener);
-    Button mBookmarkButton = (Button) findViewById(R.id.bookmark_button);
-    mBookmarkButton.setOnClickListener(bookmarkListener);
+    findViewById(R.id.contact_button).setOnClickListener(contactListener);
+    findViewById(R.id.bookmark_button).setOnClickListener(bookmarkListener);
+    findViewById(R.id.app_button).setOnClickListener(appListener);
     clipboardButton = (Button) findViewById(R.id.clipboard_button);
     clipboardButton.setOnClickListener(clipboardListener);
   }
@@ -122,6 +139,7 @@ public final class ShareActivity extends Activity {
     if (resultCode == RESULT_OK) {
       switch (requestCode) {
         case PICK_BOOKMARK:
+        case PICK_APP:
           showTextAsBarcode(intent.getStringExtra(Browser.BookmarkColumns.URL));
           break;
         case PICK_CONTACT:
@@ -133,10 +151,15 @@ public final class ShareActivity extends Activity {
   }
 
   private void showTextAsBarcode(String text) {
+    Log.i(TAG, "Showing text as barcode: " + text);    
+    if (text == null) {
+      return; // Show error?
+    }
     Intent intent = new Intent(Intents.Encode.ACTION);
+    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
     intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
     intent.putExtra(Intents.Encode.DATA, text);
-    intent.putExtra(Intents.Encode.FORMAT, Contents.Format.QR_CODE);
+    intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
     startActivity(intent);
   }
 
@@ -147,6 +170,10 @@ public final class ShareActivity extends Activity {
    * @param contactUri A Uri of the form content://contacts/people/17
    */
   private void showContactAsBarcode(Uri contactUri) {
+    Log.i(TAG, "Showing contact URI as barcode: " + contactUri);
+    if (contactUri == null) {
+      return; // Show error?
+    }
     ContentResolver resolver = getContentResolver();
     Cursor contactCursor = resolver.query(contactUri, null, null, null, null);
     Bundle bundle = new Bundle();
@@ -202,10 +229,12 @@ public final class ShareActivity extends Activity {
       }
 
       Intent intent = new Intent(Intents.Encode.ACTION);
+      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);      
       intent.putExtra(Intents.Encode.TYPE, Contents.Type.CONTACT);
       intent.putExtra(Intents.Encode.DATA, bundle);
-      intent.putExtra(Intents.Encode.FORMAT, Contents.Format.QR_CODE);
+      intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
 
+      Log.i(TAG, "Sending bundle for encoding: " + bundle);
       startActivity(intent);
     }
   }