package biz.bokhorst.xprivacy;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class XSmsManager extends XHook {
private Methods mMethod;
private XSmsManager(Methods method, String restrictionName) {
super(restrictionName, method.name().replace("Srv_", ""), method.name());
mMethod = method;
}
public String getClassName() {
if (mMethod.name().startsWith("Srv_"))
return "com.android.internal.telephony.IccSmsInterfaceManager";
else
return "android.telephony.SmsManager";
}
// @formatter:off
// public static ArrayList<SmsMessage> getAllMessagesFromIcc()
// public Bundle getCarrierConfigValues()
// public void sendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent)
// public void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents)
// public void sendMultimediaMessage(Context context, Uri contentUri, String locationUrl, Bundle configOverrides, PendingIntent sentIntent)
// public void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
// frameworks/base/telephony/java/android/telephony/SmsManager.java
// http://developer.android.com/reference/android/telephony/SmsManager.html
// public List<SmsRawData> getAllMessagesFromIccEf(String callingPackage)
// public void sendData(java.lang.String callingPkg, java.lang.String destAddr, java.lang.String scAddr, int destPort, byte[] data, android.app.PendingIntent sentIntent, android.app.PendingIntent deliveryIntent)
// public void sendMultipartText(java.lang.String callingPkg, java.lang.String destinationAddress, java.lang.String scAddress, java.util.List<java.lang.String> parts, java.util.List<android.app.PendingIntent> sentIntents, java.util.List<android.app.PendingIntent> deliveryIntents)
// public void sendText(java.lang.String callingPkg, java.lang.String destAddr, java.lang.String scAddr, java.lang.String text, android.app.PendingIntent sentIntent, android.app.PendingIntent deliveryIntent)
// http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/com/android/internal/telephony/IccSmsInterfaceManager.java/
// @formatter:on
// @formatter:off
private enum Methods {
getAllMessagesFromIcc, getCarrierConfigValues, sendDataMessage, sendMultipartTextMessage, sendMultimediaMessage, sendTextMessage,
Srv_getAllMessagesFromIccEf, Srv_sendData, Srv_sendMultipartText, Srv_sendText
};
// @formatter:on
public static List<XHook> getInstances(boolean server) {
List<XHook> listHook = new ArrayList<XHook>();
if (server) {
listHook.add(new XSmsManager(Methods.Srv_getAllMessagesFromIccEf, PrivacyManager.cMessages));
listHook.add(new XSmsManager(Methods.Srv_sendData, PrivacyManager.cCalling));
listHook.add(new XSmsManager(Methods.Srv_sendMultipartText, PrivacyManager.cCalling));
listHook.add(new XSmsManager(Methods.Srv_sendText, PrivacyManager.cCalling));
} else {
listHook.add(new XSmsManager(Methods.getAllMessagesFromIcc, PrivacyManager.cMessages));
listHook.add(new XSmsManager(Methods.getCarrierConfigValues, PrivacyManager.cMessages));
listHook.add(new XSmsManager(Methods.sendDataMessage, PrivacyManager.cCalling));
listHook.add(new XSmsManager(Methods.sendMultimediaMessage, PrivacyManager.cCalling));
listHook.add(new XSmsManager(Methods.sendMultipartTextMessage, PrivacyManager.cCalling));
listHook.add(new XSmsManager(Methods.sendTextMessage, PrivacyManager.cCalling));
}
return listHook;
}
@Override
protected void before(XParam param) throws Throwable {
switch (mMethod) {
case getAllMessagesFromIcc:
case getCarrierConfigValues:
// Do nothing
break;
case sendDataMessage:
case sendMultipartTextMessage:
case sendTextMessage:
if (param.args.length > 0 && param.args[0] instanceof String)
if (isRestrictedExtra(param, (String) param.args[0]))
param.setResult(null);
break;
case sendMultimediaMessage:
if (isRestricted(param))
param.setResult(null);
break;
case Srv_getAllMessagesFromIccEf:
// Do nothing
break;
case Srv_sendData:
case Srv_sendText:
case Srv_sendMultipartText:
if (param.args.length > 1 && (param.args[1] == null || param.args[1] instanceof String))
if (isRestrictedExtra(param, (String) param.args[1]))
param.setResult(null);
break;
}
}
@Override
@SuppressWarnings("rawtypes")
protected void after(XParam param) throws Throwable {
switch (mMethod) {
case getAllMessagesFromIcc:
if (param.getResult() != null && isRestricted(param))
param.setResult(new ArrayList<SmsMessage>());
break;
case getCarrierConfigValues:
if (param.getResult() != null && isRestricted(param))
param.setResult(new Bundle());
break;
case sendDataMessage:
case sendMultimediaMessage:
case sendMultipartTextMessage:
case sendTextMessage:
// Do nothing
break;
case Srv_getAllMessagesFromIccEf:
if (param.getResult() != null && isRestricted(param))
param.setResult(new ArrayList());
break;
case Srv_sendData:
case Srv_sendText:
case Srv_sendMultipartText:
// Do nothing
break;
}
}
}