package info.justaway.plugin; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.text.Html; import java.util.List; import twitter4j.GeoLocation; import twitter4j.Status; import twitter4j.User; /** * Twiccaプラグイン用クラス * PICK_TREND,UPLOAD,EDIT_TWEETに関しては、onActivityResultにて受信まで行う必要があるので注意が必要 * また、他のアプリに誤った値を渡してエラーを吐いた場合バグレポートが他アプリに行くため、弄る際はtwiccaのデベロッパーページを読み、できるだけ忠実な挙動にする必要がある * twiccaデベロッパーページ: http://twicca.r246.jp/developers/ * * @author oboenikui */ public class TwiccaPlugin { public static final String TWICCA_ACTION_SHOW_TWEET = "jp.r246.twicca.ACTION_SHOW_TWEET"; public static final String TWICCA_ACTION_SHOW_USER = "jp.r246.twicca.ACTION_SHOW_USER"; public static final String TWICCA_ACTION_PICK_TREND = "jp.r246.twicca.ACTION_PICK_TREND"; public static final String TWICCA_ACTION_UPLOAD = "jp.r246.twicca.ACTION_UPLOAD"; public static final String TWICCA_ACTION_EDIT_TWEET = "jp.r246.twicca.ACTION_EDIT_TWEET"; public static final String TWICCA_ACTION_PLUGIN_SETTINGS = "jp.r246.twicca.ACTION_PLUGIN_SETTINGS"; public static final String TWICCA_CATEGORY_OWNER = "jp.r246.twicca.category.OWNER"; public static final String TWICCA_CATEGORY_USER = "jp.r246.twicca.category.USER"; public static final String TWICCA_USER_SCREEN_NAME = "jp.r246.twicca.USER_SCREEN_NAME"; /** * ツイートからtwiccaプラグインに飛ばすためのIntentを作成 * * @param status ステータス * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentShowTweet(Status status, String pkgName, String className) { Intent intent = new Intent(TWICCA_ACTION_SHOW_TWEET) .putExtra(Intent.EXTRA_TEXT, status.getText()) .putExtra("id", String.valueOf(status.getId())) .putExtra("created_at", String.valueOf(status.getCreatedAt().getTime())) .putExtra("source", Html.fromHtml(status.getSource()).toString()) .putExtra("in_reply_to_status_id", String.valueOf(status.getInReplyToStatusId())) .putExtra("user_screen_name", status.getUser().getScreenName()) .putExtra("user_name", status.getUser().getName()) .putExtra("user_id", String.valueOf(status.getUser().getId())) .putExtra("user_profile_image_url", status.getUser().getOriginalProfileImageURL()) .putExtra("user_profile_image_url_mini", status.getUser().getMiniProfileImageURL()) .putExtra("user_profile_image_url_normal", status.getUser().getProfileImageURL()) .putExtra("user_profile_image_url_bigger", status.getUser().getBiggerProfileImageURL()) .addCategory(Intent.CATEGORY_DEFAULT) .setClassName(pkgName, className); GeoLocation geoLocation = status.getGeoLocation(); if (geoLocation != null) { intent.putExtra("latitude", String.valueOf(geoLocation.getLatitude())) .putExtra("longitude", String.valueOf(geoLocation.getLongitude())); } return intent; } /** * ユーザー画面からtwiccaプラグインに飛ばすIntentを作成 * * @param user ユーザー * @param owner Justaway使用者 * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentShowUser(User user, User owner, String pkgName, String className) { return new Intent(TWICCA_ACTION_SHOW_USER) .putExtra(Intent.EXTRA_TEXT, user.getScreenName()) .putExtra("name", user.getName()) .putExtra("id", String.valueOf(user.getId())) .putExtra("location", user.getLocation()) .putExtra("url", user.getURL()) .putExtra("description", user.getDescription()) .putExtra("profile_image_url", user.getOriginalProfileImageURL()) .putExtra("profile_image_url_mini", user.getMiniProfileImageURL()) .putExtra("profile_image_url_normal", user.getProfileImageURL()) .putExtra("profile_image_url_bigger", user.getBiggerProfileImageURL()) .putExtra("owner_screen_name", owner.getScreenName()) .putExtra("owner_name", owner.getName()) .putExtra("owner_id", String.valueOf(owner.getId())) .putExtra("owner_location", owner.getLocation()) .putExtra("owner_url", owner.getURL()) .putExtra("owner_description", owner.getDescription()) .putExtra("owner_profile_image_url", owner.getOriginalProfileImageURL()) .putExtra("owner_profile_image_url_mini", owner.getMiniProfileImageURL()) .putExtra("owner_profile_image_url_normal", owner.getProfileImageURL()) .putExtra("owner_profile_image_url_bigger", owner.getBiggerProfileImageURL()) .addCategory(Intent.CATEGORY_DEFAULT) .addCategory(user.getId() == owner.getId() ? TWICCA_CATEGORY_OWNER : TWICCA_CATEGORY_USER) .setClassName(pkgName, className); } /** * ツイート編集中に呼び出すプラグイン 引数の説明はtwicca公式サイト(http://twicca.r246.jp/developers/edit_tweet_action/)より * * @param prefix 編集中のテキストの接頭辞(例:"@screen_name ") * @param user_input 編集中のテキストのうち、接頭辞と接尾辞を取り除いた部分。 * @param suffix 編集中のテキストの接尾辞(例:" RT @screen_name: quoted tweet") * @param cursor カーソル位置 * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentEditTweet(String prefix, String user_input, String suffix, int cursor, String pkgName, String className) { String fixed_prefix = prefix == null ? "" : prefix; String fixed_user_input = user_input == null ? "" : user_input; String fixed_suffix = suffix == null ? "" : suffix; return new Intent(TWICCA_ACTION_EDIT_TWEET) .putExtra(Intent.EXTRA_TEXT, fixed_prefix + fixed_user_input + fixed_suffix) .putExtra("prefix", fixed_prefix) .putExtra("suffix", fixed_suffix) .putExtra("user_input", fixed_user_input) .putExtra("cursor", cursor) .addCategory(Intent.CATEGORY_DEFAULT) .setClassName(pkgName, className); } /** * ツイート編集中に呼び出すプラグイン 引数の説明はtwicca公式サイト(http://twicca.r246.jp/developers/edit_tweet_action/)より * * @param prefix 編集中のテキストの接頭辞(例:"@screen_name ") * @param user_input 編集中のテキストのうち、接頭辞と接尾辞を取り除いた部分。 * @param suffix 編集中のテキストの接尾辞(例:" RT @screen_name: quoted tweet") * @param cursor カーソル位置 * @param in_reply_to 返信先のID * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentEditTweet(String prefix, String user_input, String suffix, int cursor, long in_reply_to, String pkgName, String className) { return createIntentEditTweet(prefix, user_input, suffix, cursor, pkgName, className) .putExtra("in_reply_to_status_id", in_reply_to); } /** * 画像アップロード時に呼ばれるプラグイン 要らない気がする * * @param uri 画像/動画のContent Uri * @param tweet 画像アップロード時点でのツイート * @param screen_name ユーザーのスクリーンネーム * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentUpload(Uri uri, String tweet, String screen_name, String pkgName, String className) { return new Intent(TWICCA_ACTION_UPLOAD) .putExtra(Intent.EXTRA_TEXT, tweet == null ? "" : tweet) .putExtra(TWICCA_USER_SCREEN_NAME, screen_name == null ? "" : screen_name) .setData(uri) .addCategory(Intent.CATEGORY_DEFAULT) .setClassName(pkgName, className); } /** * 画像アップロード時に呼ばれるプラグイン 要らない気がする * * @param uri 画像/動画のContent Uri * @param tweet 画像アップロード時点でのツイート * @param screen_name ユーザーのスクリーンネーム * @param in_reply_to 返信先ID * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentUpload(Uri uri, String tweet, String screen_name, long in_reply_to, String pkgName, String className) { return createIntentUpload(uri, tweet, screen_name, pkgName, className) .putExtra("in_reply_to_status_id", String.valueOf(in_reply_to)); } /** * カスタム「話題のトピック」プラグイン用 私はそのようなプラグインを見たことがありませんし今のところ「話題のトピック」機能もありませんが一応 * * @param pkgName パッケージ名 * @param className クラス名 * @return アプリを起動するためのIntent */ public static Intent createIntentPickTrend(String pkgName, String className) { return new Intent(TWICCA_ACTION_PICK_TREND) .addCategory(Intent.CATEGORY_DEFAULT) .setClassName(pkgName, className); } /** * それぞれのプラグインの設定画面に飛ばす * * @param pkgName パッケージ名 * @param className クラス名 * @return 設定画面を起動するためのIntent */ public static Intent createIntentPluginSettings(String pkgName, String className) { return new Intent(TWICCA_ACTION_PLUGIN_SETTINGS) .addCategory(Intent.CATEGORY_DEFAULT); } /** * 飛ばせるtwiccaプラグインのリスト * * @param pm パッケージマネージャ * @param action アクション名 * @return ResolveInfoのList */ public static List<ResolveInfo> getResolveInfo(PackageManager pm, String action) { return pm.queryIntentActivities(new Intent(action), PackageManager.MATCH_DEFAULT_ONLY); } }