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.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.view.View; import android.widget.TextView; import com.ittianyu.mobileguard.R; import com.ittianyu.mobileguard.engine.PhoneLocationEngine; import com.ittianyu.mobileguard.view.FloatToast; /** * This service will show location when incoming call or dialing */ public class IncomingLocationService extends Service { private TelephonyManager manager; private PhoneStateListener listener; private FloatToast floatToast;// the toast private TextView tvLocation; private PhoneLocationEngine phoneLocationEngine = new PhoneLocationEngine(); private OutgoingCallReceiver outgoingCallReceiver; private boolean outgoing;// whether outgoing call, use it when CALL_STATE_OFFHOOK @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); // create float toast View locationView = View.inflate(this, R.layout.sys_toast, null); tvLocation = (TextView) locationView.findViewById(R.id.tv_float_toast_location); floatToast = FloatToast.makeView(IncomingLocationService.this, locationView); // register call state listener manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); listener = new PhoneStateListener(){ @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_IDLE: // hide location floatToast.close(); break; case TelephonyManager.CALL_STATE_OFFHOOK: { if(outgoing) {// if the CALL_STATE_OFFHOOK is outgoing call, don't hide it until CALL_STATE_IDLE outgoing = false; break; } // hide location floatToast.close(); break; } case TelephonyManager.CALL_STATE_RINGING: { showLocation(incomingNumber); break; } } } }; manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); // register new outgoing call receiver outgoingCallReceiver = new OutgoingCallReceiver(); IntentFilter filter = new IntentFilter("android.intent.action.NEW_OUTGOING_CALL"); registerReceiver(outgoingCallReceiver, filter); } /** * get location and show it * @param number */ private void showLocation(String number) { // get location String location = phoneLocationEngine.getLocation(this, number); // if can't get the location, set unknown if(TextUtils.isEmpty(location)) { location = getString(R.string.unknown); } // set to view tvLocation.setText(location); // show float toast floatToast.show(); } @Override public void onDestroy() { super.onDestroy(); // unregister call listener manager.listen(listener, PhoneStateListener.LISTEN_NONE); // unregister outgoing call unregisterReceiver(outgoingCallReceiver); } /** * when outgoing call, record the state */ class OutgoingCallReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { outgoing = true; String outgoingNumber = getResultData(); showLocation(outgoingNumber); } } }