net.lacolaco.smileessence.IntentRouter.java Source code

Java tutorial

Introduction

Here is the source code for net.lacolaco.smileessence.IntentRouter.java

Source

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2012-2014 lacolaco.net
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package net.lacolaco.smileessence;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import net.lacolaco.smileessence.activity.MainActivity;
import net.lacolaco.smileessence.command.CommandOpenUserDetail;
import net.lacolaco.smileessence.logging.Logger;
import net.lacolaco.smileessence.notification.NotificationType;
import net.lacolaco.smileessence.notification.Notificator;
import net.lacolaco.smileessence.twitter.util.TwitterUtils;
import net.lacolaco.smileessence.util.UIHandler;
import net.lacolaco.smileessence.view.adapter.PostState;
import net.lacolaco.smileessence.view.dialog.DialogHelper;
import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment;
import twitter4j.Status;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IntentRouter {

    // ------------------------------ FIELDS ------------------------------

    public static final String TWITTER_HOST = "twitter.com";

    // -------------------------- STATIC METHODS --------------------------

    public static void onNewIntent(MainActivity activity, Intent intent) {
        Logger.debug("IntentRouter:onNewIntent");
        Uri uri = intent.getData();
        if (uri != null) {
            onUriIntent(activity, uri);
        } else if (intent.getAction() != null) {
            switch (intent.getAction()) {
            case Intent.ACTION_SEND: {
                if (intent.getType().equals("text/plain")) {
                    Bundle extra = intent.getExtras();
                    if (extra != null) {
                        String text = getText(extra);
                        openPostPage(activity, text);
                    }
                } else {
                    Matcher matcher = Pattern.compile("image/.+").matcher(intent.getType());
                    if (matcher.find()) {
                        Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
                        openPostPageWithImage(activity, imageUri);
                    }
                }
                break;
            }
            }
        }
    }

    private static String getText(Bundle extra) {
        StringBuilder builder = new StringBuilder();
        if (!TextUtils.isEmpty(extra.getCharSequence(Intent.EXTRA_SUBJECT))) {
            builder.append(extra.getCharSequence(Intent.EXTRA_SUBJECT)).append(" ");
        }
        builder.append(extra.getCharSequence(Intent.EXTRA_TEXT));
        return builder.toString();
    }

    private static String getText(Uri uri) {
        String text = "";
        String url = "";
        if (uri.getQueryParameter("text") != null) {
            text = uri.getQueryParameter("text").replaceAll("\\+", " ");
        } else if (uri.getQueryParameter("status") != null) {
            text = uri.getQueryParameter("status").replaceAll("\\+", " ");
        }

        if (uri.getQueryParameter("url") != null) {
            url = uri.getQueryParameter("url");
        }
        return text + " " + url;
    }

    private static void onUriIntent(MainActivity activity, Uri uri) {
        Logger.debug(uri.toString());
        if (isPostIntent(uri)) {
            String str = getText(uri);
            openPostPage(activity, str);
        } else if (isStatusIntent(uri)) {
            long id = getStatusID(uri);
            showStatusDialog(activity, id);
        } else if (isUserIntent(uri)) {
            String screenName = getScreenName(uri);
            showUserDialog(activity, screenName);
        }
    }

    private static String getScreenName(Uri uri) {
        String screenName;
        if (uri.getQueryParameter("screen_name") != null) {
            screenName = uri.getQueryParameter("screen_name");
        } else {
            String[] arrayOfString = uri.toString().split("/");
            screenName = arrayOfString[arrayOfString.length - 1];
        }
        return screenName;
    }

    private static long getStatusID(Uri uri) {
        String str = "-1";
        String[] arrayOfString = uri.toString().split("/");
        for (int i = 0; i < arrayOfString.length; i++) {
            if (arrayOfString[i].startsWith("status")) {
                str = arrayOfString[(i + 1)];
                break;
            }
        }
        return Long.parseLong(str);
    }

    private static boolean isPostIntent(Uri uri) {
        if (uri.getHost().equals(TWITTER_HOST)) {
            if (uri.getPath().equals("/share")) {
                return true;
            } else {
                String[] arr = uri.toString().split("/");
                for (String s : arr) {
                    if (s.startsWith("tweet") || s.startsWith("home")) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private static boolean isStatusIntent(Uri uri) {
        if (uri.getHost().equals(TWITTER_HOST)) {
            String[] arr = uri.toString().split("/");
            for (String s : arr) {
                if (s.equals("status") || s.equals("statuses")) {
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean isUserIntent(Uri uri) {
        if (uri.getHost().equals(TWITTER_HOST)) {
            if (uri.getQueryParameter("screen_name") != null) {
                return true;
            }

            String[] arrayOfString = uri.toString().split("/");
            if (arrayOfString.length == 4 && uri.getQuery() == null) {
                return true;
            } else if (arrayOfString.length > 4) {
                if (arrayOfString[3].equals("#!") && uri.getQuery() == null) {
                    return true;
                }
            }
        }
        return false;
    }

    private static void showStatusDialog(final MainActivity activity, long id) {
        if (id != -1) {
            TwitterUtils.tryGetStatus(activity.getCurrentAccount(), id, new TwitterUtils.StatusCallback() {
                @Override
                public void success(Status status) {
                    StatusDetailDialogFragment fragment = new StatusDetailDialogFragment();
                    fragment.setStatusID(status.getId());
                    DialogHelper.showDialog(activity, fragment);
                }

                @Override
                public void error() {
                    Notificator.publish(activity, R.string.error_intent_status_cannot_load, NotificationType.ALERT);
                }
            });
        } else {
            Notificator.publish(activity, R.string.error_intent_status_cannot_load, NotificationType.ALERT);
        }
    }

    private static void showUserDialog(MainActivity activity, String screenName) {
        CommandOpenUserDetail openUserDetail = new CommandOpenUserDetail(activity, screenName,
                activity.getCurrentAccount());
        openUserDetail.execute();
    }

    private static void openPostPage(final MainActivity activity, final String str) {
        new UIHandler() {
            @Override
            public void run() {
                PostState.newState().beginTransaction().setText(str).commitWithOpen(activity);
            }
        }.post();
    }

    private static void openPostPageWithImage(final MainActivity activity, final Uri imageUri) {
        new UIHandler() {
            @Override
            public void run() {
                activity.openPostPageWithImage(imageUri);
            }
        }.post();
    }
}