diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c135f1631..843efd562 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,10 +3,8 @@ package="nodomain.freeyourgadget.gadgetbridge"> - + + + + + + - diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java index 75ad9dc07..a4616ae9d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/BluetoothCommunicationService.java @@ -30,7 +30,9 @@ public class BluetoothCommunicationService extends Service { public static final String ACTION_STOP = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.stop"; public static final String ACTION_SENDMESSAGE - = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.sendbluetoothmessage"; + = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.sendmessage"; + public static final String ACTION_INCOMINGCALL + = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.incomingcall"; public static final String ACTION_SETTIME = "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.settime"; @@ -121,6 +123,14 @@ public class BluetoothCommunicationService extends Service { byte[] msg = PebbleProtocol.encodeSMS(title, content); mBtSocketIoThread.write(msg); } + } else if (intent.getAction().equals(ACTION_INCOMINGCALL)) { + String phoneNumber = intent.getStringExtra("incomingcall_phonenumber"); + byte phoneState = intent.getByteExtra("incomingcall_state", (byte) 0); + + if (mBtSocketIoThread != null) { + byte[] msg = PebbleProtocol.encodeIncomingCall(phoneNumber, phoneNumber, phoneState); + mBtSocketIoThread.write(msg); + } } else if (intent.getAction().equals(ACTION_SETTIME)) { if (mBtSocketIoThread != null) { byte[] msg = PebbleProtocol.encodeSetTime(-1); @@ -220,7 +230,7 @@ public class BluetoothCommunicationService extends Service { if (length == 1 && endpoint == PebbleProtocol.ENDPOINT_PHONEVERSION) { Log.i(TAG, "Pebble asked for Phone/App Version - repLYING!"); write(PebbleProtocol.encodePhoneVersion(PebbleProtocol.PHONEVERSION_REMOTE_OS_ANDROID)); - } else { + } else if (endpoint != PebbleProtocol.ENDPOINT_DATALOG) { Log.i(TAG, "unhandled message to endpoint " + endpoint + " (" + bytes + " bytes)"); } try { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/NotificationListener.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/NotificationListener.java index 8d52d671d..82632e62c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/NotificationListener.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/NotificationListener.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.os.Bundle; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; +import android.util.Log; public class NotificationListener extends NotificationListenerService { @@ -28,9 +29,12 @@ public class NotificationListener extends NotificationListenerService { * This includes keyboard selection message, usb connection messages, etc * Hope it does not filter out too much, we will see... */ - if (sbn.getPackageName().equals("android")) + String source = sbn.getPackageName(); + if (source.equals("android") || source.equals("com.android.dialer")) return; + Log.i(TAG, sbn.getPackageName()); + Bundle extras = notification.extras; String title = extras.getString(Notification.EXTRA_TITLE); String content = ""; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java index a5d4f1252..6c616e23c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PebbleProtocol.java @@ -25,6 +25,7 @@ public class PebbleProtocol { static final short ENDPOINT_SYSREG = 5000; static final short ENDPOINT_FCTREG = 5001; static final short ENDPOINT_APPMANAGER = 6000; + static final short ENDPOINT_DATALOG = 6778; static final short ENDPOINT_RUNKEEPER = 7000; static final short ENDPOINT_SCREENSHOT = 8000; static final short ENDPOINT_PUTBYTES = (short) 48879; @@ -130,10 +131,10 @@ public class PebbleProtocol { return buf.array(); } - public static byte[] encodeIncomingCall(String number, String name) { + public static byte[] encodeIncomingCall(String number, String name, byte state) { String cookie = "000"; // That's a dirty trick to make the cookie part 4 bytes long :P String[] parts = {cookie, number, name}; - return encodeMessage(ENDPOINT_PHONECONTROL, PHONECONTROL_INCOMINGCALL, parts); + return encodeMessage(ENDPOINT_PHONECONTROL, state, parts); } public static byte[] encodePhoneVersion(byte os) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PhoneCallReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PhoneCallReceiver.java new file mode 100644 index 000000000..769ae5ae7 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/PhoneCallReceiver.java @@ -0,0 +1,29 @@ +package nodomain.freeyourgadget.gadgetbridge; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.telephony.TelephonyManager; + +public class PhoneCallReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String phoneState = intent.getStringExtra(TelephonyManager.EXTRA_STATE); + byte state = 0; + if (phoneState.equals(TelephonyManager.EXTRA_STATE_RINGING)) { + state = PebbleProtocol.PHONECONTROL_INCOMINGCALL; + } else if (phoneState.equals(TelephonyManager.EXTRA_STATE_IDLE) || phoneState.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { + state = PebbleProtocol.PHONECONTROL_END; + } + + if (state != 0) { + String phoneNumber = intent.hasExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) ? intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) : ""; + Intent startIntent = new Intent(context, BluetoothCommunicationService.class); + startIntent.setAction(BluetoothCommunicationService.ACTION_INCOMINGCALL); + startIntent.putExtra("incomingcall_phonenumber", phoneNumber); + startIntent.putExtra("incomingcall_state", state); + context.startService(startIntent); + } + } +}