/** * */ package info.guardianproject.util; import info.guardianproject.otr.app.im.R; import info.guardianproject.otr.app.im.app.ChatFileStore; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.util.Log; import android.webkit.MimeTypeMap; /** * * @author liorsaar * */ /* * Usage: * String filePath = writeFile() ; * Uri fileUri = SystemService.Scanner.scan( context, filePath ) ; // scan that one file * the notification will launch the target activity with the file uri * SystemServices.Ntfcation.sent( context, fileUri, NewChatActivity.class ) ; * in the target activity call: * Uri uri = getIntent().getData() ; * SystemServices.Viewer.viewImage( context, uri ) ; */ public class SystemServices { static class Ntfcation { public static void send(Context aContext, Uri aUri, Class<Activity> aTargetActivityClass) { NotificationManager mNotificationManager = (NotificationManager)aContext.getSystemService(Context.NOTIFICATION_SERVICE); int icon = R.drawable.ic_action_message; CharSequence tickerText = "Secured download completed!"; // TODO string long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickerText, when); CharSequence contentTitle = "ChatSecure notification"; // TODO string CharSequence contentText = "A secured file was successfuly downloaded."; // TODO string Intent notificationIntent = new Intent(aContext, aTargetActivityClass); notificationIntent.setData(aUri); // when the target activity is invoked, extract this uri and call viewImage() PendingIntent contentIntent = PendingIntent.getActivity(aContext, 0, notificationIntent, 0); notification.setLatestEventInfo(aContext, contentTitle, contentText, contentIntent); mNotificationManager.notify(1, notification); } } public static class Scanner { // after writing the file to sd, invoke this to scan a single file without callback public static Uri scan(Context aContext, String aPath) { File file = new File(aPath); Uri uri = Uri.fromFile(file); Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri); aContext.sendBroadcast(scanFileIntent); return uri; } } public static class Viewer { public static void viewImage(Context aContext, Uri aUri) { view(aContext, aUri, "image/*"); } public static void view(Context aContext, Uri aUri, String aMime) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(aUri, aMime); aContext.startActivity(intent); } public static Intent getViewIntent(Uri uri, String type) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(uri, type); return intent; } } public static String sanitize(String path) { try { return URLEncoder.encode(path, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } public static class FileInfo { public String path; public String type; } public final static String MIME_TYPE_JPEG = "image/jpeg"; public final static String MIME_TYPE_PNG = "image/png"; public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { MimeTypeMap mime = MimeTypeMap.getSingleton(); type = mime.getMimeTypeFromExtension(extension); } if (type == null) if (url.endsWith("jpg")) return MIME_TYPE_JPEG; else if (url.endsWith("jpg")) return MIME_TYPE_PNG; return type; } public static FileInfo getFileInfoFromURI(Context aContext, Uri uri) throws IllegalArgumentException { FileInfo info = new FileInfo(); info.path = uri.toString(); if (ChatFileStore.isVfsUri(uri)) { info.path = uri.getPath(); info.type = getMimeType(uri.toString()); return info; } if (uri.getScheme() != null && uri.getScheme().equals("file")) { info.path = uri.getPath(); info.type = getMimeType(uri.toString()); return info; } if (uri.toString().startsWith("content://org.openintents.filemanager/")) { // Work around URI escaping brokenness info.path = uri.toString().replaceFirst("content://org.openintents.filemanager", ""); info.type = getMimeType(uri.toString()); return info; } Cursor cursor = aContext.getContentResolver().query(uri, null, null, null, null); if (cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); //need to check columns for different types int dataIdx = cursor.getColumnIndex(MediaStore.Images.Media.DATA); if (dataIdx != -1) { info.path = cursor.getString(dataIdx); info.type = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE)); } else { dataIdx = cursor.getColumnIndex(MediaStore.Video.Media.DATA); if (dataIdx != -1) { info.path = cursor.getString(dataIdx); info.type = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE)); } else { dataIdx = cursor.getColumnIndex(MediaStore.Audio.Media.DATA); if (dataIdx != -1) { info.path = cursor.getString(dataIdx); info.type = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.MIME_TYPE)); } else { dataIdx = cursor.getColumnIndex(MediaStore.MediaColumns.DATA); if (dataIdx != -1) { info.path = cursor.getString(dataIdx); info.type = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.MIME_TYPE)); } } } } } if (cursor != null) cursor.close(); if (info.type == null) info.type = getMimeType(info.path); return info; } public static FileInfo getContactAsVCardFile(Context context, Uri uri) { AssetFileDescriptor fd; try { fd = context.getContentResolver().openAssetFileDescriptor(uri, "r"); java.io.FileInputStream in = fd.createInputStream(); byte[] buf = new byte[(int) fd.getDeclaredLength()]; in.read(buf); in.close(); String vCardText = new String(buf); Log.d("Vcard", vCardText); List<String> pathSegments = uri.getPathSegments(); String targetPath = "/" + pathSegments.get(pathSegments.size() - 1) + ".vcf"; ChatFileStore.copyToVfs(buf, targetPath); FileInfo info = new FileInfo(); info.path = ChatFileStore.vfsUri(targetPath).toString(); info.type = "text/vcard"; return info; } catch (Exception e) { e.printStackTrace(); } return null; } }