Browse Source

changed device list layout;
more usefull logs in the broadcast receiver;
fixes in the broadcast receiver;
correct cancelling p2p connection;
feedback with toast now on the ui thread;
wifi server task will now break after one successfull transaction / sync;
wifi client tasks waits for the server socket until the socket is open or the users cancels the background task;

Julien Clauter 9 years ago
parent
commit
4a97bebf1c

+ 18 - 11
res/layout/activity_p2_psync.xml

@@ -90,16 +90,13 @@
             android:layout_marginTop="6dp" />
     </RelativeLayout>
 
-    <ViewAnimator
+
+
+    <RelativeLayout
+        android:id="@+id/list_container"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:id="@+id/viewAnimator"
-        android:layout_below="@+id/device_info_panel"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentRight="true"
-        android:layout_alignParentEnd="true"
-        android:layout_alignParentLeft="true"
-        android:layout_alignParentStart="true">
+        android:layout_below="@+id/device_info_panel">
 
         <RelativeLayout
             android:layout_width="fill_parent"
@@ -124,9 +121,7 @@
         <RelativeLayout
             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
-            android:layout_alignParentBottom="true"
-            android:layout_alignParentRight="true"
-            android:layout_alignParentEnd="true"
+
             android:id="@+id/devicesContainer">
 
             <TextView
@@ -159,6 +154,18 @@
 
         </RelativeLayout>
 
+    </RelativeLayout>
+
+    <ViewAnimator
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/viewAnimator"
+        android:layout_below="@+id/device_info_panel"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentStart="true">
     </ViewAnimator>
 
 </RelativeLayout>

+ 80 - 22
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/WiFiP2pBroadcastReceiver.java

@@ -40,6 +40,8 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
 
     static boolean setIsWifiP2pEnabled;
 
+    static boolean isConnected = false;
+
     private WiFiP2pBroadcastListener eventListener;
 
     /**
@@ -76,12 +78,10 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
             }
             this.eventListener.wifiP2pIsEnabled(setIsWifiP2pEnabled);
 
-            Log.d("WiFiP2pBroadcastReceiver", "P2P state changed - " + state);
-
         } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
             // THE DEVICE LIST CHANGED
             // REQUEST THE LIST OF DEVICES
-            Log.d("WiFiP2pBroadcastReceiver", "P2P peers changed");
+            Log.d("WiFiP2pBroadcastReceiver", "P2P peers changed.");
             if (manager != null) {
                 manager.requestPeers(channel, this);
             }
@@ -94,16 +94,21 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
             NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
 
             if (networkInfo.isConnected()) {
-
+                isConnected = true;
                 // we are connected with the other device, request connection
                 // info to find group owner IP
                 manager.requestConnectionInfo(channel, this);
             } else {
+                if (networkInfo.getDetailedState() == android.net.NetworkInfo.DetailedState.DISCONNECTED){
+                    isConnected = false;
+                }
                 if (this.networkState != null && !this.networkState.equals(networkInfo.getDetailedState()) && networkInfo.getDetailedState() == android.net.NetworkInfo.DetailedState.DISCONNECTED){
                     // It's a disconnect
                     this.eventListener.didDisconnect();
                 }
-
+            }
+            if (this.networkState != networkInfo.getDetailedState()){
+                Log.d("WiFiP2pBroadcastReceiver", "P2P device network state changed to " + this.getDeviceNetworkStatus(networkInfo.getDetailedState()) + ".");
             }
             this.networkState = networkInfo.getDetailedState();
         } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
@@ -164,6 +169,7 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
             private WiFiP2pBroadcastListener eventListener;
             @Override
             public void onSuccess() {
+                isConnected = true;
                 // WiFiDirectBroadcastReceiver will notify us. Ignore for now.
             }
 
@@ -180,26 +186,27 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
     }
 
     public void disconnect() {
+        if (isConnected){
+            manager.removeGroup(channel, new WifiP2pManager.ActionListener() {
+                private WiFiP2pBroadcastListener eventListener;
 
-        manager.removeGroup(channel, new WifiP2pManager.ActionListener() {
-            private WiFiP2pBroadcastListener eventListener;
-
-            @Override
-            public void onFailure(int reasonCode) {
-                //Log.d(TAG, "Disconnect failed. Reason :" + reasonCode);
-                this.eventListener.failedToDisconnect();
-            }
+                @Override
+                public void onFailure(int reasonCode) {
+                    this.eventListener.failedToDisconnect();
+                }
 
-            @Override
-            public void onSuccess() {
-                this.eventListener.didDisconnect();
-            }
+                @Override
+                public void onSuccess() {
+                    isConnected = false;
+                    this.eventListener.didDisconnect();
+                }
 
-            public WifiP2pManager.ActionListener init(WiFiP2pBroadcastListener eventListener){
-                this.eventListener = eventListener;
-                return this;
-            }
-        }.init(this.eventListener));
+                public WifiP2pManager.ActionListener init(WiFiP2pBroadcastListener eventListener){
+                    this.eventListener = eventListener;
+                    return this;
+                }
+            }.init(this.eventListener));
+        }
     }
 
     public void discoverDevices(){
@@ -214,4 +221,55 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
             }
         });
     }
+
+
+    private String getDeviceNetworkStatus(android.net.NetworkInfo.DetailedState deviceStatus) {
+        switch (deviceStatus) {
+            case DISCONNECTED: {
+                return "Disconnected";
+            }
+            case AUTHENTICATING:
+            {
+                return "Authenticating";
+            }
+            case BLOCKED:
+            {
+                return "Blocked";
+            }
+            case CONNECTED: {
+                return "CONNECTED";
+            }
+            case CONNECTING:
+            {
+                return "Connecting";
+            }
+            case DISCONNECTING:
+            {
+                return "Disconnecting";
+            }
+            case FAILED:
+            {
+                return "Failed";
+            }
+            case IDLE:
+            {
+                return "IDLE";
+            }
+            case OBTAINING_IPADDR:
+            {
+                return "Obtaining IPADDR";
+            }
+            case SCANNING:
+            {
+                return "Scanning";
+            }
+            case SUSPENDED:
+            {
+                return "Suspended";
+            }
+            default: {
+                return "Unknown";
+            }
+        }
+    }
 }

+ 5 - 4
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/WiFiP2pClientTask.java

@@ -57,7 +57,7 @@ public class WiFiP2pClientTask extends BackgroundTask {
 
     @Override
     public boolean performInBackground(){
-        int tryNum = 0;
+        int tryNum = 1;
         while (!this.isInterrupted()){
             this.socket = new Socket();
 
@@ -76,14 +76,13 @@ public class WiFiP2pClientTask extends BackgroundTask {
             } catch (IOException e) {
                 Log.e("WiFiP2pClientTask", e.getMessage());
 
-                if(tryNum >= 5) {
+                if(this.isInterrupted()) {
                     this.interrupt(true);
                     break;
                 }
 
                 long seconds_to_wait = (long) Math.min(60, Math.pow(2, tryNum));
-                Log.i("client", "could not connect to server. Will try again in " + seconds_to_wait + "s");
-
+                Log.i("WiFiP2pClientTask", "could not connect to server. Will try again in " + seconds_to_wait + "s");
                 try {
                     Thread.sleep(seconds_to_wait * 1000);
                 } catch (InterruptedException ie){
@@ -97,6 +96,7 @@ public class WiFiP2pClientTask extends BackgroundTask {
                         } catch (IOException e) {
                             // Give up
                             e.printStackTrace();
+                            Log.d("WiFiP2p_Error"," Failed to close socket - "+ e.getLocalizedMessage());
                             return false;
                         }
                     }
@@ -109,6 +109,7 @@ public class WiFiP2pClientTask extends BackgroundTask {
 
 
     private void handleConnection(Socket client) throws IOException, ClassNotFoundException {
+
         InputStream is = client.getInputStream();
         ObjectInputStream ois = new ObjectInputStream(is);
         OutputStream os = client.getOutputStream();

+ 15 - 3
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/WiFiP2pServerTask.java

@@ -46,10 +46,14 @@ public class WiFiP2pServerTask extends BackgroundTask {
 
                 client.close();
                 serverSocket.close();
+
+                return true;
             } catch (ClassNotFoundException e){
+                e.printStackTrace();
                 Log.e("WiFiP2pServerTask", e.getMessage());
                 return false;
             } catch (IOException  e) {
+                e.printStackTrace();
                 Log.e("WiFiP2pServerTask", e.getMessage());
                 return false;
             }
@@ -60,10 +64,13 @@ public class WiFiP2pServerTask extends BackgroundTask {
 
 
     private void handleConnection(Socket client, ServerSocket server) throws IOException, ClassNotFoundException {
-        InputStream is = client.getInputStream();
-        ObjectInputStream ois = new ObjectInputStream(is);
         OutputStream os = client.getOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(os);
+        oos.flush();
+
+        InputStream is = client.getInputStream();
+        ObjectInputStream ois = new ObjectInputStream(is);
+
 
         Object obj = ois.readObject();
 
@@ -76,7 +83,12 @@ public class WiFiP2pServerTask extends BackgroundTask {
                 oos.flush();
                 oos.reset();
             }
-            obj = ois.readObject();
+            try {
+                obj = ois.readObject();
+            }catch (IOException e){
+                // IF NULL WAS TRANSMITTED
+                obj = null;
+            }
         }
 
         oos.close();

+ 6 - 3
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/sync_tasks/SyncClientTask.java

@@ -31,6 +31,7 @@ public class SyncClientTask extends WiFiP2pClientTask {
     public WiFiP2pSerializableObject handleReceivedObject(WiFiP2pSerializableObject receivedObj) {
 
         if (receivedObj == null) {
+            Log.i("WiFiP2p_Client", "Starting sync process: " + SyncHostTask.SYNC_INFO_REQUEST);
             SyncInfo thisSyncInfo = synchronizer.getSyncInfo();
             WiFiP2pSerializableObject syncObj = new WiFiP2pSerializableObject();
 
@@ -40,11 +41,12 @@ public class SyncClientTask extends WiFiP2pClientTask {
             return syncObj;
 
         } else {
-            Log.i("WiFi Direct Client", "Received: " + receivedObj.getMethodName());
+            Log.i("WiFiP2p_Client", "Received: " + receivedObj.getMethodName());
             if (receivedObj.getMethodName().equals(SyncHostTask.SYNC_INFO_RESPONSE)) {
                 SyncInfo sinfo = (SyncInfo) receivedObj.getObjectToSend();
 
-                if (sinfo != null && sinfo.getClass().isInstance(SyncInfo.class)) {
+                if (sinfo != null && (sinfo instanceof SyncInfo)) {
+                    Log.i("WiFiP2p_Client", "Sending Data: " + SyncHostTask.SYNC_DATA_REQUEST);
                     SyncData syncData = synchronizer.getSyncData(sinfo);
                     WiFiP2pSerializableObject syncObj = new WiFiP2pSerializableObject();
 
@@ -55,9 +57,10 @@ public class SyncClientTask extends WiFiP2pClientTask {
                 }
 
             } else if (receivedObj.getMethodName().equals(SyncHostTask.SYNC_DATA_RESPONSE)) {
+                Log.i("WiFiP2p_Client", "Received Sync Data - ending sync process successfully." );
                 SyncData sdata = (SyncData) receivedObj.getObjectToSend();
 
-                if (sdata != null && sdata.getClass().isInstance(SyncData.class)) {
+                if (sdata != null && (sdata instanceof SyncData)) {
                     synchronizer.updateFromSyncData(sdata);
                 }
             }

+ 7 - 2
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/sync_tasks/SyncHostTask.java

@@ -36,9 +36,11 @@ public class SyncHostTask extends WiFiP2pServerTask {
     @Override
     public WiFiP2pSerializableObject handleReceivedObject(WiFiP2pSerializableObject receivedObj){
         if (receivedObj != null) {
-            Log.i("WiFi Direct Host", "Received: " + receivedObj.getMethodName());
+            Log.i("WiFiP2p_Host", "Received: " + receivedObj.getMethodName());
 
             if (receivedObj.getMethodName().equals(SYNC_INFO_REQUEST)){
+                Log.i("WiFiP2p_Host", "Sending Sync Info: " + SYNC_INFO_RESPONSE);
+
                 this.receivedInfo = (SyncInfo) receivedObj.getObjectToSend();
 
                 SyncInfo response = synchronizer.getSyncInfo();
@@ -51,9 +53,11 @@ public class SyncHostTask extends WiFiP2pServerTask {
             }
 
             if (receivedObj.getMethodName().equals(SYNC_DATA_REQUEST)){
+                Log.i("WiFiP2p_Host", "Sending Sync Data: " + SYNC_DATA_RESPONSE);
+
                 SyncData sdata = (SyncData) receivedObj.getObjectToSend();
 
-                if (sdata != null && sdata.getClass().isInstance(SyncData.class)){
+                if (sdata != null && sdata instanceof SyncData){
                     synchronizer.updateFromSyncData(sdata);
                 }
 
@@ -69,6 +73,7 @@ public class SyncHostTask extends WiFiP2pServerTask {
             }
         }
 
+        Log.i("WiFiP2p_Host", "Stop Sync Process - Performing a disconnect.");
         // DISCONNECT
         this.interrupt(true);
         return null;

+ 88 - 14
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/ui/WiFiP2pSyncActivity.java

@@ -54,6 +54,9 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
     private WifiP2pDevice mDevice;
     private WifiP2pDevice mOtherDevice;
 
+    private ArrayList<WifiP2pDevice> discoveredDevices = new ArrayList<WifiP2pDevice>();
+
+
 
     public boolean isHost() {
         return isHost;
@@ -78,8 +81,6 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
         this.extractFromView();
         this.registerListeners();
 
-        this.mLstP2PDevices.setAdapter(new WiFiPeerListAdapter(this, R.layout.row_devices, new ArrayList()));
-        this.mLstP2PDevices.setOnItemClickListener(this);
     }
 
     @Override
@@ -104,6 +105,7 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
     @Override
     protected void onStop()
     {
+        this.wifiEventHandler().disconnect();
         this.wifiEventHandler().onPause();
         super.onStop();
     }
@@ -125,8 +127,8 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
 
                 @Override
                 public void discoveredDevices(List<WifiP2pDevice> peers) {
-                    Log.d("WiFiP2pSyncActivity", "Actualise devices" + ".");
-                    this.activity.refreshDeviceList(peers);
+                    Log.d("WiFiP2pSyncActivity", "Actualise devices list" + ".");
+                    this.activity.updateDeviceListView(peers);
                 }
 
                 @Override
@@ -171,7 +173,7 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                 public void deviceIsUpdated(WifiP2pDevice device) {
                     Log.d("WiFiP2pSyncActivity", "Updated device " + device.deviceName + " " + device.deviceAddress + ".");
                     this.activity.updateDevice(device);
-                    this.activity.wifiEventHandler().discoverDevices();
+                    this.activity.searchForDevices();
 
                 }
             }.init(this);
@@ -199,12 +201,34 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                 }
                 @Override
                 public void didSucceed() {
-                    Toast.makeText(this.activity, "Synchronization complete.", Toast.LENGTH_SHORT).show();
+                    this.activity.runOnUiThread(new Runnable() {
+                        private WiFiP2pSyncActivity activity;
+                        @Override
+                        public void run() {
+                            Toast.makeText(this.activity, "Synchronization complete.", Toast.LENGTH_SHORT).show();
+                            this.activity.wifiEventHandler().disconnect();
+                        }
+                        public Runnable init(WiFiP2pSyncActivity activity){
+                            this.activity = activity;
+                            return this;
+                        }
+                    }.init(this.activity));
                 }
 
                 @Override
                 public void didFail() {
-                    Toast.makeText(this.activity, "Could not synchronize with device. Retry.", Toast.LENGTH_LONG).show();
+                    this.activity.runOnUiThread(new Runnable() {
+                        private WiFiP2pSyncActivity activity;
+                        @Override
+                        public void run() {
+                            Toast.makeText(this.activity, "Could not synchronize with device. Retry.", Toast.LENGTH_LONG).show();
+                            this.activity.wifiEventHandler().disconnect();
+                        }
+                        public Runnable init(WiFiP2pSyncActivity activity){
+                            this.activity = activity;
+                            return this;
+                        }
+                    }.init(this.activity));
                 }
             }.init(this);
         }
@@ -212,20 +236,44 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
     }
 
 
-    private void refreshDeviceList(List<WifiP2pDevice> peers){
-        this.mLstP2PDevices.setAdapter(new WiFiPeerListAdapter(this, R.layout.row_devices, peers));
+    private void updateDeviceListView(List<WifiP2pDevice> peers){
+        mTxtP2PSearchProgress.setVisibility(View.GONE);
+
+        this.discoveredDevices = new ArrayList<WifiP2pDevice>();
+        this.discoveredDevices.addAll(peers);
+        WiFiPeerListAdapter listAdapter = (WiFiPeerListAdapter) this.mLstP2PDevices.getAdapter();
+        listAdapter.addItems(peers);
+        this.runOnUiThread(new Runnable() {
+            private ListView listView;
+
+            @Override
+            public void run() {
+                WiFiPeerListAdapter adapter = (WiFiPeerListAdapter) this.listView.getAdapter();
+                this.listView.setAdapter(null);
+                adapter.notifyDataSetChanged();
+                this.listView.setAdapter(adapter);
+            }
+
+            public Runnable init(ListView listview) {
+                this.listView = listview;
+                return this;
+            }
+        }.init(this.mLstP2PDevices));
+        Log.d("WiFiP2pSyncActivity", " Discovered "+peers.size()+" devices.");
     }
 
     private void startHost(){
         Log.d("WiFiP2pSyncActivity", "Starting HOST Task" + ".");
         Toast.makeText(this, "Acting as Host.", Toast.LENGTH_SHORT).show();
         this.hostTask = new SyncHostTask(this.syncCompletionListener(), getApplicationContext());
+        this.hostTask.execute();
     }
 
     private void startClient(WifiP2pInfo info){
         Log.d("WiFiP2pSyncActivity", "Starting CLIENT Task" + ".");
         Toast.makeText(this, "Acting as Client.", Toast.LENGTH_SHORT).show();
-        this.clientTask = new SyncClientTask("" + info.groupOwnerAddress, this.syncCompletionListener(), getApplicationContext() );
+        this.clientTask = new SyncClientTask(info.groupOwnerAddress.getHostAddress(), this.syncCompletionListener(), getApplicationContext() );
+        this.clientTask.execute();
     }
 
 
@@ -253,6 +301,11 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
         mDevice = device;
     }
 
+    private void searchForDevices(){
+        mTxtP2PSearchProgress.setVisibility(View.VISIBLE);
+        this.wifiEventHandler().discoverDevices();
+    }
+
     /********************** UI ************************/
 
 
@@ -263,7 +316,7 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
             mTxtP2PNotAvailable.setVisibility(View.VISIBLE);
             ((WiFiPeerListAdapter) mLstP2PDevices.getAdapter()).notifyDataSetChanged();
             mDevice = null;
-            this.refreshDeviceList(new ArrayList<WifiP2pDevice>());
+            this.updateDeviceListView(new ArrayList<WifiP2pDevice>());
 
             Toast.makeText(this, "WiFi Direct P2P is disabled.", Toast.LENGTH_LONG).show();
         }
@@ -285,10 +338,10 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
     }
 
     public void registerListeners(){
+        /*
         mTxtP2PChangeDeviceName.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                /*
                 Method method1 = null;
                 try {
                     method1 = mManager.getClass().getDeclaredMethod("setDeviceName", WifiP2pManager.Channel.class);
@@ -299,9 +352,18 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                     e.printStackTrace();
                 } catch (IllegalAccessException e) {
                     e.printStackTrace();
-                }*/
+                }
             }
-        });
+        });*/
+
+        if (this.mLstP2PDevices.getOnItemClickListener() != this)
+            this.mLstP2PDevices.setOnItemClickListener(this);
+
+        if (this.mLstP2PDevices.getAdapter() == null){
+            this.discoveredDevices = new ArrayList();
+            WiFiPeerListAdapter listAdapter = new WiFiPeerListAdapter(this, R.layout.row_devices, this.discoveredDevices);
+            this.mLstP2PDevices.setAdapter(listAdapter);
+        }
     }
 
 
@@ -328,6 +390,18 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
             super(context, textViewResourceId, objects);
             items = objects;
         }
+
+        @Override
+        public int getCount() {
+            return items.size();
+        }
+
+
+        public void addItems(List<WifiP2pDevice> devicesToAdd){
+            items.clear();
+            items.addAll(devicesToAdd);
+        }
+
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             View v = convertView;