Browse Source

Merge branch 'master' of https://git.tk.informatik.tu-darmstadt.de/scm-ssi-hostage-v3

Alexander Brakowski 9 years ago
parent
commit
708745fb50

+ 1 - 1
AndroidManifest.xml

@@ -52,7 +52,7 @@
             android:value="@integer/google_play_services_lib_version" />
         <meta-data
             android:name="com.google.android.maps.v2.API_KEY"
-            android:value="@string/google_maps_api_key_release" />
+            android:value="@string/google_maps_api_key_debug" />
 
         <activity
             android:name=".ui.activity.MainActivity"

+ 8 - 0
res/values-de/strings.xml

@@ -159,12 +159,20 @@
     <string name="SYNCHRONIZATION_COMPLETE_MESSAGE">Synchronisierung abgeschlossen.</string>
     <string name="SYNCHRONIZATION_FAILED_MESSAGE">Synchronisierung konnte nicht abgeschlossen werden. Versuche es erneut.</string>
 
+
+    <string name="ERROR_CONNECTION_FAILED">Es konnte keine stabile Verbindung hergestellt werden.</string>
+    <string name="ERROR_CONNECTION_TIMEOUT">Zeitüberschreitung - Versuche es erneut.</string>
+    <string name="ERROR_MESSAGE_UNKNOWN">Ein unbekannter Fehler ist aufgetreten. Überprüfe die Appversion oder versuche es erneut.</string>
+    <string name="ERROR_COMMUNICATION_FAILED">Übertragungsfehler - Überprüfe die Appversion oder versuche es erneut.</string>
+
+
     <string name="PERFORMING_TASK_AS_HOST">Verbunden als Host.</string>
     <string name="PERFORMING_TASK_AS_CLIENT">Verbunden als Client.</string>
 
     <string name="ACTIONBAR_TITLE">P2P Synchronisierung</string>
     <string name="PROGRESS_TITLE_LOADING">Empfangen...</string>
     <string name="PROGRESS_TITLE_CONNECTING">Verbinden...</string>
+    <string name="PROGRESS_TITLE_SYNC">Datenaustausch</string>
 
     <string name="DEVICE_STATUS_AVAILABLE">Bereit</string>
     <string name="DEVICE_STATUS_INVITED">Eingeladen</string>

+ 1 - 1
res/values/api_keys.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-	<string name="google_maps_api_key_debug">AIzaSyCiKokfd8BtGaWm8mmSZR1PslAtUm2VIEI</string>
+	<string name="google_maps_api_key_debug">AIzaSyCqh4bb4aMzvDcpDfiqHyXoAWFTQ6iNxe8</string>
 	<string name="google_maps_api_key_release">AIzaSyCxYbHYCoA0Mc_uZ_RwxqfJFZC1HBzzTR8</string>
 </resources>

+ 9 - 0
res/values/strings.xml

@@ -181,12 +181,21 @@
     <string name="SYNCHRONIZATION_COMPLETE_MESSAGE">Synchronization complete.</string>
     <string name="SYNCHRONIZATION_FAILED_MESSAGE">Could not synchronize devices. Retry</string>
 
+    <string name="ERROR_CONNECTION_FAILED">Could not create a stable connection.</string>
+    <string name="ERROR_CONNECTION_TIMEOUT">The connection took too long, please try again.</string>
+    <string name="ERROR_MESSAGE_UNKNOWN">A unknown error did happen.\nPlease check your app versions or try again.</string>
+    <string name="ERROR_COMMUNICATION_FAILED">Illegal data transmitted.\nPlease check your app version.</string>
+
+
     <string name="PERFORMING_TASK_AS_HOST">Acting as Host.</string>
     <string name="PERFORMING_TASK_AS_CLIENT">Acting as Client.</string>
 
     <string name="ACTIONBAR_TITLE">WifiDirect Synchronization</string>
     <string name="PROGRESS_TITLE_LOADING">Loading...</string>
     <string name="PROGRESS_TITLE_CONNECTING">Connecting...</string>
+    <string name="PROGRESS_TITLE_SYNC">Synchronize</string>
+
+
 
     <string name="DEVICE_STATUS_AVAILABLE">Available</string>
     <string name="DEVICE_STATUS_INVITED">Invited</string>

+ 16 - 7
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/BackgroundTask.java

@@ -8,17 +8,20 @@ import android.os.AsyncTask;
  */
 public class BackgroundTask extends AsyncTask<Void, Void, String> {
 
+    public static String BACKGROUND_TASK_MESSAGE_SUCCESS = "success";
+
     /**
      * This listener calls didSucceed if the method performInBackground will return true, otherwise it calls didFail.
      */
     public interface BackgroundTaskCompletionListener {
         public void didSucceed();
-        public void didFail();
+        public void didFail(String errorMessage);
     }
 
     private boolean isInterrupted;
 
     private boolean wasSuccessfully;
+    private String errorMessage;
 
     public void interrupt(boolean b){
         this.isInterrupted = b;
@@ -46,16 +49,22 @@ public class BackgroundTask extends AsyncTask<Void, Void, String> {
 
     /**
      * Do any stuff here if it should run in the background. It should return true or false if the process was successfully.
-     * @return boolean
+     * @return String error message, default is BACKGROUND_TASK_MESSAGE_SUCCESS
      */
-    public boolean performInBackground(){
-        return true;
+    public String performInBackground(){
+        return BACKGROUND_TASK_MESSAGE_SUCCESS;
     }
 
     @Override
     protected String doInBackground(Void... params) {
-        this.wasSuccessfully = this.performInBackground();
-        return null;
+        String message = this.performInBackground();
+        if (message == null || message.equals(BACKGROUND_TASK_MESSAGE_SUCCESS)){
+            this.wasSuccessfully = true;
+        } else{
+            this.wasSuccessfully = false;
+        }
+        this.errorMessage = message;
+        return message;
     }
 
     /*
@@ -68,7 +77,7 @@ public class BackgroundTask extends AsyncTask<Void, Void, String> {
             if (this.wasSuccessfully) {
                 this.completion_listener.didSucceed();
             }else {
-                this.completion_listener.didFail();
+                this.completion_listener.didFail(this.errorMessage);
             }
         }
     }

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

@@ -12,13 +12,13 @@ public class TimeoutTask extends BackgroundTask {
         this.seconds = seconds;
     }
 
-    public boolean performInBackground(){
+    public String performInBackground(){
         try {
             Thread.sleep(this.seconds * 1000);
         } catch (InterruptedException e){
             // what ever
-            return false;
+            return e.getLocalizedMessage();
         }
-        return true;
+        return BACKGROUND_TASK_MESSAGE_SUCCESS;
     }
 }

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

@@ -210,7 +210,7 @@ public class WiFiP2pBroadcastReceiver extends BroadcastReceiver implements WifiP
                     }
                 }
                 @Override
-                public void didFail() {
+                public void didFail(String e) {
                     // do nothing here
                 }
                 public BackgroundTask.BackgroundTaskCompletionListener init(WiFiP2pBroadcastReceiver receiver){

+ 26 - 6
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/WiFiP2pClientTask.java

@@ -12,6 +12,9 @@ import java.io.OutputStream;
 import java.net.InetSocketAddress;
 import java.net.Socket;
 
+import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
+
 /**
  * Created by Julien on 07.01.2015.
  *
@@ -23,6 +26,7 @@ import java.net.Socket;
  */
 public abstract class WiFiP2pClientTask extends BackgroundTask {
 
+
     // Set the port here for the client and host task.
     public static int DEFAULT_WIFI_PORT = 1029;
 
@@ -68,7 +72,10 @@ public abstract class WiFiP2pClientTask extends BackgroundTask {
     }
 
     @Override
-    public boolean performInBackground(){
+    public String performInBackground(){
+
+        String e_message = null;
+
         int tryNum = 1;
         int max_tries = 10;
         while (!this.isInterrupted() && tryNum <= max_tries){
@@ -85,8 +92,11 @@ public abstract class WiFiP2pClientTask extends BackgroundTask {
                 Log.d("DEBUG_WiFiP2pClientTask", "Client: Data written");
             } catch (ClassNotFoundException e){
                 Log.e("DEBUG_WiFiP2pClientTask", e.getMessage());
-                return false;
-            } catch (IOException e) {
+                e_message =  e.getLocalizedMessage();
+                if (e_message == null){
+                    e_message = WiFiP2pServerTask.ERROR_COMMUNICATION_FAILED;// COMMUNICATION_ERROR
+                }
+                return e_message;            } catch (IOException e) {
                 Log.e("DEBUG_WiFiP2pClientTask", e.getMessage());
 
                 if(this.isInterrupted()) {
@@ -96,7 +106,7 @@ public abstract class WiFiP2pClientTask extends BackgroundTask {
 
                 long seconds_to_wait = (long) Math.min(60, Math.pow(2, 1));
                 tryNum++;
-                Log.i("DEBUG_WiFiP2pClientTask", "could not connect to server. Will try again in " + seconds_to_wait + "s");
+                Log.i("DEBUG_WiFiP2pClientTask", "could not connect to server. Will try again in " + 1 + "s");
                 try {
                     Thread.sleep(seconds_to_wait * time_out());
                 } catch (InterruptedException ie){
@@ -111,13 +121,23 @@ public abstract class WiFiP2pClientTask extends BackgroundTask {
                             // Give up
                             e.printStackTrace();
                             Log.d("DEBUG_WiFiP2p_Error"," Failed to close socket - "+ e.getLocalizedMessage());
-                            return false;
+                            e_message =  e.getLocalizedMessage();
+                            if (e_message == null){
+                                e_message = WiFiP2pServerTask.ERROR_CONNECTION_FAILED;// FAILED TO CONNECT
+                            }
+                            return e_message;
                         }
                     }
                 }
             }
         }
-        return tryNum <= max_tries;
+
+        if (tryNum > max_tries){
+            e_message = WiFiP2pServerTask.ERROR_CONNECTION_TIMEOUT;// CONNECTION_TIMEOUT
+        }
+
+
+        return e_message;
     }
 
 

+ 29 - 7
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/WiFiP2pServerTask.java

@@ -13,6 +13,9 @@ import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 
+import de.tudarmstadt.informatik.hostage.R;
+import de.tudarmstadt.informatik.hostage.ui.activity.MainActivity;
+
 /**
  * Created by Julien on 07.01.2015.
  *
@@ -28,7 +31,16 @@ import java.net.Socket;
  */
 public abstract class WiFiP2pServerTask extends BackgroundTask {
 
-static int DEFAULT_TIMEOUT = 15;
+    public static String ERROR_MESSAGE_UNKNOWN      = MainActivity.getContext().getString(R.string.ERROR_MESSAGE_UNKNOWN);
+    public static String ERROR_COMMUNICATION_FAILED = MainActivity.getContext().getString(R.string.ERROR_COMMUNICATION_FAILED);
+    public static String ERROR_CONNECTION_FAILED    = MainActivity.getContext().getString(R.string.ERROR_CONNECTION_FAILED);
+    public static String ERROR_CONNECTION_TIMEOUT   = MainActivity.getContext().getString(R.string.ERROR_CONNECTION_TIMEOUT);
+
+
+    static int DEFAULT_TIMEOUT = 15;
+
+
+
     private ServerSocket serverSocket;
 
     private WifiP2pDevice ownDevice;
@@ -62,7 +74,8 @@ static int DEFAULT_TIMEOUT = 15;
             try {
                 this.serverSocket.close();
             } catch (IOException e) {
-                Log.e("DEBUG_WiFiP2pServerTask", "" + e.getMessage());
+                String message = e.getLocalizedMessage() != null? e.getLocalizedMessage() : ERROR_MESSAGE_UNKNOWN;
+                Log.e("DEBUG_WiFiP2pServerTask", "" + message);
             }
         }
     }
@@ -74,7 +87,7 @@ static int DEFAULT_TIMEOUT = 15;
     }
 
     @Override
-    public boolean performInBackground(){
+    public String performInBackground(){
         while (!this.isInterrupted()){
             try {
                 this.serverSocket = new ServerSocket(WiFiP2pClientTask.port());
@@ -90,11 +103,16 @@ static int DEFAULT_TIMEOUT = 15;
                 client.close();
                 serverSocket.close();
 
-                return true;
+                return BACKGROUND_TASK_MESSAGE_SUCCESS;
             } catch (ClassNotFoundException e){
                 e.printStackTrace();
                 Log.e("DEBUG_WiFiP2pServerTask", "" + e.getMessage());
-                return false;
+                String e_message =  null;
+                e_message = e.getLocalizedMessage();
+                if (e_message == null){
+                    e_message = ERROR_COMMUNICATION_FAILED;// COMMUNICATION_ERROR
+                }
+                return e_message;
             } catch (IOException  e) {
                 try {
                     if (!this.serverSocket.isClosed()) this.serverSocket.close();
@@ -103,10 +121,14 @@ static int DEFAULT_TIMEOUT = 15;
                 }
                 e.printStackTrace();
                 Log.e("DEBUG_WiFiP2pServerTask", "" + e.getMessage());
-                return false;
+                String e_message = e.getLocalizedMessage();
+                if (e_message == null){
+                    e_message = ERROR_MESSAGE_UNKNOWN;// UNKNOWN_ERROR
+                }
+                return e_message;
             }
         }
-        return true;
+        return BACKGROUND_TASK_MESSAGE_SUCCESS;
     }
 
 

+ 28 - 33
src/de/tudarmstadt/informatik/hostage/sync/wifi_direct/ui/WiFiP2pSyncActivity.java

@@ -8,7 +8,6 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.wifi.p2p.WifiP2pDevice;
 import android.net.wifi.p2p.WifiP2pInfo;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.util.Log;
@@ -50,8 +49,9 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
     public static String PERFORMING_TASK_AS_CLIENT = MainActivity.getContext().getString(R.string.PERFORMING_TASK_AS_CLIENT);//"Acting as Client.";
 
     public static String ACTIONBAR_TITLE =MainActivity.getContext().getString(R.string.ACTIONBAR_TITLE);// "WifiDirect Synchronization";
-    public static String PROGRESS_TITLE_LOADING =MainActivity.getContext().getString(R.string.PROGRESS_TITLE_LOADING);// "Loading...";
-    public static String PROGRESS_TITLE_CONNECTING = MainActivity.getContext().getString(R.string.PROGRESS_TITLE_CONNECTING);//"Connecting...";
+    public static String PROGRESS_MESSAGE_LOADING =MainActivity.getContext().getString(R.string.PROGRESS_TITLE_LOADING);// "Loading...";
+    public static String PROGRESS_MESSAGE_CONNECTING = MainActivity.getContext().getString(R.string.PROGRESS_TITLE_CONNECTING);//"Connecting...";
+    public static String PROGRESS_TITLE_SYNC = MainActivity.getContext().getString(R.string.PROGRESS_TITLE_SYNC);//"Connecting...";
 
     public static String DEVICE_STATUS_AVAILABLE =MainActivity.getContext().getString(R.string.DEVICE_STATUS_AVAILABLE);// "Available";
     public static String DEVICE_STATUS_INVITED =MainActivity.getContext().getString(R.string.DEVICE_STATUS_INVITED);// "Invited";
@@ -109,6 +109,11 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
 
         this.wifiEventHandler();
 
+        this.progressDialog = new ProgressDialog(this);
+        this.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+        this.progressDialog.setIndeterminate(true);
+        this.progressDialog.setTitle(PROGRESS_TITLE_SYNC);
+
         setContentView(R.layout.activity_p2_psync);
 
         assert getActionBar() != null;
@@ -119,6 +124,8 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
 
         this.wifiEventHandler().startService();
 
+        int seconds = 25;
+
 		new Timer().scheduleAtFixedRate(new TimerTask() {
 			@Override
 			public void run() {
@@ -129,7 +136,7 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
 					}
 				});
 			}
-		}, 1000, 5000); // search for devices every 5 seconds
+		}, 1000, seconds * 1000); // search for devices every few seconds
     }
 
     @Override
@@ -204,12 +211,10 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                 public void didConnect(boolean isHost, WifiP2pInfo connectionInfo) {
                     Log.d("DEBUG_WiFiP2pSyncActivity", "Did connect");
 
-                    String progressTitle = PROGRESS_TITLE_LOADING;
-                    if (this.activity.progressDialog != null){
-                        this.activity.progressDialog.dismiss();
+                    this.activity.progressDialog.setMessage(PROGRESS_MESSAGE_LOADING);
+                    if (!this.activity.progressDialog.isShowing()){
+                        this.activity.progressDialog.show();
                     }
-                    this.activity.progressDialog = ProgressDialog.show(activity, "", progressTitle);
-
 
                     this.activity.setHost(isHost);
                     if (isHost){
@@ -243,7 +248,12 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                     Log.d("DEBUG_WiFiP2pSyncActivity", "Failed to disconnect");
                     //Toast.makeText(this.activity, "Could not disconnect with device. Retry.", Toast.LENGTH_LONG).show();
                     // Other device did disconnect a while before.
-                    if (this.activity.progressDialog != null){
+                    if (this.activity.progressDialog != null &&
+                            ((this.activity.hostTask == null && this.activity.clientTask == null) ||
+                             (this.activity.clientTask != null && this.activity.clientTask.isInterrupted()) ||
+                             (this.activity.hostTask != null && this.activity.hostTask.isInterrupted()) ||
+                             (this.activity.ownDevice == null && this.activity.ownDevice.status != WifiP2pDevice.CONNECTED)
+                            )){
                         this.activity.progressDialog.dismiss();
                     }
                 }
@@ -304,14 +314,16 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
                 }
 
                 @Override
-                public void didFail() {
-                    Toast.makeText(this.activity, SYNCHRONIZATION_FAILED_MESSAGE, Toast.LENGTH_LONG).show();
+                public void didFail(String e) {
+                    boolean hasMessage = ((e != null) && (e.length() > 0));
+                    String message = hasMessage ? e : SYNCHRONIZATION_FAILED_MESSAGE;
+
+                    Toast.makeText(this.activity, message, Toast.LENGTH_LONG).show();
                     this.activity.wifiEventHandler().disconnect();
                     if (this.activity.hostTask != null){
                         this.activity.hostTask.setInterrupted(true);
                         this.activity.hostTask = null;
                     }
-                    //this.activity.clientTask = null;
                 }
             }.init(this);
         }
@@ -390,27 +402,10 @@ public class WiFiP2pSyncActivity extends Activity implements AdapterView.OnItemC
      * @param device
      */
     private void connectTo(WifiP2pDevice device){
-        String connectionTitle = PROGRESS_TITLE_CONNECTING;
         if (device != null){
-            if (progressDialog == null){
-                this.progressDialog = ProgressDialog.show(this, "", PROGRESS_TITLE_CONNECTING);
-            } else {
-                this.progressDialog.setTitle(PROGRESS_TITLE_CONNECTING);
-            }
-            new Thread()
-            {
-                public void run()
-                {
-                    try
-                    {
-                        sleep(20);
-                    }
-                    catch (Exception e)
-                    {
-                    }
-                    progressDialog.setTitle(PROGRESS_TITLE_CONNECTING);
-                }
-            }.start();
+            this.progressDialog.setMessage(PROGRESS_MESSAGE_CONNECTING);
+            this.progressDialog.show();
+
             mOtherDevice = device;
             this.wifiEventHandler().connect(device);