/* * Copyright (C) 2015 Twitter, Inc. * * 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. * * *** * * Original: https://github.com/twitter/twitter-kit-android/blob/a9ff5134a736d10f70331ddea4db35c13cb86c89/tweet-composer/src/main/java/com/twitter/sdk/android/tweetcomposer/TweetComposer.java * Modifications: Kickstarter have added some modifiers and annotations. References to `java.net.URL` have also been * changed to `android.net.URI`. */ package com.kickstarter.libs; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.support.annotation.NonNull; import android.text.TextUtils; import java.util.List; /** * The TweetComposer Kit provides a lightweight mechanism for creating intents to interact with the installed Twitter app or a browser. */ public class TweetComposer { private static final String MIME_TYPE_PLAIN_TEXT = "text/plain"; private static final String MIME_TYPE_JPEG = "image/jpeg"; private static final String TWITTER_PACKAGE_NAME = "com.twitter.android"; private static final String WEB_INTENT = "https://twitter.com/intent/tweet?text=%s&url=%s"; /** * The TweetComposer Builder will use the installed Twitter instance and fall back to a browser */ public static class Builder { private final Context context; private String text; private Uri uri; private Uri imageUri; /** * Initializes a new {@link TweetComposer.Builder} */ public Builder(final @NonNull Context context) { this.context = context; } /** * Sets Text for Tweet Intent, no length validation is performed */ public Builder text(final @NonNull String text) { if (this.text != null) { throw new IllegalStateException("text already set."); } this.text = text; return this; } /** * Sets Uri for Tweet Intent, no length validation is performed */ public Builder uri(final @NonNull Uri uri) { if (this.uri != null) { throw new IllegalStateException("url already set."); } this.uri = uri; return this; } /** * Sets Image {@link android.net.Uri} for the Tweet. Only valid if the Twitter App is * installed. * The Uri should be a file Uri to a local file (e.g. <pre><code>Uri.fromFile(someExternalStorageFile)</code></pre>)) */ public Builder image(final @NonNull Uri imageUri) { if (this.imageUri != null) { throw new IllegalStateException("imageUri already set."); } this.imageUri = imageUri; return this; } /** * Creates {@link android.content.Intent} based on data in {@link TweetComposer.Builder} * @return an Intent to the Twitter for Android or a web intent. */ public Intent createIntent() { Intent intent = createTwitterIntent(); if (intent == null) { intent = createWebIntent(); } return intent; } Intent createTwitterIntent() { final Intent intent = new Intent(Intent.ACTION_SEND); final StringBuilder builder = new StringBuilder(); if (!TextUtils.isEmpty(text)) { builder.append(text); } if (uri != null) { if (builder.length() > 0) { builder.append(' '); } builder.append(uri.toString()); } intent.putExtra(Intent.EXTRA_TEXT, builder.toString()); intent.setType(MIME_TYPE_PLAIN_TEXT); if (imageUri != null) { intent.putExtra(Intent.EXTRA_STREAM, imageUri); intent.setType(MIME_TYPE_JPEG); } final PackageManager packManager = context.getPackageManager(); final List<ResolveInfo> resolvedInfoList = packManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo: resolvedInfoList){ if (resolveInfo.activityInfo.packageName.startsWith(TWITTER_PACKAGE_NAME)){ intent.setClassName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); return intent; } } return null; } Intent createWebIntent() { final String uri = this.uri == null ? "" : this.uri.toString(); final String tweetUrl = String.format(WEB_INTENT, Uri.encode(text), uri); return new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl)); } /** * Starts the intent created in {@link TweetComposer.Builder#createIntent()} */ public void show() { final Intent intent = createIntent(); context.startActivity(intent); } } }