Skip to content
Browse files

Merge pull request #867 from ObjetDirect/master

[Android] Twitter plugin for Android
  • Loading branch information...
2 parents 1f82bfb + 39009fa commit 006a24f7aa53ef680955229eb473c41d52e27ed9 @devgeeks devgeeks committed
Showing with 308 additions and 0 deletions.
  1. +137 −0 Android/Twitter/README
  2. +149 −0 Android/Twitter/src/com/phonegap/plugins/twitter/Twitter.java
  3. +22 −0 Android/Twitter/www/twitter.js
View
137 Android/Twitter/README
@@ -0,0 +1,137 @@
+# Twitter plugin for Phonegap #
+
+This is inspired from the excellent iOS' plugin: https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/Twitter
+
+For the moment, only two (major) functions are binding:
+1. isTwitterAvailable
+2. composeTweet
+
+## Adding the Plugin to your project ##
+
+Using this plugin requires [Android PhoneGap](http://github.com/phonegap/phonegap-android).
+
+1. To install the plugin, move www/twitter.js to your project's www folder and include a reference to it in your html file after phonegap.js.
+
+ <script type="text/javascript" charset="utf-8" src="phonegap.js"></script>
+ <script type="text/javascript" charset="utf-8" src="twitter.js"></script>
+
+2. Create a directory within your project called "src/com/phonegap/plugins/twitter" and move Twitter.java into it.
+
+3. In your res/xml/plugins.xml file add the following line:
+
+ &lt;plugin name="Twitter" value="com.phonegap.plugins.twitter.Twitter"/&gt;
+
+## Using the plugin ##
+
+The plugin creates the object `window.plugins.twitter`. To use, call one of the following, available methods:
+
+<pre>
+ /**
+ * Check if Twitter is installed
+ *
+ */
+ isTwitterAvailable(success, failure)
+</pre>
+
+Sample use:
+
+ window.plugins.twitter.isTwitterAvailable(
+ function(bool){
+ if(bool){
+ // Do something
+
+ } else {
+ alert("Twitter is not available");
+ }
+ },
+ function(){
+ alert("We have a problem with the plugin");
+ }
+ );
+
+<pre>
+ /**
+ * Compose tweet and open the Twitter application
+ */
+ composeTweet(success, failure, message) {
+</pre>
+
+Sample use:
+
+ window.plugins.twitter.composeTweet(
+ function(){
+ },
+ function(){
+ alert("We have a problem with the plugin");
+ },
+ "Base of the tweet"
+ );
+
+
+## LICENSE ##
+
+PhoneGap is available under *either* the terms of the modified BSD license *or* the
+MIT License (2008). As a recipient of PhonegGap, you may choose which
+license to receive this code under (except as noted in per-module LICENSE
+files). Some modules may not be the copyright of Nitobi. These
+modules contain explicit declarations of copyright in both the LICENSE files in
+the directories in which they reside and in the code itself. No external
+contributions are allowed under licenses which are fundamentally incompatible
+with the MIT or BSD licenses that PhoneGap is distributed under.
+
+The text of the MIT and BSD licenses is reproduced below.
+
+---
+
+### The "New" BSD License
+
+Copyright (c) 2005-2011, Nitobi Software Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of Phonegap/Nitobi nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+### The MIT License
+
+Copyright (c) <2012> <Objet Direct>
+
+ 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.
+
View
149 Android/Twitter/src/com/phonegap/plugins/twitter/Twitter.java
@@ -0,0 +1,149 @@
+package com.phonegap.plugins.twitter;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import com.phonegap.api.Plugin;
+import com.phonegap.api.PluginResult;
+
+/**
+ * Twitter plugin for Android
+ * Inspired of the iOS plugin: https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/Twitter
+ *
+ * @see http://regis.decamps.info/blog/2011/06/intent-to-open-twitter-client-on-android/
+ * @see http://blogrescue.com/2011/12/android-development-send-tweet-action/
+ *
+ * @author Julien Roche
+ * @version 1.0
+ */
+public class Twitter extends Plugin {
+ // Constants
+ /** ComposeTweet method's name */
+ private static final String METHOD_COMPOSE_TWEET = "composeTweet";
+
+ /** IsTwitterAvailable method's name */
+ private static final String METHOD_IS_TWITTER_AVAILABLE = "isTwitterAvailable";
+
+ /** List of Twitter's applications with theirs linked send Activity */
+ private static Map<String, String> TWITTER_APPS;
+
+ /** List of available methods */
+ private static final String[] AVAILABLE_METHODS = new String[]{ METHOD_COMPOSE_TWEET, METHOD_IS_TWITTER_AVAILABLE };
+
+ static {
+ TWITTER_APPS = new LinkedHashMap<String, String>();
+ TWITTER_APPS.put("Twitter", "com.twitter.android.PostActivity");
+ TWITTER_APPS.put("TweetCaster", "com.handmark.tweetcaster.NewTwitActivity");
+ TWITTER_APPS.put("TweetCaster2", "com.handmark.tweetcaster.ShareSelectorActivity");
+ TWITTER_APPS.put("UberSocial", "com.twidroid.activity.SendTweet");
+ TWITTER_APPS.put("TweetDeck", "com.tweetdeck.compose.ComposeActivity");
+ TWITTER_APPS.put("Seesmic", "com.seesmic.ui.Composer");
+ TWITTER_APPS.put("Plume", "com.levelup.touiteur.appwidgets.TouiteurWidgetNewTweet");
+ TWITTER_APPS.put("Twicca", "jp.r246.twicca.statuses.Send");
+ }
+
+ /**
+ * @param args
+ * @param callbackId
+ * @return A PluginResult object with a status and message.
+ */
+ public PluginResult composeTweet(JSONArray args, String callbackId) {
+ ResolveInfo resolveInfo = getTwitterResolveInfo();
+ String message;
+
+ if(resolveInfo == null){
+ return new PluginResult(PluginResult.Status.ERROR, "Twitter is not available");
+ }
+
+ if(args.length() <= 0){
+ return new PluginResult(PluginResult.Status.ERROR, "No parameter was specified");
+ }
+
+
+ try {
+ message = args.getString(0);
+
+ } catch (JSONException e) {
+ return new PluginResult(PluginResult.Status.ERROR, "Error with the message");
+ }
+
+ final ActivityInfo activity = resolveInfo.activityInfo;
+ final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
+ String p = resolveInfo.activityInfo.packageName;
+
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.putExtra(Intent.EXTRA_TEXT, message);
+ intent.setType(p != null && p.startsWith("com.twidroid") ? "application/twitter" : "text/plain");
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+ intent.setComponent(name);
+ this.ctx.startActivity(intent);
+
+ return new PluginResult(PluginResult.Status.OK);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see com.phonegap.api.Plugin#execute(java.lang.String, org.json.JSONArray, java.lang.String)
+ */
+ @Override
+ public PluginResult execute(String action, JSONArray args, String callbackId) {
+ if(action != null && Arrays.binarySearch(AVAILABLE_METHODS, action) >= 0){
+ if(METHOD_IS_TWITTER_AVAILABLE.equals(action)){
+ return new PluginResult(PluginResult.Status.OK, isTwitterAvailable());
+
+ }
+
+ if(METHOD_COMPOSE_TWEET.equals(action)) {
+ return composeTweet(args, callbackId);
+ }
+ }
+
+ return new PluginResult(PluginResult.Status.ERROR, "This method is not available");
+ }
+
+ /**
+ * Get the Twitter's {@link ResolveInfo}
+ * @return the Twitter's {@link ResolveInfo}
+ */
+ public ResolveInfo getTwitterResolveInfo() {
+ try{
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
+ intent.setType("text/plain");
+
+ final PackageManager pm = this.ctx.getPackageManager();
+ for(ResolveInfo resolveInfo: pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)){
+ ActivityInfo activity = resolveInfo.activityInfo;
+ if (TWITTER_APPS.containsValue(activity.name)) {
+ return resolveInfo;
+ }
+ }
+
+ }
+ finally {
+
+ }
+
+
+ return null;
+ }
+
+ /**
+ * Check if the Twitter is available
+ * @return true if a Twitter activity is detected
+ */
+ public boolean isTwitterAvailable() {
+ return getTwitterResolveInfo() != null;
+ }
+}
View
22 Android/Twitter/www/twitter.js
@@ -0,0 +1,22 @@
+/**
+ * Base of the Android version for Twitter
+ * @see https://github.com/phonegap/phonegap-plugins/tree/master/iPhone/Twitter
+ */
+var Twitter =
+{
+ /**
+ * Check if the serrvice is available
+ */
+ isTwitterAvailable: function( success, failure )
+ {
+ PhoneGap.exec( success, failure, "Twitter", "isTwitterAvailable", []);
+ },
+
+ /**
+ * Try to open Twitter for sending the message
+ */
+ composeTweet: function( success, failure, tweetText, options)
+ {
+ PhoneGap.exec(success, failure, "Twitter", "composeTweet", [tweetText]);
+ }
+};

0 comments on commit 006a24f

Please sign in to comment.
Something went wrong with that request. Please try again.