package com.integreight.onesheeld.shields.controller; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.IntentFilter; import android.telephony.SmsManager; import android.telephony.TelephonyManager; import com.integreight.onesheeld.sdk.ShieldFrame; import com.integreight.onesheeld.R; import com.integreight.onesheeld.enums.UIShield; import com.integreight.onesheeld.shields.ControllerParent; import com.integreight.onesheeld.shields.controller.utils.SmsListener; import com.integreight.onesheeld.shields.controller.utils.SmsListener.SmsReceiveEventHandler; import com.integreight.onesheeld.utils.Log; public class SmsShield extends ControllerParent<SmsShield> { private SmsEventHandler eventHandler; private String lastSmsText; private String lastSmsNumber; private static final byte SEND_SMS_METHOD_ID = (byte) 0x01; private SmsListener smsListener; private ShieldFrame frame; public String getLastSmsText() { return lastSmsText; } public String getLastSmsNumber() { return lastSmsNumber; } public SmsShield() { super(); } @Override public ControllerParent<SmsShield> init(String tag) { smsListener = new SmsListener(); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); if (smsReceiveEventHandler != null) smsListener.setSmsReceiveEventHandler(smsReceiveEventHandler); getApplication().registerReceiver(smsListener, filter); return super.init(tag); } @Override public ControllerParent<SmsShield> invalidate( com.integreight.onesheeld.shields.ControllerParent.SelectionAction selectionAction, boolean isToastable) { this.selectionAction = selectionAction; TelephonyManager tm = (TelephonyManager) getApplication() .getSystemService(Context.TELEPHONY_SERVICE); if (tm.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) { // No calling functionality if (this.selectionAction != null) { this.selectionAction.onFailure(); if (isToastable) activity.showToast(activity.getString(R.string.sms_your_device_doesnt_have_a_sim_card)); } } else { addRequiredPremission(Manifest.permission.READ_SMS); addRequiredPremission(Manifest.permission.SEND_SMS); addRequiredPremission(Manifest.permission.RECEIVE_SMS); if (checkForPermissions()) { // calling functionality if (this.selectionAction != null) { this.selectionAction.onSuccess(); } }else{ if (this.selectionAction != null) { this.selectionAction.onFailure(); } } } return super.invalidate(selectionAction, isToastable); } public SmsShield(Activity activity, String tag) { super(activity, tag); } protected void sendSms(String smsNumber, String smsText) { try { SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(smsNumber, null, smsText, null, null); if (eventHandler != null) eventHandler.onSmsSent(smsNumber, smsText); } catch (Exception e) { if (eventHandler != null) eventHandler.onSmsFail(e.getMessage()); Log.e("TAG", "sendSms::sendTextMessage", e); } } public void setSmsEventHandler(SmsEventHandler eventHandler) { this.eventHandler = eventHandler; } public interface SmsEventHandler { void onSmsSent(String smsNumber, String smsText); void onSmsFail(String error); } @Override public void onNewShieldFrameReceived(ShieldFrame frame) { // TODO Auto-generated method stub if (frame.getShieldId() == UIShield.SMS_SHIELD.getId()) { String smsNumber = frame.getArgumentAsString(0); String smsText = frame.getArgumentAsString(1); lastSmsText = smsText; if (frame.getFunctionId() == SEND_SMS_METHOD_ID) { sendSms(smsNumber, smsText); } } } private SmsReceiveEventHandler smsReceiveEventHandler = new SmsReceiveEventHandler() { @Override public void onSmsReceiveSuccess(String mobile_num, String sms_body) { // send frame contain SMS body.. Log.d("SMS::Controller::onSmsReceiveSuccess", sms_body); frame = new ShieldFrame(UIShield.SMS_SHIELD.getId(), (byte) 0x01); frame.addArgument(mobile_num); frame.addArgument(sms_body); Log.d("Fram", frame.getArgumentAsString(1)); sendShieldFrame(frame,true); } @Override public void onSmsReceiveFailed() { Log.d("SMS::Controller::onSmsReceiveFailed", "Failed to receive SMS !"); } }; @Override public void reset() { try { getApplication().unregisterReceiver(smsListener); } catch (Exception e) { } frame = null; smsListener = null; } }