package com.ushahidi.android.app.opengeosms; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.UUID; import java.util.concurrent.Semaphore; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.telephony.SmsManager; import com.ushahidi.android.app.entities.ReportEntity; import com.ushahidi.android.app.util.Util; /** * @inoran Open GeoSMS */ public class OpenGeoSMSSender { private static Context mContext; public OpenGeoSMSSender(Context c) { mContext = c; } public static String createReport(String url, ReportEntity report) { String date = Util.toLowerCase(Util.formatDate( "MMMM dd, yyyy 'at' hh:mm:ss aaa", Util.datePattern( "MMMM dd, yyyy 'at' hh:mm:ss aaa", report.getIncident() .getDate()), "MM/dd/yyyy hh:mm a", null, Locale.US),mContext); String payload = String.format("%s#%s@%s\n%s\n%s", report.getIncident() .getTitle(), report.getCategories(), date, report.getIncident() .getLocationName(), report.getIncident().getDescription()); return composeOpenGeoSMS(url, String.valueOf(report.getIncident().getLatitude()), String.valueOf(report.getIncident().getLongitude()), payload); } private class Receiver extends BroadcastReceiver { private Semaphore mSem = new Semaphore(0); private boolean mRecvRetVal = false; private List<PendingIntent> mPendingIntents; public boolean waitForResult(List<PendingIntent> pIntents) { mPendingIntents = pIntents; mSem.acquireUninterruptibly(); return mRecvRetVal; } @Override public void onReceive(Context context, Intent intent) { if (getResultCode() != Activity.RESULT_OK) { mRecvRetVal = false; context.unregisterReceiver(this); mSem.release(); return; } // Fix for a potential null object here if (mPendingIntents != null) { mPendingIntents.remove(mPendingIntents.size() - 1); if (mPendingIntents.isEmpty()) { mRecvRetVal = true; context.unregisterReceiver(this); mSem.release(); } } } } public boolean sendReport(String address, String url, ReportEntity report) { String smsMsg = createReport(url, report); SmsManager smsManager = SmsManager.getDefault(); ArrayList<String> msgs = smsManager.divideMessage(smsMsg); ArrayList<PendingIntent> pendingIntents = new ArrayList<PendingIntent>(); String action = OpenGeoSMSSender.class.getCanonicalName() + UUID.randomUUID().toString(); Intent intent = new Intent(action); for (int i = 0; i < msgs.size(); i++) { pendingIntents.add(PendingIntent.getBroadcast(mContext, 0, intent, 0)); } Receiver r = new Receiver(); mContext.registerReceiver(r, new IntentFilter(action)); smsManager.sendMultipartTextMessage(address, null, msgs, pendingIntents, null); return r.waitForResult(pendingIntents); } /* * Open GeoSMS template * Schema://domain/?FirstParameter&RestParameters&GeoSMS=OP Payload */ private static String composeOpenGeoSMS(String url, String lat, String lng, String payload) { String firstParam = "q="; final String postfix = "GeoSMS"; return url + "?" + firstParam + lat + "," + lng + "&" + postfix + "\n" + payload; } }