/* * Copyright 2012 The Stanford MobiSocial Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package mobisocial.musubi.ui; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.util.Arrays; import mobisocial.crypto.IBHashedIdentity.Authority; import mobisocial.musubi.App; import mobisocial.musubi.Helpers; import mobisocial.musubi.R; import mobisocial.musubi.model.MIdentity; import mobisocial.musubi.model.helpers.IdentitiesManager; import mobisocial.musubi.objects.OutOfBandInvitedObj; import mobisocial.musubi.ui.fragments.AccountLinkDialog; import mobisocial.musubi.ui.fragments.EmailUnclaimedMembersFragment; import mobisocial.socialkit.Obj; import android.content.Intent; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.facebook.android.AsyncFacebookRunner.RequestListener; import com.facebook.android.DialogError; import com.facebook.android.Facebook; import com.facebook.android.Facebook.DialogListener; import com.facebook.android.FacebookError; /** * Pick contacts and/or groups for various purposes. * TODO: Remove TabActivity in favor of fragments; * Make activity a floating window. * * TODO: Picker should return personId, not id. */ public class EmailUnclaimedMembersActivity extends FragmentActivity { public final static String INTENT_EXTRA_FEED_URI = "feed_uri"; final String message = "I just sent you a message on Musubi, a social sharing and application platform! " + "To get your message, install the Musubi app on your Android phone from the Android market."; public static final String MUSUBI_MARKET_URL = "https://market.android.com/details?id=mobisocial.musubi"; public final static String INTENT_EXTRA_RECIPIENT_IDS = "recipient_ids"; public final static String INTENT_EXTRA_AUTHORITIES = "authority"; public final static String LOGO_PICTURE_URL = "http://lh5.ggpht.com/hRTJJv7H9dpLXhHTTqiiNY2DD2wWO0hZFWEWPv1g-WArcUYLsWk-aQYUS0UgZfVIqtXm=w124"; public final static String TAG = "EmailUnclaimedMembersActivity"; private Uri mFeedUri; private Handler mHandler; private Intent mIntent; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler = new Handler(); mIntent = getIntent(); mFeedUri = mIntent.getParcelableExtra(INTENT_EXTRA_FEED_URI); final int[] authorities = mIntent.getIntArrayExtra(INTENT_EXTRA_AUTHORITIES); final String recipients[] = mIntent.getStringArrayExtra(android.content.Intent.EXTRA_BCC); // for debug // final String recipients[]={"574632066","640321536"}; // authorities[0] = Authority.Facebook.ordinal(); Fragment memberView = new EmailUnclaimedMembersFragment(); Bundle args = new Bundle(); args.putParcelable("feed_uri", mFeedUri); memberView.setArguments(args); setContentView(R.layout.activity_email_unclaimed_member_list); Button sendButton = (Button) findViewById(R.id.send_unclaimed_email); Button cancelButton = (Button) findViewById(R.id.cancel_unclaimed_email); sendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO: need to support different invitations for different providers if(authorities[0] == Authority.Email.ordinal()) { final String subject = "You have a new Musubi message!"; final String body = message + " " + MUSUBI_MARKET_URL; Intent send = new Intent(Intent.ACTION_SENDTO); StringBuilder recipientsString = new StringBuilder(); // only add emails for(int i = 0; i < recipients.length; i++) { if(authorities[i] == Authority.Email.ordinal()) { recipientsString.append(recipients[i]).append(","); } } recipientsString.deleteCharAt(recipientsString.length()-1); String uriText; uriText = "mailto:" + recipientsString.toString() + "?subject=" + subject + "&body=" + body; //TODO: real url encoding? uriText = uriText.replace(" ", "%20"); Uri uri = Uri.parse(uriText); send.setData(uri); startActivity(Intent.createChooser(send, "Send invitation...")); MIdentity[] identities = markAsHasSent(mIntent); //let other people in the feed know that spamming is unnecessary if(mFeedUri != null) { Obj invitedObj = OutOfBandInvitedObj.from(Arrays.asList(identities).iterator()); Helpers.sendToFeed(EmailUnclaimedMembersActivity.this, invitedObj, mFeedUri); } EmailUnclaimedMembersActivity.this.finish(); } else if(authorities[0] == Authority.Facebook.ordinal()) { Facebook fb = AccountLinkDialog.getFacebookInstance(EmailUnclaimedMembersActivity.this); // AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(fb); // if(fb.isSessionValid()) { // // TODO: batch request in json array. currently facebook limits 50 requests per batch // // need to split up it if it's more than 50 // final String fbmsg = new StringBuilder() // .append("message=").append(message) // .append("&link=").append(link) // .append("&picture=").append(LOGO_PICTURE_URL).toString(); // // JSONArray batchObj = new JSONArray(); // try { // for(String id : recipients) { // JSONObject post = new JSONObject(); // post.put("method", "POST"); // post.put("relative_url", id+"/feed"); // post.put("body", fbmsg); // batchObj.put(post); // } // } catch (JSONException e) { // Log.e(TAG, e.toString()); // } // Bundle batch = new Bundle(); // batch.putString("batch", batchObj.toString()); // asyncRunner.request("/", batch, "POST", new FriendRequestListener(), null); StringBuilder recipientsString = new StringBuilder(); // only add fb ids for(int i = 0; i < recipients.length; i++) { if(authorities[i] == Authority.Facebook.ordinal()) { recipientsString.append(recipients[i]).append(","); } } recipientsString.deleteCharAt(recipientsString.length()-1); Bundle params = new Bundle(); params.putString("message", message); params.putString("to", recipientsString.toString()); fb.dialog(EmailUnclaimedMembersActivity.this, "apprequests", params, new AppRequestDialogListener()); } } } }); cancelButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //if i say no, i mean NO! markAsHasSent(mIntent); EmailUnclaimedMembersActivity.this.finish(); } }); getSupportFragmentManager().beginTransaction() .replace(R.id.member_list, memberView).commit(); } private MIdentity[] markAsHasSent(final Intent mIntent) { SQLiteOpenHelper dbhelper = App.getDatabaseSource(EmailUnclaimedMembersActivity.this); IdentitiesManager manager = new IdentitiesManager(dbhelper); long ids[] = mIntent.getLongArrayExtra(INTENT_EXTRA_RECIPIENT_IDS); MIdentity identities[] = manager.getIdentitiesForIds(ids); for (int i = 0; i < identities.length; i++) { identities[i].hasSentEmail_ = true; manager.updateIdentity(identities[i]); } return identities; } public class AppRequestDialogListener implements DialogListener { @Override public void onComplete(Bundle values) { Log.i(TAG, values.toString()); MIdentity[] identities = markAsHasSent(mIntent); //let other people in the feed know that spamming is unnecessary if(mFeedUri != null) { Obj invitedObj = OutOfBandInvitedObj.from(Arrays.asList(identities).iterator()); Helpers.sendToFeed(EmailUnclaimedMembersActivity.this, invitedObj, mFeedUri); } EmailUnclaimedMembersActivity.this.finish(); } @Override public void onFacebookError(FacebookError e) { Log.e(TAG, e.toString()); } @Override public void onError(DialogError e) { Log.e(TAG, e.toString()); } @Override public void onCancel() { EmailUnclaimedMembersActivity.this.finish(); } } public class FriendRequestListener implements RequestListener { @Override public void onComplete(String response, Object state) { showToast("Invitations posted to friends' wall"); Log.i(TAG, response); EmailUnclaimedMembersActivity.this.finish(); } @Override public void onIOException(IOException e, Object state) { Log.e(TAG, e.toString()); } @Override public void onFileNotFoundException(FileNotFoundException e, Object state) { Log.e(TAG, e.toString()); } @Override public void onMalformedURLException(MalformedURLException e, Object state) { Log.e(TAG, e.toString()); } @Override public void onFacebookError(FacebookError e, Object state) { Log.e(TAG, e.toString()); } } public void showToast(final String msg) { mHandler.post(new Runnable() { @Override public void run() { Toast toast = Toast.makeText(EmailUnclaimedMembersActivity.this, msg, Toast.LENGTH_LONG); toast.show(); } }); } }