mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-22 01:51:47 +00:00
Added sms notifications
Added contact name lookup for sms and call notifications
This commit is contained in:
parent
b9c013630b
commit
603cc62ef0
@ -6,6 +6,7 @@
|
||||
<option name="SELECTED_BUILD_VARIANT" value="Debug" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleTest" />
|
||||
<option name="SOURCE_GEN_TASK_NAME" value="TODO" />
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
@ -67,9 +68,9 @@
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android 4.2.2" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" name="android-support-v4" level="project" />
|
||||
<orderEntry type="library" name="mina-core-2.0.7" level="project" />
|
||||
<orderEntry type="library" name="slf4j-api-1.6.6" level="project" />
|
||||
<orderEntry type="library" exported="" name="android-support-v4" level="project" />
|
||||
<orderEntry type="library" exported="" name="mina-core-2.0.7" level="project" />
|
||||
<orderEntry type="library" exported="" name="slf4j-api-1.6.6" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
@ -54,9 +54,11 @@
|
||||
<intent-filter>
|
||||
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
|
||||
</application>
|
||||
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
@ -65,6 +67,7 @@
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<uses-permission android:name="android.permission.BATTERY_STATS" />
|
||||
|
||||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS" />
|
||||
|
||||
</manifest>
|
||||
|
@ -14,11 +14,11 @@ import org.kde.connect.LinkProviders.AvahiTcpLinkProvider;
|
||||
import org.kde.connect.LinkProviders.BaseLinkProvider;
|
||||
import org.kde.connect.PackageInterfaces.BasePackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.BatteryMonitorPackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.CallPackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.CallNotificationPackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.ClipboardPackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.MprisControlPackageInterface;
|
||||
import org.kde.connect.PackageInterfaces.PingPackageInterface;
|
||||
import org.kde.kdeconnect.R;
|
||||
import org.kde.connect.PackageInterfaces.SmsNotificationPackageInterface;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -47,21 +47,15 @@ public class BackgroundService extends Service {
|
||||
Log.e("registerPackageInterfacesFromSettings","registerPackageInterfacesFromSettings");
|
||||
|
||||
if (settings.getBoolean("call_interface", true)) {
|
||||
addPackageInterface(CallPackageInterface.class);
|
||||
addPackageInterface(CallNotificationPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(CallPackageInterface.class);
|
||||
removePackageInterface(CallNotificationPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("ping_interface", true)) {
|
||||
addPackageInterface(PingPackageInterface.class);
|
||||
if (settings.getBoolean("sms_interface", true)) {
|
||||
addPackageInterface(SmsNotificationPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(PingPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("clipboard_interface", true)) {
|
||||
addPackageInterface(ClipboardPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(ClipboardPackageInterface.class);
|
||||
removePackageInterface(SmsNotificationPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("battery_interface", true)) {
|
||||
@ -70,12 +64,24 @@ public class BackgroundService extends Service {
|
||||
removePackageInterface(BatteryMonitorPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("clipboard_interface", true)) {
|
||||
addPackageInterface(ClipboardPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(ClipboardPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("mpris_interface", true)) {
|
||||
addPackageInterface(MprisControlPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(MprisControlPackageInterface.class);
|
||||
}
|
||||
|
||||
if (settings.getBoolean("ping_interface", true)) {
|
||||
addPackageInterface(PingPackageInterface.class);
|
||||
} else {
|
||||
removePackageInterface(PingPackageInterface.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public BasePackageInterface getPackageInterface(Class c) {
|
||||
|
45
KdeConnect/src/main/java/org/kde/connect/ContactsHelper.java
Normal file
45
KdeConnect/src/main/java/org/kde/connect/ContactsHelper.java
Normal file
@ -0,0 +1,45 @@
|
||||
package org.kde.connect;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.provider.ContactsContract;
|
||||
import android.provider.ContactsContract.PhoneLookup;
|
||||
import android.util.Log;
|
||||
|
||||
public class ContactsHelper {
|
||||
|
||||
public static String phoneNumberLookup(Context context, String number) {
|
||||
|
||||
Log.e("PhoneNumberLookup", number);
|
||||
|
||||
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
|
||||
Cursor cursor = null;
|
||||
try {
|
||||
cursor = context.getContentResolver().query(
|
||||
uri,
|
||||
new String[] {
|
||||
PhoneLookup.DISPLAY_NAME
|
||||
/*, PhoneLookup.TYPE
|
||||
, PhoneLookup.LABEL
|
||||
, PhoneLookup.ID */
|
||||
},
|
||||
null, null, null);
|
||||
} catch (IllegalArgumentException e) {
|
||||
return number;
|
||||
}
|
||||
|
||||
// Take the first match only
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
int nameIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
|
||||
if (nameIndex != -1) {
|
||||
String name = cursor.getString(nameIndex);
|
||||
Log.e("PhoneNumberLookup", "success: " + name);
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
return number;
|
||||
|
||||
}
|
||||
}
|
@ -17,10 +17,14 @@ public class NetworkPackage {
|
||||
|
||||
public final static String PACKAGE_TYPE_IDENTITY = "kdeconnect.identity";
|
||||
public final static String PACKAGE_TYPE_PING = "kdeconnect.ping";
|
||||
public final static String PACKAGE_TYPE_NOTIFICATION = "kdeconnect.notification";
|
||||
public final static String PACKAGE_TYPE_BATTERY = "kdeconnect.battery";
|
||||
|
||||
public final static String PACKAGE_TYPE_CALL = "kdeconnect.call";
|
||||
//public final static String PACKAGE_TYPE_SMS = "kdeconnect.sms";
|
||||
public final static String PACKAGE_TYPE_BATTERY = "kdeconnect.battery";
|
||||
public final static String PACKAGE_TYPE_NOTIFICATION = "kdeconnect.notification";
|
||||
|
||||
public final static String PACKAGE_TYPE_CLIPBOARD = "kdeconnect.clipboard";
|
||||
|
||||
public final static String PACKAGE_TYPE_MPRIS = "kdeconnect.mpris";
|
||||
|
||||
private long mId;
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.kde.connect.PackageInterfaces;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
|
||||
import org.kde.connect.Device;
|
||||
|
@ -5,11 +5,12 @@ import android.telephony.PhoneStateListener;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.connect.ContactsHelper;
|
||||
import org.kde.connect.Device;
|
||||
import org.kde.connect.NetworkPackage;
|
||||
|
||||
|
||||
public class CallPackageInterface extends BasePackageInterface {
|
||||
public class CallNotificationPackageInterface extends BasePackageInterface {
|
||||
|
||||
private Context context;
|
||||
|
||||
@ -31,6 +32,7 @@ public class CallPackageInterface extends BasePackageInterface {
|
||||
|
||||
lastPackage.set("notificationType", "ringing");
|
||||
if (phoneNumber != null && !phoneNumber.isEmpty()) {
|
||||
phoneNumber = ContactsHelper.phoneNumberLookup(context,phoneNumber);
|
||||
lastPackage.set("phoneNumber", phoneNumber);
|
||||
}
|
||||
|
||||
@ -54,7 +56,8 @@ public class CallPackageInterface extends BasePackageInterface {
|
||||
//Emit a "call" package
|
||||
lastPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CALL);
|
||||
if (phoneNumber != null && !phoneNumber.isEmpty()) {
|
||||
lastPackage.set("phoneNumber",phoneNumber);
|
||||
phoneNumber = ContactsHelper.phoneNumberLookup(context,phoneNumber);
|
||||
lastPackage.set("phoneNumber", phoneNumber);
|
||||
}
|
||||
sendPackage(lastPackage);
|
||||
|
@ -0,0 +1,63 @@
|
||||
package org.kde.connect.PackageInterfaces;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.telephony.SmsMessage;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.connect.ContactsHelper;
|
||||
import org.kde.connect.Device;
|
||||
import org.kde.connect.NetworkPackage;
|
||||
import org.kde.kdeconnect.R;
|
||||
|
||||
public class SmsNotificationPackageInterface extends BasePackageInterface {
|
||||
|
||||
private Context context;
|
||||
|
||||
public void smsBroadcastReceived(SmsMessage message) {
|
||||
|
||||
Log.e("SmsBroadcastReceived", message.toString());
|
||||
|
||||
if (this.context == null) return;
|
||||
|
||||
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_NOTIFICATION);
|
||||
|
||||
np.set("notificationType","sms");
|
||||
|
||||
String messageBody = message.getMessageBody();
|
||||
if (messageBody != null) {
|
||||
np.set("messageBody",messageBody);
|
||||
}
|
||||
|
||||
String phoneNumber = message.getOriginatingAddress();
|
||||
if (phoneNumber != null) {
|
||||
phoneNumber = ContactsHelper.phoneNumberLookup(context, phoneNumber);
|
||||
np.set("phoneNumber",phoneNumber);
|
||||
};
|
||||
|
||||
sendPackage(np);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreate(Context context) {
|
||||
this.context = context;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
this.context = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPackageReceived(Device d, NetworkPackage np) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDeviceConnected(Device d) {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -7,9 +7,15 @@ import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.telephony.SmsMessage;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
|
||||
import org.kde.connect.PackageInterfaces.SmsNotificationPackageInterface;
|
||||
import org.kde.kdeconnect.R;
|
||||
|
||||
public class ServiceLauncher extends BroadcastReceiver
|
||||
{
|
||||
public void onReceive(Context context, Intent intent)
|
||||
@ -49,8 +55,29 @@ public class ServiceLauncher extends BroadcastReceiver
|
||||
|
||||
}
|
||||
});
|
||||
} else if(action.equals("android.provider.Telephony.SMS_RECEIVED")) {
|
||||
Log.e("ServiceLauncher","Sms receiver");
|
||||
final Bundle bundle = intent.getExtras();
|
||||
if (bundle == null) return;
|
||||
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
|
||||
@Override
|
||||
public void onServiceStart(BackgroundService service) {
|
||||
SmsNotificationPackageInterface smsnotify = (SmsNotificationPackageInterface)service.getPackageInterface(SmsNotificationPackageInterface.class);
|
||||
if (smsnotify == null) return;
|
||||
try {
|
||||
Object[] pdus = (Object[]) bundle.get("pdus");
|
||||
for (int i = 0; i < pdus.length; i++) {
|
||||
SmsMessage message = SmsMessage.createFromPdu((byte[])pdus[i]);
|
||||
smsnotify.smsBroadcastReceived(message);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
Log.e("ServiceLauncher","Sms receiver exception");
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Log.e("KdeConnect", "Ignoring broadcast event: "+intent.getAction());
|
||||
Log.e("ServiceLauncher", "Ignoring broadcast event: "+intent.getAction());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -10,8 +10,8 @@
|
||||
android:orientation="vertical">
|
||||
|
||||
<Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Restart avahi"/>
|
||||
<Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send ping"/>
|
||||
<Button android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Mpris controls"/>
|
||||
<Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send ping to all"/>
|
||||
|
||||
<ListView
|
||||
android:layout_width="fill_parent"
|
||||
|
@ -4,13 +4,16 @@
|
||||
<string name="action_settings" >Settings</string>
|
||||
<string name="pref_enable_call_interface">Call notifications</string>
|
||||
<string name="pref_enable_call_interface_desc">Send incoming and missed call notifications</string>
|
||||
<string name="pref_enable_clipboard_interface">Clipboard sync</string>
|
||||
<string name="pref_enable_clipboard_interface_desc">Share the clipboard content</string>
|
||||
<string name="pref_enable_sms_interface">SMS notifications</string>
|
||||
<string name="pref_enable_sms_interface_desc">Send incoming sms notifications</string>
|
||||
<string name="pref_enable_battery_interface">Battery report</string>
|
||||
<string name="pref_enable_battery_interface_desc">Periodically report battery status</string>
|
||||
<string name="pref_enable_clipboard_interface">Clipboard sync</string>
|
||||
<string name="pref_enable_clipboard_interface_desc">Share the clipboard content</string>
|
||||
<string name="pref_enable_mpris_interface">MPRIS controls</string>
|
||||
<string name="pref_enable_mpris_interface_desc">Control audio/video from your phone</string>
|
||||
<string name="pref_enable_ping_interface">Pings</string>
|
||||
<string name="pref_enable_ping_interface_desc">Enable sending and receiving ping notifications</string>
|
||||
|
||||
|
||||
</resources>
|
||||
|
@ -10,15 +10,9 @@
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="ping_interface"
|
||||
android:title="@string/pref_enable_ping_interface"
|
||||
android:summary="@string/pref_enable_ping_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="clipboard_interface"
|
||||
android:title="@string/pref_enable_clipboard_interface"
|
||||
android:summary="@string/pref_enable_clipboard_interface_desc"
|
||||
android:key="sms_interface"
|
||||
android:title="@string/pref_enable_sms_interface"
|
||||
android:summary="@string/pref_enable_sms_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
@ -27,10 +21,22 @@
|
||||
android:summary="@string/pref_enable_battery_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="clipboard_interface"
|
||||
android:title="@string/pref_enable_clipboard_interface"
|
||||
android:summary="@string/pref_enable_clipboard_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="mpris_interface"
|
||||
android:title="@string/pref_enable_mpris_interface"
|
||||
android:summary="@string/pref_enable_mpris_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="ping_interface"
|
||||
android:title="@string/pref_enable_ping_interface"
|
||||
android:summary="@string/pref_enable_ping_interface_desc"
|
||||
android:defaultValue="true" />
|
||||
|
||||
</PreferenceScreen>
|
Loading…
x
Reference in New Issue
Block a user