diff --git a/F-Droid/AndroidManifest.xml b/F-Droid/AndroidManifest.xml
index 539870340..e0124ff81 100644
--- a/F-Droid/AndroidManifest.xml
+++ b/F-Droid/AndroidManifest.xml
@@ -44,6 +44,7 @@
+
diff --git a/F-Droid/res/layout/select_local_apps_list_item.xml b/F-Droid/res/layout/select_local_apps_list_item.xml
index 653cf4d91..b7f0fdda2 100644
--- a/F-Droid/res/layout/select_local_apps_list_item.xml
+++ b/F-Droid/res/layout/select_local_apps_list_item.xml
@@ -16,7 +16,6 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="?android:attr/activatedBackgroundIndicator"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingBottom="2dip"
android:paddingTop="2dip">
diff --git a/F-Droid/res/layout/swap_blank.xml b/F-Droid/res/layout/swap_blank.xml
index 9f6ee9df9..f582e90e6 100644
--- a/F-Droid/res/layout/swap_blank.xml
+++ b/F-Droid/res/layout/swap_blank.xml
@@ -181,26 +181,11 @@
+ android:layout_height="wrap_content" />
-
-
+ android:layout_width="match_parent"/>
\ No newline at end of file
diff --git a/F-Droid/res/values/strings.xml b/F-Droid/res/values/strings.xml
index 8231a9e7a..371d9ed2a 100644
--- a/F-Droid/res/values/strings.xml
+++ b/F-Droid/res/values/strings.xml
@@ -321,6 +321,10 @@
Don\'t show this again
Tap an app for details and to install.
One person needs to scan the code, or type the URL of the other in a browser.
+ Choose Apps
+ Scan QR Code
+ People Nearby
+
Public
Private
@@ -328,8 +332,6 @@
May work
Promising
Best bet
- Choose Apps
- Scan QR Code
Nearby Swap
Connect and trade apps with people near you.
Visible via Bluetooth
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/SwapManager.java b/F-Droid/src/org/fdroid/fdroid/localrepo/SwapManager.java
index 0c2479cf3..407ca941e 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/SwapManager.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/SwapManager.java
@@ -18,9 +18,9 @@ import org.fdroid.fdroid.localrepo.peers.PeerFinder;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
public class SwapManager {
@@ -49,7 +49,7 @@ public class SwapManager {
private Set appsToSwap;
@NonNull
- private Collection peers;
+ private List peers;
private SwapManager(@NonNull Context context, @NonNull Set appsToSwap) {
this.context = context.getApplicationContext();
@@ -73,6 +73,12 @@ public class SwapManager {
// Search for peers to swap
// ==========================================================
+ private PeerFinder.Listener peerListener;
+
+ public void setPeerListener(PeerFinder.Listener listener) {
+ this.peerListener = listener;
+ }
+
public void scanForPeers() {
if (service != null) {
Log.d(TAG, "Scanning for nearby devices to swap with...");
@@ -91,7 +97,17 @@ public class SwapManager {
}
public void onPeerFound(Peer peer) {
- peers.add(peer);
+ if (!peers.contains(peer)) {
+ peers.add(peer);
+ if (peerListener != null) {
+ peerListener.onPeerFound(peer);
+ }
+ }
+ }
+
+ @NonNull
+ public List getPeers() {
+ return peers;
}
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java
index 663a9363c..8c7ae19cf 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothFinder.java
@@ -1,21 +1,70 @@
package org.fdroid.fdroid.localrepo.peers;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
// TODO: Still to be implemented
public class BluetoothFinder extends PeerFinder {
private static final String TAG = "BluetoothFinder";
+ private final Context context;
+ private final BluetoothAdapter adapter;
+
public BluetoothFinder(Context context) {
+ this.context = context;
+ adapter = BluetoothAdapter.getDefaultAdapter();
}
@Override
public void scan() {
+
+ if (adapter == null) {
+ Log.i(TAG, "Not scanning for bluetooth peers to swap with, couldn't find a bluetooth adapter on this device.");
+ return;
+ }
+
+ final BroadcastReceiver deviceFoundReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
+ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ onDeviceFound(device);
+ }
+ }
+ };
+
+ final BroadcastReceiver scanCompleteReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "Scan complete: " + intent.getAction());
+ }
+ };
+
+ context.registerReceiver(deviceFoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND));
+ context.registerReceiver(scanCompleteReceiver, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
+
+ if (!adapter.startDiscovery()) {
+ Log.e(TAG, "Couldn't start bluetooth scanning.");
+ }
+
}
@Override
public void cancel() {
+ if (adapter != null) {
+ Log.d(TAG, "Stopping bluetooth discovery.");
+ adapter.cancelDiscovery();
+ }
+ }
+
+ private void onDeviceFound(BluetoothDevice device) {
+ foundPeer(new BluetoothPeer(device));
}
}
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothPeer.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothPeer.java
index 90dfd801a..ee263c209 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothPeer.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BluetoothPeer.java
@@ -21,4 +21,9 @@ public class BluetoothPeer implements Peer {
return android.R.drawable.stat_sys_data_bluetooth;
}
+ @Override
+ public boolean equals(Peer peer) {
+ return peer != null && peer instanceof BluetoothPeer && ((BluetoothPeer)peer).device.getAddress() == device.getAddress();
+ }
+
}
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourFinder.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourFinder.java
index a964ddc1f..ff73a397b 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourFinder.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourFinder.java
@@ -62,7 +62,7 @@ public class BonjourFinder extends PeerFinder implements ServiceLis
@Override
protected void onPostExecute(Void result) {
- Log.d(TAG, "Cleaning up mDNS service listeners.");
+ Log.d(TAG, "Adding mDNS service listeners.");
if (mJmdns != null) {
mJmdns.addServiceListener(HTTP_SERVICE_TYPE, BonjourFinder.this);
mJmdns.addServiceListener(HTTPS_SERVICE_TYPE, BonjourFinder.this);
@@ -78,6 +78,14 @@ public class BonjourFinder extends PeerFinder implements ServiceLis
@Override
public void serviceAdded(final ServiceEvent event) {
+ // TODO: Get clarification, but it looks like this is:
+ // 1) Identifying that there is _a_ bonjour service available
+ // 2) Adding it to the list to give some sort of feedback to the user
+ // 3) Requesting more detailed info in an async manner
+ // 4) If that is in fact an fdroid repo (after requesting info), then add it again
+ // so that more detailed info can be shown to the user.
+ //
+ // If so, when is the old one removed?
addFDroidService(event);
new AsyncTask() {
@Override
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourPeer.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourPeer.java
index 5c1f50472..03aed6e93 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourPeer.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/BonjourPeer.java
@@ -22,4 +22,14 @@ public class BonjourPeer implements Peer {
return R.drawable.wifi;
}
+ @Override
+ public boolean equals(Peer peer) {
+ if (peer != null && peer instanceof BonjourPeer) {
+ BonjourPeer that = (BonjourPeer)peer;
+ // TODO: Don't us "name" for comparing, but rather fingerprint of the swap repo.
+ return that.serviceInfo.getName().equals(this.serviceInfo.getName());
+ }
+ return false;
+ }
+
}
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/Peer.java b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/Peer.java
index 9969888cf..cd7e74db4 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/peers/Peer.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/peers/Peer.java
@@ -8,4 +8,6 @@ public interface Peer {
@DrawableRes int getIcon();
+ boolean equals(Peer peer);
+
}
diff --git a/F-Droid/src/org/fdroid/fdroid/localrepo/type/BonjourType.java b/F-Droid/src/org/fdroid/fdroid/localrepo/type/BonjourType.java
index 0d4a2aee7..d047b8aaa 100644
--- a/F-Droid/src/org/fdroid/fdroid/localrepo/type/BonjourType.java
+++ b/F-Droid/src/org/fdroid/fdroid/localrepo/type/BonjourType.java
@@ -28,7 +28,7 @@ public class BonjourType implements SwapType {
@Override
public void start() {
- if (Preferences.get().isLocalRepoBonjourEnabled())
+ if (!Preferences.get().isLocalRepoBonjourEnabled())
return;
/*
diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java
index 1da5116ca..9da360cca 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SelectAppsView.java
@@ -72,17 +72,6 @@ public class SelectAppsView extends ListView implements
private AppListAdapter adapter;
private String mCurrentFilterString;
- private final Presenter presenter = new Presenter();
-
- public static class Presenter {
-
- private SelectAppsView view;
-
- public void setView(@NonNull SelectAppsView view) {
- this.view = view;
- }
-
- }
@Override
protected void onFinishInflate() {
@@ -101,8 +90,6 @@ public class SelectAppsView extends ListView implements
toggleAppSelected(position);
}
});
-
- presenter.setView(this);
}
@Override
diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java
index e14ec3622..30b285885 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/swap/StartSwapView.java
@@ -1,26 +1,21 @@
package org.fdroid.fdroid.views.swap;
import android.annotation.TargetApi;
-import android.bluetooth.BluetoothAdapter;
import android.content.Context;
-import android.content.Intent;
import android.os.Build;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
import android.util.AttributeSet;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
-import android.widget.CompoundButton;
import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.Switch;
-import android.widget.TextView;
import org.fdroid.fdroid.R;
-import org.fdroid.fdroid.compat.SwitchCompat;
import org.fdroid.fdroid.localrepo.SwapManager;
+import org.fdroid.fdroid.localrepo.peers.Peer;
+import org.fdroid.fdroid.localrepo.peers.PeerFinder;
public class StartSwapView extends LinearLayout implements SwapWorkflowActivity.InnerView {
@@ -48,6 +43,27 @@ public class StartSwapView extends LinearLayout implements SwapWorkflowActivity.
super(context, attrs, defStyleAttr, defStyleRes);
}
+ private class PeopleNearbyAdapter extends ArrayAdapter {
+
+ public PeopleNearbyAdapter(Context context) {
+ super(context, 0, SwapManager.load(context).getPeers());
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = LayoutInflater.from(getContext()).inflate(android.R.layout.two_line_list_item, parent, false);
+ }
+
+ Peer peer = getItem(position);
+ ((TextView)convertView.findViewById(android.R.id.text1)).setText(peer.getName());
+
+ return convertView;
+ }
+
+
+ }
+
private SwapWorkflowActivity getActivity() {
// TODO: Try and find a better way to get to the SwapActivity, which makes less asumptions.
return (SwapWorkflowActivity)getContext();
@@ -104,6 +120,18 @@ public class StartSwapView extends LinearLayout implements SwapWorkflowActivity.
}
});
+ final PeopleNearbyAdapter adapter = new PeopleNearbyAdapter(getContext());
+
+ peopleNearbyList = (ListView)findViewById(R.id.people_nearby);
+ peopleNearbyList.setAdapter(adapter);
+
+ SwapManager.load(getActivity()).setPeerListener(new PeerFinder.Listener() {
+ @Override
+ public void onPeerFound(Peer peer) {
+ adapter.notifyDataSetChanged();
+ }
+ });
+
}
diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
index 831e5ffa4..e06fceb3b 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapWorkflowActivity.java
@@ -49,7 +49,7 @@ public class SwapWorkflowActivity extends ActionBarActivity {
/** @return True if the menu should be shown. */
boolean buildMenu(Menu menu, @NonNull MenuInflater inflater);
- /** @return The step that this view represents. */
+ /** @return The steap that this view represents. */
@SwapManager.SwapStep int getStep();
@SwapManager.SwapStep int getPreviousStep();