===== Integrating Plugin Apps with SDMM =====
Plugin apps are classifed as apps that intercept or modify messages. These apps may block or alter messages, and in some cases they respond to the sender according to the user's setup in the plugin app. Your app will have permission to modify existing messages as they are received. If your app requires other features either select a different **Access Type** or contact us for premium access details.
SDMM allows your app to abort and/or modify messages prior to being processed by a full-featured messaging app. When you integrate and register with SDMM, SDMM will notify your app of any incoming messages prior to them being processed by the full-featured app.
To integrate with SDMM, do the following:
1. [[SDK|Download and import the SDK]] into your IDE. You will need to include the SDK as a library in your app's project.
2. Copy the //sdmm_default_strings.xml// file to your /res/strings directory.
3. Change the following entries to match your app:
1
Super Duper Messaging Manager SDK
sdmm_test_id
com.sdmmllc.superdupersmsmanager.sdk
com.sdmmllc.superdupersmsmanager.sdk.SMS_RECEIVED_CLASS
com.sdmmllc.superdupersmsmanager.sdk.WAP_PUSH_RECEIVED_CLASS
The //sdmm_app_version// is for your reference only when we are assisting with debugging online.
Enter your app's name for //sdmm_app_name// - this should match your Play Store name.
After your register your app with SDMM, you will receive the //sdmm_app_id// for this app. For testing you do not have to change it.
Enter your app's "package name" for //sdmm_package_id//. We use this to validate your app's access authority since many developers have lots of apps and **Access Type** may change over the life of the app.
Your //SMS_RECEIVED_CLASS// should be the class that has the INTENT-FILTER for SMS_RECEIVED and //WAP_PUSH_RECEIVED_CLASS// should be for WAP_PUSH_RECEIVED (if your app captures MMS intents). This should be a fully qualified class name (i.e. com.example.receivers.sms_receiver).
4. Change the //sdmm_access_type// to 3:
3
5. To register your app with SDMM on the device, include this call in your //Application// class "onCreate" method (if you do not have one, you can easily create one [[http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/|for example]]):
public void onCreate() {
SDSmsManager.initialize(this);
SDSmsManager.getDefault().setReceiverCallback(mCallback);
}
private SDSmsReceiveCallback mCallback = new SDSmsReceiveCallback() {
@Override
public boolean onReceive(Intent intent) throws RemoteException {
YourAppSmsReceiver receiver = new YourAppSmsReceiver();
receiver.onReceive(SDSmsManager.getContext(), intent);
boolean aborted = false;
if (intent.hasExtra(abort)) aborted = true;
Log.i(TAG, "SDMM integration success! message aborted: " + aborted);
return aborted;
}
@Override
public String testCallbackConnection(String text) {
Log.i(TAG, "testConnection text:" + text);
return "Connection successful for " + TAG;
}
@Override
public boolean reload() {
return false;
}
};
Replace //**YourAppSmsReceiver**// with the name of your app's SMS receiver where you receive SMS messages. If you want to modify the SMS/MMS, then you must modify the contents of this intent when it is received. The modified contents will propagate to the SMS/MMS database.
6. With each SMS, SDMM will send a duplicate SMS broadcast with a "DUPLICATE" extra. When your app recognizes an incoming SMS/MMS that should be blocked, check the SMS intent for the SDMM extra "DUPLICATE" so your app can signal SDMM that the message should be aborted. To block the message, check for the DUPLICATE extra and abort the broadcast like this:
String sdmmDup = "";
if (intent.hasExtra(SDSmsConsts.SDSMS_DUPLICATE)) sdmmDup = SDSmsConsts.SDSMS_DUPLICATE;
if (!SDSmsConsts.SDSMS_DUPLICATE.equals(sdmmDup)) {
// your code here
//
//
// if you want SDMM to abort the message, include the following two lines
if (your_code_abort_this_message) {
setResultCode(0);
setResultData(SDSmsConsts.SDSMS_ABORT);
}
} else {
// like the example above, these codes tell SDMM to ignore the broadcast
setResultCode(0);
setResultData(SDSmsConsts.SDSMS_ABORT);
}
Setting the appropriate result code and result data will tell SDMM that the message should not propagate further. It will not be written to the SMS database. If you do not abort the message, it will be propagate to subsequent plugins and/or the full-featured messaging app to be written to the SMS/MMS database.
7. Replace all SmsManager calls with SDSmsManager calls, like this:
SDSmsManager sms = SDSmsManager.getDefault();
try {
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
} catch (Exception e) {
// error sending message, attempt to resend or ignore
}
If you need to intercept MMS messages, please contact us for the appropriate protocol. MMS integration with plugins is more complex.
9. If you use a SqliteWrapper, like many examples that are readily available, simply replace your import statement in those classes with the following:
import com.sdmmllc.superdupersmsmanager.database.sqlite.SqliteWrapper;
The included class does URI resolution normally except that the standard "sms" authority is replaced with the "sdsms" authority. When SDMM is the Default Messaging App, SDMM will handle the call. If another app is the Default Messaging App, it will resolve to the standard "sms" authority and your response message will be written to the SMS database.
10. **(New with SDK 0.95) - BETA Feature: SDMM is NOT the Default SMS App**
To try to use your app **without** SDMM as the default messaging app, you:
Remove your "abort" call if SDMM is installed. Do **not** abort the SMS_RECEIVED intent using the system "abort" call. Only perform the Android system "abort" if SDMM is not installed. To properly **abort** when SDMM is install only perform the SDMM abort on the SDMM Duplicate message.
SDMM will send a duplicate SMS_RECEIVED message to your app. To properly abort a message, you should **not** abort the original message. In Android KitKat+, apps are **not** supposed to be able to abort the SMS_RECEIVED intent, but on some (or most) platforms it can. If it does, then SDMM will not receive any notice of the SMS_RECEIVED (but the Default SMS App **will** get the SMS_DELIVERED intent). This will create a bad user experience.
To allow for appropriate processing, your app should **not** abort the SMS_RECEIVED intent. Then, SDMM will query your app with a duplicate SMS_RECEIVED intent and that intent should return the ABORT flag to SDMM as demonstrated here:
String sdsmsDup = "";
// look for this string for the duplicate SMS_RECEIVED broadcast
if (intent.hasExtra(SDSmsConsts.SDSMS_DUPLICATE)) sdsmsDup = SDSmsConsts.SDSMS_DUPLICATE;
// then check if the SMS_RECEIVED intent is an SDMM duplicate
// then indicate the abort accordingly
if (SDSmsConsts.SDSMS_DUPLICATE.equals(sdsmsDup)) {
// this code will abort the message in SDMM
//
Log.i(TAG, "aborting intent for SDSMS");
setResultCode(0);
setResultData(SDSmsConsts.SDSMS_ABORT);
intent.putExtra(abort, true);
Log.i(TAG, "SDSmsManager found, duplicate intent signal for abort");
} else if (!SDSmsManager.isSdsmsIntstalled()) {
// insert your code to abort intent for non-KitKat+ devices
//
Log.i(TAG, "SDSmsManager not found, aborting message");
}
This will appropriately signal SDMM to abort the SMS_RECEIVED intent. When SDMM is not the default, you should not abort the broadcast in order for SDMM to process the intent appropriately.
**BETA WARNING**
This is in Beta. SDMM will attempt to cancel any notifications related to the SMS message, but we are still working on ways to improve that experience. It appears to work on some platforms fairly well and on some platforms it is a "poor" experience, but it still essentially works on all tested systems.
Please test this since we do not have all devices available. Also, be aware that SDMM will attempt to dismiss any notifications related to the SMS. It my "roll" and the ticker message may be visible briefly, but it should dismiss before being available in the notification drawer. However, we are working on improving the response time so that it will dismiss prior to even being displayed. It may be advisable to warn your users. (We are working on standard messaging for this.)
Please let us know if you have difficulty with this feature. Thanks!