/* Copyright (c) 2009 Matthias Käppler
*
* 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.github.droidfu.support;
import java.io.File;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.provider.MediaStore;
public class IntentSupport {
public static final String MIME_TYPE_EMAIL = "message/rfc822";
public static final String MIME_TYPE_TEXT = "text/*";
/**
* Checks whether there are applications installed which are able to handle the given
* action/data.
*
* @param context
* the current context
* @param action
* the action to check
* @param uri
* that data URI to check (may be null)
* @param mimeType
* the MIME type of the content (may be null)
* @return true if there are apps which will respond to this action/data
*/
public static boolean isIntentAvailable(Context context, String action, Uri uri, String mimeType) {
final Intent intent = (uri != null) ? new Intent(action, uri) : new Intent(action);
if (mimeType != null) {
intent.setType(mimeType);
}
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return !list.isEmpty();
}
/**
* Checks whether there are applications installed which are able to handle the given
* action/type.
*
* @param context
* the current context
* @param action
* the action to check
* @param mimeType
* the MIME type of the content (may be null)
* @return true if there are apps which will respond to this action/type
*/
public static boolean isIntentAvailable(Context context, String action, String mimeType) {
final Intent intent = new Intent(action);
if (mimeType != null) {
intent.setType(mimeType);
}
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return !list.isEmpty();
}
/**
* Checks whether there are applications installed which are able to handle the given intent.
*
* @param context
* the current context
* @param intent
* the intent to check
* @return true if there are apps which will respond to this intent
*/
public static boolean isIntentAvailable(Context context, Intent intent) {
List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return !list.isEmpty();
}
public static Intent newEmailIntent(Context context, String address, String subject, String body) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { address });
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.setType(MIME_TYPE_EMAIL);
return intent;
}
public static Intent newShareIntent(Context context, String subject, String message,
String chooserDialogTitle) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, message);
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
shareIntent.setType(MIME_TYPE_TEXT);
return Intent.createChooser(shareIntent, chooserDialogTitle);
}
public static Intent newMapsIntent(String address, String placeTitle) {
StringBuilder sb = new StringBuilder();
sb.append("geo:0,0?q=");
String addressEncoded = Uri.encode(address);
sb.append(addressEncoded);
// pass text for the info window
String titleEncoded = Uri.encode("(" + placeTitle + ")");
sb.append(titleEncoded);
// set locale; probably not required for the maps app?
sb.append("&hl=" + Locale.getDefault().getLanguage());
return new Intent(Intent.ACTION_VIEW, Uri.parse(sb.toString()));
}
/**
* Creates an intent which when fired, will launch the camera to take a picture that's saved to
* a temporary file so you can use it directly without going through the gallery.
*
* @param tempFile
* the file that should be used to temporarily store the picture
* @return the intent
*/
public static Intent newTakePictureIntent(File tempFile) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
return intent;
}
/**
* Creates an intent which when fired, will launch the phone's picture gallery to select a
* picture from it.
*
* @return the intent
*/
public static Intent newSelectPictureIntent() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
return intent;
}
/**
* Creates an intent that will open the phone app and enter the given number. Unlike
* {@link #newCallNumberIntent(String)}, this does not actually dispatch the call, so it gives
* the user a chance to review and edit the number.
*
* @param phoneNumber
* the number to dial
* @return the intent
*/
public static Intent newDialNumberIntent(String phoneNumber) {
return new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phoneNumber.replace(" ", "")));
}
/**
* Creates an intent that will immediately dispatch a call to the given number. NOTE that unlike
* {@link #newDialNumberIntent(String)}, this intent requires the
* {@link android.Manifest.permission#CALL_PHONE} permission to be set.
*
* @param phoneNumber
* the number to call
* @return the intent
*/
public static Intent newCallNumberIntent(String phoneNumber) {
return new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber.replace(" ", "")));
}
}