mobisocial.musubi.ui.EmailUnclaimedMembersActivity.java Source code

Java tutorial

Introduction

Here is the source code for mobisocial.musubi.ui.EmailUnclaimedMembersActivity.java

Source

/*
 * 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();
            }
        });
    }

}