package com.ittianyu.mobileguard.service;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Telephony;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import com.ittianyu.mobileguard.constant.Constant;
import com.ittianyu.mobileguard.dao.BlacklistDao;
import com.ittianyu.mobileguard.db.BlacklistDb;
import com.ittianyu.mobileguard.domain.BlacklistBean;
import com.ittianyu.mobileguard.utils.CallUtils;
import com.ittianyu.mobileguard.utils.SmsUtils;
/**
* blacklist intercept service
* will intercept call or sms if the phone number in blacklist
*/
public class BlacklistInterceptService extends Service {
private static final String URI_CALL = "content://call_log/calls";
private SmsReceiver smsReceiver;
private TelephonyManager telephonyManager;
private PhoneStateListener phoneStateListener = new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
// state is not CALL_STATE_RINGING
if(TelephonyManager.CALL_STATE_RINGING != state) {
return;
}
// check whether in blacklist
BlacklistDao dao = new BlacklistDao(BlacklistInterceptService.this);
BlacklistBean bean = dao.selectByPhone(incomingNumber);
if(null == bean) {// not in blacklist
return;
}
// check mode whether has call
int mode = bean.getMode();
if((BlacklistDb.MODE_CALL & mode) != 0) {// has call mode, need intercept
// register call database data change listener
getContentResolver().registerContentObserver(Uri.parse(URI_CALL),
true, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
// unregister listener, just delete once
getContentResolver().unregisterContentObserver(this);
// delete the current call record
int count = CallUtils.deleteLatestCall(BlacklistInterceptService.this, incomingNumber);
System.out.println("delete count = " + count);
}
});
if (CallUtils.endCall()) {
System.out.println("call from " + incomingNumber + " was intercepted");
} else {
System.out.println("call from " + incomingNumber + " was failed to intercepted");
}
}
}
};
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
// System.out.println("BlacklistInterceptService onCreate");
// register call listener
telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
// register sms receiver
smsReceiver = new SmsReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Constant.ACTION_SMS_RECEIVED);
// set max priority
filter.setPriority(Integer.MAX_VALUE);
// register
registerReceiver(smsReceiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
System.out.println("BlacklistInterceptService onDestroy");
// unregister call listener
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
// unregister sms receiver
unregisterReceiver(smsReceiver);
}
}
class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// get sms messages
SmsMessage[] messages = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
} else {
messages = SmsUtils.getMessagesFromIntent(intent);
}
// check whether sender in blacklist
BlacklistDao dao = new BlacklistDao(context);
for (SmsMessage message: messages) {
// get sender
String sender = message.getOriginatingAddress();
// select by phone
BlacklistBean bean = dao.selectByPhone(sender);
if(null == bean) {// not in blacklist
continue;
}
// check intercept mode
if((BlacklistDb.MODE_SMS & bean.getMode()) != 0) {// has sms mode, need intercept
// abort sms
abortBroadcast();
}
}
}
}