/*
* Copyright 2013 wada811<at.wada811@gmail.com>
*
* 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 at.wada811.utils;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class IntentUtils {
/**
* Intent可能なActivityを返す
*
* @param context
* @param intent
* @return
*/
public static List<ResolveInfo> queryIntentActivities(Context context, Intent intent){
PackageManager packageManager = context.getPackageManager();
return packageManager.queryIntentActivities(intent, 0);
}
/**
* Intent可能かを返す
*
* @param context
* @param intent
* @return
*/
public static boolean canIntent(Context context, Intent intent){
List<ResolveInfo> activities = IntentUtils.queryIntentActivities(context, intent);
return activities != null && !activities.isEmpty();
}
/**
* PendingIntent for OneShot Notification
*
* @param context
* @return
*/
public static PendingIntent createOneShotPendingIntent(Context context){
int requestCode = 0; // Private request code for the sender (currently not used).
Intent intent = new Intent();
return PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_ONE_SHOT);
}
/**
* ファイルをViewerアプリで開くIntentを作成する
*
* @param filePath
* @param mimeType
* @return intent
*/
public static Intent createFileViewIntent(String filePath){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(filePath)), MediaUtils.getMimeType(filePath));
return intent;
}
/**
* ファイルをViewerアプリで開くPendingIntentを作成する
*
* @param context
* @param filePath
* @param mimeType
* @return pendingIntent
*/
public static PendingIntent createFileViewPendingIntent(Context context, String filePath){
int requestCode = 0; // Private request code for the sender (currently not used).
Intent intent = IntentUtils.createFileViewIntent(filePath);
PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
/**
* メールを送信するIntentを作成する
*
* @param mailto
* @param subject
* @param body
*/
public static Intent createSendMailIntent(String mailto, String subject, String body){
return IntentUtils.createSendMailIntent(new String[]{
mailto
}, new String[]{}, new String[]{}, subject, body);
}
/**
* メールを送信するIntentを作成する
*
* @param mailto
* @param subject
* @param body
*/
public static Intent createSendMailIntent(String[] mailto, String subject, String body){
return IntentUtils.createSendMailIntent(mailto, new String[]{}, new String[]{}, subject, body);
}
/**
* メールを送信するIntentを作成する
*
* @param mailto
* @param cc
* @param bcc
* @param subject
* @param body
*/
public static Intent createSendMailIntent(String[] mailto, String[] cc, String[] bcc, String subject, String body){
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(HTTP.PLAIN_TEXT_TYPE);
intent.putExtra(Intent.EXTRA_EMAIL, mailto);
intent.putExtra(Intent.EXTRA_CC, cc);
intent.putExtra(Intent.EXTRA_BCC, bcc);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, body);
return intent;
}
/**
* メールIntentにファイルを添付する
*
* @param intent
* @param filePath
* @return
*/
public static Intent addFile(Intent intent, String filePath){
return IntentUtils.addFile(intent, new File(filePath));
}
/**
* メールIntentにファイルを添付する
*
* @param intent
* @param file
* @return
*/
public static Intent addFile(Intent intent, File file){
return IntentUtils.addFile(intent, Uri.fromFile(file), MediaUtils.getMimeType(file));
}
/**
* メールIntentにファイルを添付する
*
* @param intent
* @param uri
* @param mimeType
* @return
*/
public static Intent addFile(Intent intent, Uri uri, String mimeType){
intent.setType(mimeType);
intent.putExtra(Intent.EXTRA_STREAM, uri);
return intent;
}
/**
* メールIntentに複数ファイルを送信する
*
* @param intent
* @param filePaths
* @param mimeType
* @return
*/
public static Intent addFiles(Intent intent, ArrayList<String> filePaths, String mimeType){
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.setType(mimeType);
ArrayList<Uri> uris = new ArrayList<Uri>(filePaths.size());
for(String filePath : filePaths){
uris.add(Uri.fromFile(new File(filePath)));
}
intent.putExtra(Intent.EXTRA_STREAM, uris);
return intent;
}
/**
* Gmail送信Intentを作成する
*
* @param intent
* @return
*/
public static Intent createGmailIntent(Intent baseIntent){
Intent intent = new Intent(baseIntent);
intent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
return intent;
}
/**
* ブラウザを開くIntentを作成する
*
* @param url
*/
public static Intent createOpenBrowserIntent(String url){
return new Intent(Intent.ACTION_VIEW, Uri.parse(url));
}
/**
* ダイアルを開くIntentを作成する
*
* @param context
* @param tel
*/
public static Intent createOpenDialIntent(String tel){
return new Intent(Intent.ACTION_VIEW, Uri.parse("tel:" + tel));
}
/**
* 電話をかけるIntentを作成する
*
* @param tel
*/
public static Intent createCallIntent(String tel){
return new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
}
/**
* 電話をかけるIntentを作成する
*
* @param context
* @param tel
*/
public static Intent createDailIntent(String tel){
return new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel));
}
/**
* 設定を開くIntentを作成する
*/
public static Intent createOpenSettingsIntent(){
return new Intent("android.settings.SETTINGS");
}
/**
* アンインストール画面を開くIntentを作成する
*
* @param packageName
*/
public static Intent createOpenUninstallIntent(String packageName){
return new Intent(Intent.ACTION_DELETE, Uri.fromParts("package", packageName, null));
}
/**
* マーケットを開くIntentを作成する
*
* @param packageName
*/
public static Intent createOpenMarketIntent(String packageName){
return new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
}
/**
* マーケットを検索するIntentを作成する
*
* @param query
*/
public static Intent createSearchMarketIntent(String query){
return new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=" + query));
}
/**
* テキストを送るIntentを作成する
*/
public static Intent createSendTextIntent(String text){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text);
return intent;
}
/**
* 画像を送るIntentを作成する
*/
public static Intent createSendImageIntent(String filePath){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType(MediaUtils.getMimeType(filePath));
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + filePath));
return intent;
}
public static String dump(Intent intent) throws JSONException{
JSONObject json = new JSONObject();
json.put("action", intent.getAction());
if(intent.getCategories() != null){
JSONArray categories = new JSONArray();
for(String category : intent.getCategories()){
categories.put(category);
}
json.put("category", categories);
}
json.put("type", intent.getType());
Bundle bundle = intent.getExtras();
if(bundle != null){
JSONObject extras = new JSONObject();
for(String key : bundle.keySet()){
extras.put(key, bundle.get(key));
}
json.put("extras", extras);
}
return json.toString(4);
}
}