2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-22 09:58:08 +00:00

Added sms notifications

Added contact name lookup for sms and call notifications
This commit is contained in:
Albert Vaca 2013-08-01 02:30:58 +02:00
parent b9c013630b
commit 603cc62ef0
12 changed files with 197 additions and 35 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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) {

View 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;
}
}

View File

@ -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;

View File

@ -1,5 +1,6 @@
package org.kde.connect.PackageInterfaces;
import android.content.BroadcastReceiver;
import android.content.Context;
import org.kde.connect.Device;

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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());
}
}

View File

@ -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"

View File

@ -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>

View File

@ -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>