/**
*
*/
package info.guardianproject.util;
import info.guardianproject.otr.app.im.R;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
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.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
/**
*
* @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 = "Gibberbot 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 static FileInfo getFileInfoFromURI(Context aContext, Uri uri) throws IllegalArgumentException {
FileInfo info = new FileInfo();
if (uri.getScheme() != null && uri.getScheme().equals("file")) {
info.path = uri.getPath();
return info;
}
if (uri.toString().startsWith("content://org.openintents.filemanager/")) {
// Work around URI escaping brokenness
info.path = uri.toString().replaceFirst("content://org.openintents.filemanager", "");
return info;
}
Cursor cursor = aContext.getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
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));
return info;
}
else
return null;
}
}