mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-08-25 16:50:44 +02:00
Receive SMS the proper way, filter them out in the generic NotificationListener.
This commit is contained in:
parent
070c6db5ed
commit
94c73ef20e
19
README.md
19
README.md
@ -11,13 +11,24 @@ Right now this is in very early testing stages and only supports the Pebble.
|
|||||||
USE IT AT YOUR OWN RISK. It will problably not work. And if it works it will
|
USE IT AT YOUR OWN RISK. It will problably not work. And if it works it will
|
||||||
annoy you more than it helps you ;)
|
annoy you more than it helps you ;)
|
||||||
|
|
||||||
Known Visible Issues:
|
Features:
|
||||||
|
* Notification for incoming calls with caller name and number
|
||||||
|
* SMS notification with sender name
|
||||||
|
* Generic Notificaions (android system and telephony notifications filtered out)
|
||||||
|
|
||||||
* No special notifications, EVERYTHING will be send as a Chat/SMS message
|
Known Issues:
|
||||||
|
|
||||||
|
* Can't reject or hang up phone calls yet
|
||||||
|
* Phone calls that are taken or rejected both count as rejected to make the
|
||||||
|
Pebble stop vibrating. (No in-call display yet)
|
||||||
|
* No outgoing call support (No in-call display yet)
|
||||||
|
* Complex notifications (eg. K-9 Mail) do not work yet, maybe we should implement
|
||||||
|
special K-9 Mail support? Or just support taking complex notificaion apart?
|
||||||
* Notifications are not properly queued, if two arrive at about the same time,
|
* Notifications are not properly queued, if two arrive at about the same time,
|
||||||
one of them will get lost (TODO: confirm)
|
one of them will get lost (TODO: confirm)
|
||||||
* Android 4.4+ only, we can only change this by implementing an
|
* Android 4.4+ only, we can only change this by not handling generic
|
||||||
AccessibiltyService. Don't know if it is worth the hassle.
|
notifications or by using AccessibiltyService. Don't know if it is worth the
|
||||||
|
hassle.
|
||||||
|
|
||||||
Apart from that there are many internal design flaws which we will discuss using
|
Apart from that there are many internal design flaws which we will discuss using
|
||||||
the issue tracker.
|
the issue tracker.
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
@ -38,5 +39,10 @@
|
|||||||
<action android:name="android.intent.action.PHONE_STATE"/>
|
<action android:name="android.intent.action.PHONE_STATE"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
<receiver android:name=".SMSReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -33,8 +33,10 @@ public class BluetoothCommunicationService extends Service {
|
|||||||
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.start";
|
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.start";
|
||||||
public static final String ACTION_STOP
|
public static final String ACTION_STOP
|
||||||
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.stop";
|
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.stop";
|
||||||
public static final String ACTION_SENDMESSAGE
|
public static final String ACTION_NOTIFICATION_GENERIC
|
||||||
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.sendmessage";
|
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.notification_generic";
|
||||||
|
public static final String ACTION_NOTIFICATION_SMS
|
||||||
|
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.notification_sms";
|
||||||
public static final String ACTION_INCOMINGCALL
|
public static final String ACTION_INCOMINGCALL
|
||||||
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.incomingcall";
|
= "nodomain.freeyourgadget.gadgetbride.bluetoothcommunicationservice.action.incomingcall";
|
||||||
public static final String ACTION_SETTIME
|
public static final String ACTION_SETTIME
|
||||||
@ -121,11 +123,20 @@ public class BluetoothCommunicationService extends Service {
|
|||||||
|
|
||||||
stopForeground(true);
|
stopForeground(true);
|
||||||
stopSelf();
|
stopSelf();
|
||||||
} else if (intent.getAction().equals(ACTION_SENDMESSAGE)) {
|
} else if (intent.getAction().equals(ACTION_NOTIFICATION_GENERIC)) {
|
||||||
String title = intent.getStringExtra("notification_title");
|
String title = intent.getStringExtra("notification_title");
|
||||||
String content = intent.getStringExtra("notification_content");
|
String body = intent.getStringExtra("notification_body");
|
||||||
if (mBtSocketIoThread != null) {
|
if (mBtSocketIoThread != null) {
|
||||||
byte[] msg = PebbleProtocol.encodeSMS(title, content);
|
byte[] msg = PebbleProtocol.encodeSMS(title, body);
|
||||||
|
mBtSocketIoThread.write(msg);
|
||||||
|
}
|
||||||
|
} else if (intent.getAction().equals(ACTION_NOTIFICATION_SMS)) {
|
||||||
|
String sender = intent.getStringExtra("notification_sender");
|
||||||
|
String body = intent.getStringExtra("notification_body");
|
||||||
|
String senderName = getContactDisplayNameByNumber(sender);
|
||||||
|
|
||||||
|
if (mBtSocketIoThread != null) {
|
||||||
|
byte[] msg = PebbleProtocol.encodeSMS(senderName, body);
|
||||||
mBtSocketIoThread.write(msg);
|
mBtSocketIoThread.write(msg);
|
||||||
}
|
}
|
||||||
} else if (intent.getAction().equals(ACTION_INCOMINGCALL)) {
|
} else if (intent.getAction().equals(ACTION_INCOMINGCALL)) {
|
||||||
|
@ -48,9 +48,9 @@ public class ControlCenter extends ActionBarActivity {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Intent startIntent = new Intent(ControlCenter.this, BluetoothCommunicationService.class);
|
Intent startIntent = new Intent(ControlCenter.this, BluetoothCommunicationService.class);
|
||||||
startIntent.setAction(BluetoothCommunicationService.ACTION_SENDMESSAGE);
|
startIntent.setAction(BluetoothCommunicationService.ACTION_NOTIFICATION_GENERIC);
|
||||||
startIntent.putExtra("notification_title", editTitle.getText().toString());
|
startIntent.putExtra("notification_title", editTitle.getText().toString());
|
||||||
startIntent.putExtra("notification_content", editContent.getText().toString());
|
startIntent.putExtra("notification_body", editContent.getText().toString());
|
||||||
startService(startIntent);
|
startService(startIntent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -30,10 +30,15 @@ public class NotificationListener extends NotificationListenerService {
|
|||||||
* Hope it does not filter out too much, we will see...
|
* Hope it does not filter out too much, we will see...
|
||||||
*/
|
*/
|
||||||
String source = sbn.getPackageName();
|
String source = sbn.getPackageName();
|
||||||
if (source.equals("android") || source.equals("com.android.dialer"))
|
Log.i(TAG, source);
|
||||||
return;
|
|
||||||
|
|
||||||
Log.i(TAG, sbn.getPackageName());
|
if (source.equals("android") ||
|
||||||
|
source.equals("com.android.dialer") ||
|
||||||
|
source.equals("com.android.mms")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.i(TAG, "Processing notification from source " + source);
|
||||||
|
|
||||||
Bundle extras = notification.extras;
|
Bundle extras = notification.extras;
|
||||||
String title = extras.getString(Notification.EXTRA_TITLE);
|
String title = extras.getString(Notification.EXTRA_TITLE);
|
||||||
@ -41,12 +46,11 @@ public class NotificationListener extends NotificationListenerService {
|
|||||||
if (extras.containsKey(Notification.EXTRA_TEXT))
|
if (extras.containsKey(Notification.EXTRA_TEXT))
|
||||||
content = extras.getString(Notification.EXTRA_TEXT);
|
content = extras.getString(Notification.EXTRA_TEXT);
|
||||||
|
|
||||||
|
|
||||||
if (content != null) {
|
if (content != null) {
|
||||||
Intent startIntent = new Intent(NotificationListener.this, BluetoothCommunicationService.class);
|
Intent startIntent = new Intent(NotificationListener.this, BluetoothCommunicationService.class);
|
||||||
startIntent.setAction(BluetoothCommunicationService.ACTION_SENDMESSAGE);
|
startIntent.setAction(BluetoothCommunicationService.ACTION_NOTIFICATION_GENERIC);
|
||||||
startIntent.putExtra("notification_title", title);
|
startIntent.putExtra("notification_title", title);
|
||||||
startIntent.putExtra("notification_content", content);
|
startIntent.putExtra("notification_body", content);
|
||||||
startService(startIntent);
|
startService(startIntent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.telephony.SmsMessage;
|
||||||
|
|
||||||
|
public class SMSReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
Bundle bundle = intent.getExtras();
|
||||||
|
if (bundle != null) {
|
||||||
|
Object[] pdus = (Object[]) bundle.get("pdus");
|
||||||
|
for (int i = 0; i < pdus.length; i++) {
|
||||||
|
byte[] pdu = (byte[]) pdus[i];
|
||||||
|
SmsMessage message = SmsMessage.createFromPdu(pdu);
|
||||||
|
String body = message.getDisplayMessageBody();
|
||||||
|
String sender = message.getOriginatingAddress();
|
||||||
|
if (sender != null && body != null) {
|
||||||
|
Intent startIntent = new Intent(context, BluetoothCommunicationService.class);
|
||||||
|
startIntent.setAction(BluetoothCommunicationService.ACTION_NOTIFICATION_SMS);
|
||||||
|
startIntent.putExtra("notification_sender", sender);
|
||||||
|
startIntent.putExtra("notification_body", body);
|
||||||
|
context.startService(startIntent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user