Rewritten old package emitters and receivers using the new package format

Splitted up ping receiver from notification receiver in KDE
Improved pausemusic receiver
Fixed same computer being discovered multiple times
Fixed some other minor bugs and compilation warnings
This commit is contained in:
Albert Vaca
2013-07-04 19:17:22 +02:00
parent 79d530e3c4
commit 8347c760f5
13 changed files with 101 additions and 93 deletions

View File

@@ -18,7 +18,6 @@ import org.kde.connect.PackageEmitters.CallPackageEmitter;
import org.kde.connect.PackageEmitters.PingPackageEmitter;
import org.kde.connect.PackageReceivers.BasePackageReceiver;
import org.kde.connect.PackageReceivers.PingPackageReceiver;
import org.kde.connect.Types.NetworkPackage;
import java.util.ArrayList;
@@ -34,21 +33,23 @@ public class BackgroundService extends Service {
PingPackageEmitter pingEmitter;
private void clearComputerLinks() {
Log.i("BackgroundService","clearComputerLinks");
for(BasePackageEmitter pe : emitters) pe.clearComputerLinks();
computerLinks.clear();
}
private void removeComputerLink(BaseComputerLink cl) {
Log.i("BackgroundService","removeComputerLink");
for(BasePackageEmitter pe : emitters) pe.removeComputerLink(cl);
computerLinks.remove(cl);
}
private void addComputerLink(BaseComputerLink cl) {
Log.i("BackgroundService","addComputerLink");
computerLinks.add(cl);
for(BasePackageEmitter pe : emitters) pe.addComputerLink(cl);
for(BasePackageReceiver pr : receivers) cl.addPackageReceiver(pr);
Log.i("BackgroundService","sending ping after connection");
//NetworkPackage p = new NetworkPackage(System.currentTimeMillis());
//p.setType(NetworkPackage.Type.PING);
//cl.sendPackage(p);
}
private void registerEmitters() {
@@ -73,15 +74,19 @@ public class BackgroundService extends Service {
}
}
//This will be called for each intent launch, even if the service is already started and is reused
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("BackgroundService","Starting");
instance=this;
attendCallbacks();
Log.e("BackgroundService","Running callbacks waiting service to be ready");
for (InstanceCallback c : callbacks) {
c.onServiceStart(this);
}
callbacks.clear();
return Service.START_STICKY;
}
public void reachComputers() {
clearComputerLinks();
for (BaseLinkProvider a : locators) {
a.reachComputers(new BaseLinkProvider.ConnectionReceiver() {
@Override
@@ -98,11 +103,12 @@ public class BackgroundService extends Service {
pingEmitter.sendPing();
}
//This will called only once, even if we launch the service intent several times
@Override
public void onCreate() {
super.onCreate();
Log.e("BackgroundService","Creating");
Log.e("BackgroundService","Service not started yet, initializing...");
settings = getSharedPreferences("KdeConnect", 0);
@@ -112,77 +118,39 @@ public class BackgroundService extends Service {
registerReceivers();
registerAnnouncers();
instance = this;
attendCallbacks();
}
@Override
public void onDestroy() {
Log.e("BackgroundService","Destroying");
Log.e("BackgroundService", "Destroying");
super.onDestroy();
instance = null;
}
@Override
public IBinder onBind (Intent intent) {
return new Binder();
}
//All kind of black magic to make the service a singleton
//To use the service from the gui
public interface InstanceCallback {
void onServiceStart(BackgroundService service);
}
private static BackgroundService instance = null;
private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>();
private static void attendCallbacks() {
for (InstanceCallback c : callbacks) {
c.onServiceStart(instance);
}
callbacks.clear();
}
/*
public static void Start(Context c) {
RunCommand(c, null);
}
*/
public static void RunCommand(Context c, final InstanceCallback callback) {
if (callback != null) callbacks.add(callback);
if (instance == null) {
Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent);
try {
c.bindService(serviceIntent, new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
instance = null;
}
public void onServiceConnected(ComponentName name, IBinder binder) {
instance = ((LocalBinder) binder).getInstance();
attendCallbacks();
}
}, Service.BIND_AUTO_CREATE);
} catch(Exception e) {
}
} else {
attendCallbacks();
}
Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent);
}
private class LocalBinder extends Binder {
public BackgroundService getInstance() {
return BackgroundService.this;
}
}
private IBinder mBinder = new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}

View File

@@ -1,7 +1,7 @@
package org.kde.connect.ComputerLinks;
import org.kde.connect.PackageReceivers.BasePackageReceiver;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
import java.util.ArrayList;

View File

@@ -3,9 +3,8 @@ package org.kde.connect.ComputerLinks;
import android.os.AsyncTask;
import android.util.Log;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

View File

@@ -3,11 +3,10 @@ package org.kde.connect.LinkProviders;
import android.content.Context;
import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo;
import android.os.Build;
import android.util.Log;
import org.kde.connect.ComputerLinks.UdpComputerLink;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
import java.lang.Override;
import java.util.ArrayList;
@@ -30,6 +29,8 @@ public class AvahiLinkProvider implements BaseLinkProvider {
@Override
public void reachComputers(final ConnectionReceiver cr) {
visibleComputers.clear();
Log.e("AvahiLinkProvider", "Discovering computers...");
final NsdManager.ResolveListener mResolveListener = new NsdManager.ResolveListener() {

View File

@@ -1,4 +1,4 @@
package org.kde.connect.Types;
package org.kde.connect;
import android.content.Context;
import android.os.Build;
@@ -8,13 +8,15 @@ import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Calendar;
import java.util.TimeZone;
public class NetworkPackage {
private final static int CURRENT_PACKAGE_VERSION = 1;
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_CALL = "kdeconnect.call";
private long mId;
private String mType;
private JSONObject mBody;
@@ -82,7 +84,7 @@ public class NetworkPackage {
static public NetworkPackage createIdentityPackage(Context context) {
NetworkPackage np = new NetworkPackage("kdeconnect.identity");
NetworkPackage np = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_IDENTITY);
final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try {

View File

@@ -1,7 +1,7 @@
package org.kde.connect.PackageEmitters;
import org.kde.connect.ComputerLinks.BaseComputerLink;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
import java.util.ArrayList;
@@ -12,6 +12,12 @@ public class BasePackageEmitter {
public void addComputerLink(BaseComputerLink cl) {
mBaseComputerLinks.add(cl);
}
public void removeComputerLink(BaseComputerLink cl) {
mBaseComputerLinks.remove(cl);
}
public void clearComputerLinks() {
mBaseComputerLinks.clear();
}
protected int countLinkedComputers() {
return mBaseComputerLinks.size();

View File

@@ -5,7 +5,7 @@ import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
public class CallPackageEmitter extends BasePackageEmitter {
@@ -17,7 +17,7 @@ public class CallPackageEmitter extends BasePackageEmitter {
PhoneStateListener callStateListener = new PhoneStateListener() {
int lastState = TelephonyManager.CALL_STATE_IDLE;
NetworkPackage lastPackage;
NetworkPackage lastPackage = null;
@Override
public void onCallStateChanged(int state, String phoneNumber) {
@@ -26,12 +26,12 @@ public class CallPackageEmitter extends BasePackageEmitter {
case TelephonyManager.CALL_STATE_RINGING:
Log.e("IncomingCall", ":"+phoneNumber);
Log.e("IncomingCall", ":" + phoneNumber);
lastPackage = new NetworkPackage("kdeconnect.notification");
lastPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_NOTIFICATION);
lastPackage.set("notificationType","ringing");
lastPackage.set("phoneNumber",phoneNumber);
lastPackage.set("notificationType", "ringing");
lastPackage.set("phoneNumber", phoneNumber);
sendPackage(lastPackage);
@@ -41,14 +41,17 @@ public class CallPackageEmitter extends BasePackageEmitter {
Log.e("OngoingCall", ":"+phoneNumber);
/*
//Actually we do not want to cancel it
if (lastState == TelephonyManager.CALL_STATE_RINGING && lastPackage != null) {
//Cancel previous ringing notification
lastPackage.set("isCancel","true");
sendPackage(lastPackage);
}
*/
//Emit a "call" package
lastPackage = new NetworkPackage("kdeconnect.call");
lastPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CALL);
lastPackage.set("phoneNumber",phoneNumber);
sendPackage(lastPackage);
@@ -56,19 +59,19 @@ public class CallPackageEmitter extends BasePackageEmitter {
case TelephonyManager.CALL_STATE_IDLE:
Log.e("EndedCall", ":"+phoneNumber);
if (lastState != TelephonyManager.CALL_STATE_IDLE && lastPackage != null) {
Log.e("EndedCall", ":"+phoneNumber);
//End last notification (can either be a ring notification or a call event)
lastPackage.set("isCancel","true");
sendPackage(lastPackage);
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
//Emit a missed call notification
NetworkPackage missed = new NetworkPackage("kdeconnect.notification");
NetworkPackage missed = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_NOTIFICATION);
missed.set("notificationType","missedCall");
missed.set("phoneNumber",lastPackage.getString("phoneNumber"));
missed.set("phoneNumber", lastPackage.getString("phoneNumber"));
sendPackage(missed);
}

View File

@@ -0,0 +1,19 @@
package org.kde.connect.PackageEmitters;
import android.content.Context;
public class CliboardPackageEmitter extends BasePackageEmitter {
CliboardPackageEmitter(Context ctx) {
//ClipboardManager.addPrimaryClipChangedListener( {
//NetworkPackage lastPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_CLIPBOARD);
//sendPackage(lastPackage);
//})
}
}

View File

@@ -3,7 +3,7 @@ package org.kde.connect.PackageEmitters;
import android.content.Context;
import android.util.Log;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
public class PingPackageEmitter extends BasePackageEmitter {
@@ -14,7 +14,7 @@ public class PingPackageEmitter extends BasePackageEmitter {
public void sendPing() {
Log.e("PingPackageEmitter", "sendPing to "+countLinkedComputers());
NetworkPackage lastPackage = new NetworkPackage("kdeconnect.ping");
NetworkPackage lastPackage = new NetworkPackage(NetworkPackage.PACKAGE_TYPE_PING);
sendPackage(lastPackage);
}

View File

@@ -1,6 +1,6 @@
package org.kde.connect.PackageReceivers;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
public interface BasePackageReceiver {

View File

@@ -3,7 +3,7 @@ package org.kde.connect.PackageReceivers;
import android.content.Context;
import android.widget.Toast;
import org.kde.connect.Types.NetworkPackage;
import org.kde.connect.NetworkPackage;
public class PingPackageReceiver implements BasePackageReceiver {

View File

@@ -23,10 +23,20 @@ public class ServiceLauncher extends BroadcastReceiver
Log.e("KdeConnect", "Ignoring, it's not me!");
return;
}
BackgroundService.Start(context);
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
service.reachComputers();
}
});
} else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.e("KdeConnect", "ServiceLauncher");
BackgroundService.Start(context);
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {
@Override
public void onServiceStart(BackgroundService service) {
service.reachComputers();
}
});
} else if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
Log.e("KdeConnect", "Connection state changed, trying to connect");
BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() {

View File

@@ -9,7 +9,7 @@
tools:context=".MainActivity"
android:orientation="vertical">
<Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Announce to network"/>
<Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Restart service"/>
<Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send ping"/>
</LinearLayout>