com.javielinux.utils.TweetActions.java Source code

Java tutorial

Introduction

Here is the source code for com.javielinux.utils.TweetActions.java

Source

/*
 * Copyright 2012 Javier Prez Pacheco and Francisco Daz Rodriguez
 * TweetTopics 2.0
 * javielinux@gmail.com
 *
 * 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 com.javielinux.utils;

import android.app.AlertDialog;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.CursorIndexOutOfBoundsException;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.widget.CheckBox;
import com.android.dataframework.DataFramework;
import com.android.dataframework.Entity;
import com.javielinux.adapters.IconAndTextSimpleAdapter;
import com.javielinux.adapters.UsersAdapter;
import com.javielinux.dialogs.OnSelectedIconAndText;
import com.javielinux.dialogs.TwitterUsersConnectedDialogFragment;
import com.javielinux.infos.InfoTweet;
import com.javielinux.preferences.RetweetsTypes;
import com.javielinux.tweettopics2.MapSearch;
import com.javielinux.tweettopics2.NewStatusActivity;
import com.javielinux.tweettopics2.R;
import com.javielinux.tweettopics2.TweetActivity;
import com.javielinux.twitter.ConnectionManager;
import com.javielinux.updatestatus.ServiceUpdateStatus;
import twitter4j.TwitterException;

import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.Callable;

public class TweetActions {

    public static String TWEET_ACTION_REPLY = "reply";
    public static String TWEET_ACTION_RETWEET = "retweet";
    public static String TWEET_ACTION_LAST_READ = "lastread";
    public static String TWEET_ACTION_READ_AFTER = "readafter";
    public static String TWEET_ACTION_FAVORITE = "favorite";
    public static String TWEET_ACTION_MAP = "map";
    public static String TWEET_ACTION_SHARE = "share";
    public static String TWEET_ACTION_MENTION = "mention";
    public static String TWEET_ACTION_CLIPBOARD = "clipboard";
    public static String TWEET_ACTION_SEND_DM = "send_dm";
    public static String TWEET_ACTION_DELETE_TWEET = "delete_tweet";
    public static String TWEET_ACTION_DELETE_UP_TWEET = "delete_up_tweets";

    public static void execByCode(String code, FragmentActivity activity, long fromUser, InfoTweet infoTweet) {
        execByCode(code, activity, fromUser, infoTweet, null);
    }

    public static void execByCode(String code, FragmentActivity activity, long fromUser, InfoTweet infoTweet,
            Object extra) {
        if (code.equals(TWEET_ACTION_REPLY)) {
            goToReply(activity, fromUser, infoTweet);
        } else if (code.equals(TWEET_ACTION_RETWEET)) {
            showDialogRetweet(activity, fromUser, infoTweet);
        } else if (code.equals(TWEET_ACTION_LAST_READ)) {
            if (extra instanceof ListFragmentListener) {
                ((ListFragmentListener) extra)
                        .onMarkPositionLastReadAsLastReadId(ListFragmentListener.FORCE_FIRST_VISIBLE);
            }
        } else if (code.equals(TWEET_ACTION_READ_AFTER)) {
            saveTweet(activity, infoTweet);
        } else if (code.equals(TWEET_ACTION_FAVORITE)) {
            goToFavorite(activity, infoTweet);
        } else if (code.equals(TWEET_ACTION_SHARE)) {
            goToShare(activity, infoTweet);
        } else if (code.equals(TWEET_ACTION_MENTION)) {
            goToMention(activity, fromUser, infoTweet);
        } else if (code.equals(TWEET_ACTION_CLIPBOARD)) {
            copyToClipboard(activity, infoTweet);
        } else if (code.equals(TWEET_ACTION_SEND_DM)) {
            directMessage(activity, fromUser, infoTweet.getUsername());
        } else if (code.equals(TWEET_ACTION_MAP)) {
            goToMap(activity, infoTweet);
        } else if (code.equals(TWEET_ACTION_DELETE_TWEET)) {
            //this.goToDeleteTweet(mTweetTopicsCore);
        } else if (code.equals(TWEET_ACTION_DELETE_UP_TWEET)) { // opcin slo para desarrollo
            goToDeleteTop(activity, fromUser, infoTweet);
        }
    }

    private static void goToDeleteTop(FragmentActivity activity, long fromUser, InfoTweet infoTweet) {
        if (infoTweet.isTimeline()) {
            Entity ent = new Entity("tweets_user", infoTweet.getIdDB());
            String date = ent.getString("date");
            String sqlDelete = "DELETE FROM tweets_user WHERE type_id= " + TweetTopicsUtils.TWEET_TYPE_TIMELINE
                    + " and user_tt_id=" + fromUser + " AND date > '" + date + "'";
            DataFramework.getInstance().getDB().execSQL(sqlDelete);
        }
        if (infoTweet.isMention()) {
            Entity ent = new Entity("tweets_user", infoTweet.getIdDB());
            String date = ent.getString("date");
            String sqlDelete = "DELETE FROM tweets_user WHERE type_id= " + TweetTopicsUtils.TWEET_TYPE_MENTIONS
                    + " and user_tt_id=" + fromUser + " AND date > '" + date + "'";
            DataFramework.getInstance().getDB().execSQL(sqlDelete);
        }
    }

    public static void goToFavorite(final FragmentActivity activity, final InfoTweet infoTweet) {
        ArrayList<Entity> ents = DataFramework.getInstance().getEntityList("users",
                "service is null or service = \"twitter.com\"");
        if (ents.size() == 1) {
            createFavorite(activity, infoTweet, ents.get(0).getId());
        } else {
            TwitterUsersConnectedDialogFragment frag = new TwitterUsersConnectedDialogFragment(
                    new OnSelectedIconAndText() {
                        @Override
                        public void OnSelectedItem(IconAndTextSimpleAdapter.IconAndText item) {
                            createFavorite(activity, infoTweet, Long.parseLong(item.extra.toString()));
                        }
                    });
            frag.show(activity.getSupportFragmentManager(), "dialog");
        }
    }

    public static boolean createFavorite(FragmentActivity activity, final InfoTweet infoTweet, final long id) {
        ConnectionManager.getInstance().open(activity);

        if (infoTweet.getTypeFrom() == InfoTweet.FROM_STATUS && infoTweet.getIdDB() > 0) {
            try {
                Entity ent = new Entity("tweets_user", infoTweet.getIdDB());
                ent.setValue("is_favorite", 1);
                ent.save();
            } catch (CursorIndexOutOfBoundsException e) {
                e.printStackTrace();
            }
        }

        Utils.showMessage(activity, activity.getString(R.string.favorite_save));

        infoTweet.setFavorited(true);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    ConnectionManager.getInstance().getTwitter(id).createFavorite(infoTweet.getId());
                } catch (TwitterException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        return true;

    }

    public static void copyToClipboard(FragmentActivity activity, InfoTweet infoTweet) {
        try {
            ClipboardManager clipboard = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(infoTweet.getText());
            Utils.showMessage(activity, activity.getString(R.string.copied_to_clipboard));
        } catch (NoClassDefFoundError e) {
            Utils.showMessage(activity, activity.getString(R.string.error_general));
            e.printStackTrace();
        }
    }

    public static void goToMention(FragmentActivity activity, long fromUser, InfoTweet infoTweet) {
        updateStatus(activity, fromUser, NewStatusActivity.TYPE_NORMAL, "@" + infoTweet.getUsername(), infoTweet);
    }

    public static void goToMention(FragmentActivity activity, long fromUser, String username) {
        updateStatus(activity, fromUser, NewStatusActivity.TYPE_NORMAL, "@" + username, null);
    }

    public static void goToShare(FragmentActivity activity, InfoTweet infoTweet) {
        Intent msg = new Intent(Intent.ACTION_SEND);
        msg.putExtra(Intent.EXTRA_TEXT, infoTweet.getUsername() + ": " + infoTweet.getText());
        msg.setType("text/plain");
        activity.startActivity(msg);
    }

    public static void saveTweet(FragmentActivity activity, InfoTweet infoTweet) {
        try {
            if (infoTweet.isSavedTweet()) {
                Entity ent = new Entity("saved_tweets", infoTweet.getIdDB());
                ent.delete();
                // TODO borrar registro de la pantalla
                Utils.showMessage(activity, activity.getString(R.string.favorite_delete));
            } else {
                Entity ent = new Entity("saved_tweets");
                ent.setValue("url_avatar", infoTweet.getUrlAvatar());
                ent.setValue("username", infoTweet.getUsername());
                ent.setValue("user_id", infoTweet.getUserId());
                ent.setValue("tweet_id", infoTweet.getId() + "");
                ent.setValue("text", infoTweet.getText());
                ent.setValue("text_urls", infoTweet.getTextURLs());
                //                ent.setValue("source", infoTweet.getSource());
                ent.setValue("to_username", infoTweet.getToUsername());
                ent.setValue("to_user_id", infoTweet.getToUserId());
                ent.setValue("date", infoTweet.getDate().getTime() + "");
                ent.setValue("latitude", infoTweet.getLatitude());
                ent.setValue("longitude", infoTweet.getLongitude());
                ent.save();
                Utils.showMessage(activity, activity.getString(R.string.favorite_save));
            }
        } catch (Exception e) {
            e.printStackTrace();
            Utils.showMessage(activity, activity.getString(R.string.favorite_no_save));
        }
    }

    public static void goToReply(FragmentActivity activity, long fromUser, InfoTweet infoTweet) {
        if (infoTweet.isDm()) {
            directMessage(activity, fromUser, infoTweet.getUsername());
        } else {
            ArrayList<String> users = LinksUtils.pullLinksUsers(infoTweet.getText());
            int count = users.size();
            if (!users.contains("@" + infoTweet.getUsername()))
                count++;

            if (fromUser > 0) {
                try {
                    Entity e = new Entity("users", fromUser);
                    if (e != null) {
                        if (users.contains("@" + e.getString("name")))
                            count--;
                    }
                } catch (CursorIndexOutOfBoundsException e) {
                    e.printStackTrace();
                }
            }

            if (count > 1) {
                showDialogReply(activity, fromUser, infoTweet);
            } else {
                updateStatus(activity, fromUser, NewStatusActivity.TYPE_REPLY, "", infoTweet);
            }
        }

    }

    public static void showDialogReply(final FragmentActivity activity, final long fromUser, final InfoTweet it) {
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(R.string.actions).setItems(R.array.actions_reply, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == 0) {
                    if (it != null) {
                        ArrayList<String> users = LinksUtils.pullLinksUsers(it.getText());
                        String text = "";
                        String user = "";
                        Entity e = new Entity("users", fromUser);
                        if (e != null) {
                            user = e.getString("name");
                        }
                        for (int i = 0; i < users.size(); i++) {
                            if ((!users.get(i).toLowerCase().equals("@" + it.getUsername().toLowerCase()))
                                    && (!users.get(i).toLowerCase().equals("@" + user.toLowerCase()))) {
                                text += users.get(i) + " ";
                            }
                        }
                        updateStatus(activity, fromUser, NewStatusActivity.TYPE_REPLY, text, it);
                    }
                } else if (which == 1) {
                    if (it != null) {
                        ArrayList<String> users = LinksUtils.pullLinksUsers(it.getText());
                        String text = " //cc ";
                        String user = "";
                        Entity e = new Entity("users", fromUser);
                        if (e != null) {
                            user = e.getString("name");
                        }
                        for (int i = 0; i < users.size(); i++) {
                            if ((!users.get(i).toLowerCase().equals("@" + it.getUsername().toLowerCase()))
                                    && (!users.get(i).toLowerCase().equals("@" + user.toLowerCase()))) {
                                text += users.get(i) + " ";
                            }
                        }
                        updateStatus(activity, fromUser, NewStatusActivity.TYPE_REPLY_ON_COPY, text, it);
                    }
                } else if (which == 2) {
                    if (it != null) {
                        updateStatus(activity, fromUser, NewStatusActivity.TYPE_REPLY, "", it);
                    }
                }
            }
        });
        builder.create();
        builder.show();
    }

    public static void directMessage(FragmentActivity activity, long fromUser, String username) {
        Intent newstatus = new Intent(activity, NewStatusActivity.class);
        if (fromUser > 0)
            newstatus.putExtra("start_user_id", fromUser);
        newstatus.putExtra("type", NewStatusActivity.TYPE_DIRECT_MESSAGE);
        newstatus.putExtra("username_direct_message", username);
        activity.startActivity(newstatus);

    }

    public static void updateStatus(final FragmentActivity activity, final String text) {
        ArrayList<Entity> ents = DataFramework.getInstance().getEntityList("users",
                "service is null or service = \"twitter.com\"");

        if (ents.size() == 1) {

            sendStatus(activity, ents.get(0).getId() + "", text);

        } else {
            final UsersAdapter adapter = new UsersAdapter(activity, ents);

            AlertDialog builder = new AlertDialog.Builder(activity).setCancelable(true).setTitle(R.string.users)
                    .setAdapter(adapter, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            sendStatus(activity, adapter.getItem(which).getId() + "", text);
                        }

                    }).setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                        }
                    }).create();
            builder.show();
        }
    }

    public static void updateStatus(FragmentActivity activity, long fromUser, int type, String text,
            InfoTweet tweet) {
        updateStatus(activity, fromUser, type, text, tweet, "");
    }

    private static void updateStatus(FragmentActivity activity, long fromUser, int type, String text,
            InfoTweet tweet, String prev) {
        Intent newstatus = new Intent(activity, NewStatusActivity.class);
        if (fromUser > 0)
            newstatus.putExtra("start_user_id", fromUser);
        newstatus.putExtra("text", text);
        newstatus.putExtra("type", type);
        newstatus.putExtra("retweet_prev", prev);
        if (tweet != null) {
            if (type == NewStatusActivity.TYPE_REPLY || type == NewStatusActivity.TYPE_REPLY_ON_COPY) {
                newstatus.putExtra("reply_tweetid", tweet.getId());
            }
            if (tweet.isRetweet()) {
                newstatus.putExtra("reply_avatar", tweet.getUrlAvatarRetweet());
                newstatus.putExtra("reply_screenname", tweet.getUsernameRetweet());
                newstatus.putExtra("reply_text", tweet.getTextRetweet());
            } else {
                newstatus.putExtra("reply_avatar", tweet.getUrlAvatar());
                newstatus.putExtra("reply_screenname", tweet.getUsername());
                newstatus.putExtra("reply_text", tweet.getText());
            }
        }
        activity.startActivity(newstatus);
    }

    public static void showDialogRetweet(FragmentActivity activity, long fromUser, InfoTweet it) {
        showDialogRetweet(activity, fromUser, it, null);
    }

    public static void showDialogRetweet(final FragmentActivity activity, final long fromUser, final InfoTweet it,
            final Callable callBack) {
        final ArrayList<String> phrases = new ArrayList<String>();
        ArrayList<Entity> ents = DataFramework.getInstance().getEntityList("types_retweets");

        CharSequence[] c = new CharSequence[ents.size() + 3];
        c[0] = activity.getString(R.string.retweet_now);
        phrases.add("_RN_");
        c[1] = activity.getString(R.string.edit_message);
        phrases.add("_EM_");
        c[2] = activity.getString(R.string.retweet_url);
        phrases.add("_RU_");
        for (int i = 0; i < ents.size(); i++) {
            c[i + 3] = activity.getString(R.string.retweet) + " \"" + ents.get(i).getString("phrase") + "\" "
                    + activity.getString(R.string.now);
            phrases.add(ents.get(i).getString("phrase"));
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(R.string.retweet);
        builder.setItems(c, new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                String phrase = phrases.get(which);
                if (phrase.equals("_RN_")) {
                    if (it != null) {
                        retweetStatus(activity, it.getId(), callBack);
                    }
                } else if (phrase.equals("_EM_")) {
                    if (it != null) {
                        updateStatus(activity, fromUser, NewStatusActivity.TYPE_RETWEET, it.getText(), it);
                    }
                } else if (phrase.equals("_RU_")) {
                    if (it != null) {
                        updateStatus(activity, fromUser, NewStatusActivity.TYPE_RETWEET, it.getUrlTweet(), it);
                    }
                } else {
                    if (it != null) {
                        String text = phrase + " RT: @" + it.getUsername() + ": " + it.getText();
                        if (text.length() > 140) {
                            updateStatus(activity, fromUser, NewStatusActivity.TYPE_RETWEET, it.getText(), it,
                                    phrase);
                        } else {
                            updateStatus(activity, text);
                        }
                    }
                }
            }

        });
        builder.setNeutralButton(R.string.show_retweets, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                Intent newstatus = new Intent(activity, RetweetsTypes.class);
                activity.startActivity(newstatus);
            }
        });
        builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
            }
        });
        builder.create();
        builder.show();
    }

    public static void sendStatus(FragmentActivity activity, String users, String text) {
        Entity ent = new Entity("send_tweets");
        ent.setValue("users", users);
        ent.setValue("text", text);
        ent.setValue("is_sent", 0);
        ent.setValue("type_id", 1);
        ent.setValue("username_direct", "");
        ent.setValue("photos", "");
        ent.setValue("mode_tweetlonger", NewStatusActivity.MODE_TL_NONE);
        ent.setValue("reply_tweet_id", "-1");
        ent.setValue("use_geo", PreferenceUtils.getGeo(activity) ? "1" : "0");
        ent.save();

        activity.startService(new Intent(activity, ServiceUpdateStatus.class));
    }

    public static void sendRetweet(FragmentActivity activity, String users, long tweet_id) {
        Entity ent = new Entity("send_tweets");
        ent.setValue("users", users);
        ent.setValue("is_sent", 0);
        ent.setValue("type_id", 3);
        ent.setValue("reply_tweet_id", tweet_id);
        ent.save();

        activity.startService(new Intent(activity, ServiceUpdateStatus.class));
    }

    public static void retweetStatus(final FragmentActivity activity, final long tweet_id,
            final Callable callBack) {

        ArrayList<Entity> ents = DataFramework.getInstance().getEntityList("users",
                "service is null or service = \"twitter.com\"");

        if (ents.size() == 1) {

            sendRetweet(activity, ents.get(0).getId() + "", tweet_id);
            try {
                if (callBack != null)
                    callBack.call();
            } catch (Exception e) {
                e.printStackTrace();
            }

        } else {

            final UsersAdapter adapter = new UsersAdapter(activity, ents);

            AlertDialog builder = new AlertDialog.Builder(activity).setCancelable(true).setTitle(R.string.users)
                    .setAdapter(adapter, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            sendRetweet(activity, adapter.getItem(which).getId() + "", tweet_id);
                            try {
                                if (callBack != null)
                                    callBack.call();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }

                    }).setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                        }
                    }).create();
            builder.show();

        }

    }

    public static void showDialogTranslation(final TweetActivity activity) {

        View translate_dialog_footer = View.inflate(activity, R.layout.translate_dialog_footer, null);
        final CheckBox translate_default_language_checkbox = (CheckBox) translate_dialog_footer
                .findViewById(R.id.translate_default_language_checkbox);

        final ArrayList<String> languages_text = new ArrayList<String>();
        Collections.addAll(languages_text, activity.getResources().getStringArray(R.array.languages_translates));

        final ArrayList<String> languages_values = new ArrayList<String>();
        Collections.addAll(languages_values,
                activity.getResources().getStringArray(R.array.languages_translates_values));

        CharSequence[] languages_char_sequence = new CharSequence[languages_text.size()];
        for (int i = 0; i < languages_text.size(); i++) {
            languages_char_sequence[i] = languages_text.get(i);
        }

        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setTitle(R.string.language);
        builder.setView(translate_dialog_footer);

        builder.setItems(languages_char_sequence, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (translate_default_language_checkbox.isChecked()) {
                    PreferenceUtils.saveTraslationDefaultLanguage(activity, languages_values.get(which));
                    Utils.showMessage(activity, R.string.default_language_setting_message);
                }

                activity.translateTweet(languages_values.get(which));
            }
        });

        builder.setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
            }
        });
        builder.create();
        builder.show();
    }

    public static void goToMap(FragmentActivity activity, InfoTweet tweet) {
        if (tweet.hasLocation()) {
            Intent map = new Intent(activity, MapSearch.class);
            map.putExtra("longitude", tweet.getLongitude());
            map.putExtra("latitude", tweet.getLatitude());
            activity.startActivity(map);
        }
    }

}