[PATCH] fdo#61873 add WiFi experimental feature alert.

Siqi LIU (via Code Review) gerrit at gerrit.libreoffice.org
Fri Apr 12 16:49:21 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3366

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/66/3366/1

fdo#61873 add WiFi experimental feature alert.

fixes reconnect crash. Won't crash when server-end disconnect.

seperate Client construction and initialization so that Client() will release its mutex lock and won't block service.run(). Otherwise onBackPressed() will be blocked in PairingActivity

Change-Id: I424a470aa02b0c74b28cb9f9ba79489aa0d4ab1b
---
M android/sdremote/AndroidManifest.xml
M android/sdremote/res/layout/activity_reconnect.xml
M android/sdremote/res/layout/dialog_addserver.xml
M android/sdremote/res/values/strings.xml
M android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
M android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
M android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
M android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
M android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
M android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
M android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
M android/sdremote/src/org/libreoffice/impressremote/communication/ReconnectionActivity.java
M android/sdremote/src/org/libreoffice/impressremote/communication/Server.java
13 files changed, 362 insertions(+), 102 deletions(-)



diff --git a/android/sdremote/AndroidManifest.xml b/android/sdremote/AndroidManifest.xml
index d279fbb..8eaf63d 100644
--- a/android/sdremote/AndroidManifest.xml
+++ b/android/sdremote/AndroidManifest.xml
@@ -57,6 +57,11 @@
             android:icon="@drawable/icon_options"
             android:label="@string/options" >
         </activity>
+        <activity
+            android:name=".communication.ReconnectionActivity"
+            android:logo="@drawable/actionbar_icon_computer"
+            android:label="@string/reconnect" >
+        </activity>
     </application>
 
 </manifest>
diff --git a/android/sdremote/res/layout/activity_reconnect.xml b/android/sdremote/res/layout/activity_reconnect.xml
index 8baa76d..0d2f8bb 100644
--- a/android/sdremote/res/layout/activity_reconnect.xml
+++ b/android/sdremote/res/layout/activity_reconnect.xml
@@ -40,7 +40,17 @@
             android:gravity="center_horizontal"
             android:text="@string/reconnect_description2"
             android:textAppearance="?android:attr/textAppearanceMedium" />
+        
+        <TextView
+            android:id="@+id/countDownTV"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:gravity="center_horizontal"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
 
     </LinearLayout>
 
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/android/sdremote/res/layout/dialog_addserver.xml b/android/sdremote/res/layout/dialog_addserver.xml
index 01ddba2..fdb984b 100644
--- a/android/sdremote/res/layout/dialog_addserver.xml
+++ b/android/sdremote/res/layout/dialog_addserver.xml
@@ -3,9 +3,20 @@
     android:id="@+id/addserver_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:padding="12dp"
     android:orientation="vertical" >
-
+    
     <TextView
+        android:id="@+id/wifiAlertMsg"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="5dp"
+        android:text="@string/wifiAlertMsg"
+        android:textStyle="italic"
+        android:typeface="serif" />
+        
+    <TextView
+
         android:id="@+id/addserver_namelabel"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
@@ -43,4 +54,4 @@
         android:checked="true"
         android:text="@string/addserver_remember" />
 
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/android/sdremote/res/values/strings.xml b/android/sdremote/res/values/strings.xml
index a08edd1..84edffc 100644
--- a/android/sdremote/res/values/strings.xml
+++ b/android/sdremote/res/values/strings.xml
@@ -7,6 +7,7 @@
     <string name="presentation_ui_resizehandle">Handle to resize view.</string>
     <string name="presentation_blank_screen">Blank Screen</string>
     <string name="options">Options</string>
+    <string name="reconnect">Reconnect...</string>
     <string name="actionbar_timeformat">h:mmaa</string>
     <string name="actionbar_timerformat">mm:ss</string>
     <string name="clock_timer_start">Start</string>
@@ -15,6 +16,8 @@
     <string name="clock_timer_reset">Reset</string>
     <string name="clock_timer_resume">Resume</string>
     <string name="options_autodecline">Decline Calls</string>
+    <string name="help">Help</string>
+    <string name="ConnectionFailedHelp">#1 Verify Impress is running \n#2 For Bluetooth user, enable \"Preference\"-\"LibreOffice Impress\"-\"General\"-\"Enable remote control\"\n#3 For WiFi user, tick \"Preferece\"-\"LibreOffice\"-\"Advanced\"-\"Enable Experimental Features\" \n </string>
     <string name="options_description">Automatically decline all incoming calls.</string>
     <string name="options_volumeswitching">Volume Switching</string>
     <string name="options_volumeswitching_descripton">Change slides using volume buttons</string>
@@ -49,6 +52,7 @@
     <string name="addserver_add">Add</string>
     <string name="addserver_cancel">Cancel</string>
     <string name="reconnect_description1">Your connection has been dropped.</string>
-    <string name="reconnect_description2">Attempting to reconnect…</string>
+    <string name="reconnect_description2">Please try to reconnect</string>
+    <string name="wifiAlertMsg">This is still an experimental feature. You need to \"enable experimental features\" in \"Preference\"-\"LibreOffice\"-\"Advanced\" on your computer. \nThe use over Bluetooth is recommanded.</string>
 
 </resources>
diff --git a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
index f9e6c92..26f1b8e 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
@@ -10,18 +10,25 @@
 
 import java.text.MessageFormat;
 
+import org.libreoffice.impressremote.communication.CommunicationService;
+import org.libreoffice.impressremote.communication.CommunicationService.State;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.ServiceConnection;
 import android.os.Bundle;
+import android.os.IBinder;
 import android.support.v4.content.LocalBroadcastManager;
 import android.widget.TextView;
 
 import com.actionbarsherlock.app.SherlockActivity;
+import com.actionbarsherlock.view.MenuItem;
 
 public class PairingActivity extends SherlockActivity {
     private ActivityChangeBroadcastProcessor mBroadcastProcessor;
+    private CommunicationService mCommunicationService;
 
     /** Called when the activity is first created. */
     @Override
@@ -29,8 +36,8 @@
         super.onCreate(savedInstanceState);
 
         setContentView(R.layout.activity_pairing);
-
-        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        bindService(new Intent(this, CommunicationService.class), mConnection,
+                Context.BIND_IMPORTANT);
 
         IntentFilter aFilter = new IntentFilter();
 
@@ -54,6 +61,22 @@
 
         getSupportActionBar().setTitle(aServerName);
     }
+    
+    @Override
+    public void onPause(){
+        super.onPause();
+        unbindService(mConnection);
+    }
+
+    @Override
+    public void onBackPressed() {
+        mCommunicationService.getClient().closeConnection();
+        
+        Intent aIntent = new Intent(this, SelectorActivity.class);
+        aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        startActivity(aIntent);
+    }
+
 
     private BroadcastReceiver mListener = new BroadcastReceiver() {
 
@@ -63,6 +86,32 @@
         }
     };
 
+    private ServiceConnection mConnection = new ServiceConnection() {
+
+        @Override
+        public void onServiceConnected(ComponentName aClassName,
+                IBinder aService) {
+            mCommunicationService = ((CommunicationService.CBinder) aService)
+                    .getService();
+
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName aClassName) {
+            mCommunicationService = null;
+        }
+    };
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            onBackPressed();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
index 3b0f684..560e5d3 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
@@ -63,6 +63,8 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_selector);
 
+        if (mCommunicationService != null)
+            mCommunicationService.disconnect();
         IntentFilter aFilter = new IntentFilter(
                         CommunicationService.MSG_SERVERLIST_CHANGED);
         aFilter.addAction(CommunicationService.STATUS_CONNECTION_FAILED);
@@ -223,26 +225,50 @@
                 if (mProgressDialog != null) {
                     mProgressDialog.dismiss();
 
-                    String aFormat = getResources().getString(
-                                    R.string.selector_dialog_connectionfailed);
-                    String aDialogText = MessageFormat.format(aFormat,
-                                    mCommunicationService
-                                                    .getPairingDeviceName());
+                    if (mCommunicationService != null) {
+                        String aFormat = getResources().getString(
+                                R.string.selector_dialog_connectionfailed);
+                        String aDialogText = MessageFormat.format(aFormat,
+                                mCommunicationService.getPairingDeviceName());
 
-                    AlertDialog.Builder builder = new AlertDialog.Builder(
-                                    SelectorActivity.this);
-                    builder.setMessage(aDialogText)
-                                    .setCancelable(false)
-                                    .setPositiveButton(
-                                                    R.string.selector_dialog_connectionfailed_ok,
-                                                    new DialogInterface.OnClickListener() {
-                                                        public void onClick(
-                                                                        DialogInterface dialog,
-                                                                        int id) {
-                                                            dialog.dismiss();
-                                                        }
-                                                    });
-                    builder.show();
+                        AlertDialog.Builder builder = new AlertDialog.Builder(
+                                SelectorActivity.this);
+                        builder.setMessage(aDialogText)
+                                .setCancelable(false)
+                                .setNeutralButton(R.string.help,
+                                        new DialogInterface.OnClickListener() {
+                                            public void onClick(
+                                                    DialogInterface dialog,
+                                                    int id) {
+                                                dialog.dismiss();
+                                                AlertDialog.Builder builder = new AlertDialog.Builder(
+                                                        SelectorActivity.this);
+                                                builder.setMessage(
+                                                        R.string.ConnectionFailedHelp)
+                                                        .setCancelable(false)
+                                                        .setPositiveButton(
+                                                                R.string.selector_dialog_connectionfailed_ok,
+                                                                new DialogInterface.OnClickListener() {
+                                                                    public void onClick(
+                                                                            DialogInterface dialog,
+                                                                            int id) {
+                                                                        dialog.dismiss();
+                                                                    }
+                                                                });
+                                                builder.show();
+                                            }
+                                        })
+                                .setPositiveButton(
+                                        R.string.selector_dialog_connectionfailed_ok,
+                                        new DialogInterface.OnClickListener() {
+                                            public void onClick(
+                                                    DialogInterface dialog,
+                                                    int id) {
+                                                dialog.dismiss();
+                                            }
+                                        });
+                        builder.show();
+                    }
                 }
             }
             mBroadcastProcessor.onReceive(aContext, aIntent);
diff --git a/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
index 44a3368..163b8fa 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
@@ -10,6 +10,7 @@
 
 import org.libreoffice.impressremote.communication.CommunicationService;
 
+import android.app.AlertDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -18,6 +19,7 @@
 import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.IBinder;
+import android.support.v4.app.FragmentTransaction;
 import android.support.v4.content.LocalBroadcastManager;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -37,6 +39,7 @@
         bindService(new Intent(this, CommunicationService.class), mConnection,
                         Context.BIND_IMPORTANT);
 
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
         IntentFilter aFilter = new IntentFilter(
                         CommunicationService.MSG_SLIDESHOW_STARTED);
 
@@ -97,6 +100,18 @@
             mBroadcastProcessor.onReceive(aContext, aIntent);
         }
     };
+
+    @Override
+    public boolean onOptionsItemSelected(
+            com.actionbarsherlock.view.MenuItem item) {
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            onBackPressed();
+            return true;
+        default:
+            return super.onOptionsItemSelected(item);
+        }
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
index 07a626f..c2e7a61 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
@@ -58,6 +58,27 @@
 
         mSocket.connect();
         Log.i(Globals.TAG, "BluetoothClient: connected");
+    }
+
+    @Override
+    public void closeConnection() {
+        try {
+            if (mSocket != null)
+                mSocket.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    protected void onDisconnect() {
+        if (!mBluetoothWasEnabled) {
+            mAdapter.disable();
+        }
+    }
+
+    @Override
+    public void validating() throws IOException {
+        // TODO Auto-generated method stub
 
         mInputStream = mSocket.getInputStream();
         mReader = new BufferedReader(new InputStreamReader(mInputStream,
@@ -78,22 +99,6 @@
                         aIntent);
         startListening();
 
-    }
-
-    @Override
-    public void closeConnection() {
-        try {
-            if (mSocket != null)
-                mSocket.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    protected void onDisconnect() {
-        if (!mBluetoothWasEnabled) {
-            mAdapter.disable();
-        }
     }
 
 }
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
index 198b873..53706df 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
@@ -15,7 +15,11 @@
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 
+import org.libreoffice.impressremote.Globals;
+import org.libreoffice.impressremote.communication.CommunicationService.State;
+
 import android.content.Intent;
+import android.util.Log;
 
 /**
  * Generic Client for the remote control. To implement a Client for a specific
@@ -37,6 +41,7 @@
 
     public abstract void closeConnection();
 
+    public abstract void validating() throws IOException;
     private Receiver mReceiver;
 
     protected Server mServer;
@@ -75,11 +80,11 @@
                     aList.add(aTemp);
                 }
                 if (aTemp == null) {
-                    mCommunicationService.connectTo(mServer);
                     Intent aIntent = new Intent(
                                     mCommunicationService
                                                     .getApplicationContext(),
                                     ReconnectionActivity.class);
+                    aIntent.putExtra("server", mServer);                    
                     aIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                     mCommunicationService.getApplicationContext()
                                     .startActivity(aIntent);
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index 8028f00..f7401fb 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -102,28 +102,34 @@
                             case NETWORK:
                                 mClient = new NetworkClient(mServerDesired,
                                                 this, mReceiver);
+                                mClient.validating();
                                 break;
                             case BLUETOOTH:
                                 mClient = new BluetoothClient(mServerDesired,
                                                 this, mReceiver,
                                                 mBluetoothPreviouslyEnabled);
+                                mClient.validating();
                                 break;
                             }
                             mTransmitter = new Transmitter(mClient);
                             mState = State.CONNECTED;
                         } catch (IOException e) {
                             Log.i(Globals.TAG, "CommunicationService.run: " + e);
-                            mClient = null;
-                            mState = State.DISCONNECTED;
-                            Intent aIntent = new Intent(
-                                            CommunicationService.STATUS_CONNECTION_FAILED);
-                            LocalBroadcastManager.getInstance(this)
-                                            .sendBroadcast(aIntent);
+                            connextionFailed();
                         }
                     }
                 }
+                Log.i(Globals.TAG, "CommunicationService.finished work");
             }
         }
+    }
+
+    private void connextionFailed() {
+        mClient = null;
+        mState = State.DISCONNECTED;
+        Intent aIntent = new Intent(
+                CommunicationService.STATUS_CONNECTION_FAILED);
+        LocalBroadcastManager.getInstance(this).sendBroadcast(aIntent);
     }
 
     private boolean mBluetoothPreviouslyEnabled;
@@ -174,6 +180,7 @@
     }
 
     public void disconnect() {
+        Log.d(Globals.TAG, "Service Disconnected");
         synchronized (mConnectionVariableMutex) {
             mStateDesired = State.DISCONNECTED;
             synchronized (this) {
@@ -328,6 +335,10 @@
 
     }
 
+    public Client getClient() {
+        return mClient;
+    }
+
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
index 2e88a17..fbd51fa 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
@@ -31,73 +31,38 @@
     private static final int PORT = 1599;
 
     private Socket mSocket;
+    private Intent mIntent;
+    private String mPin;
+    private Server mServer;
 
     public NetworkClient(Server aServer,
-                    CommunicationService aCommunicationService,
-                    Receiver aReceiver) throws UnknownHostException,
-                    IOException {
+            CommunicationService aCommunicationService, Receiver aReceiver)
+            throws UnknownHostException, IOException {
         super(aServer, aCommunicationService, aReceiver);
-        mSocket = new Socket(aServer.getAddress(), PORT);
+        mServer = aServer;
+        mSocket = new Socket(mServer.getAddress(), PORT);
         mInputStream = mSocket.getInputStream();
         mReader = new BufferedReader(new InputStreamReader(mInputStream,
-                        CHARSET));
+                CHARSET));
         mOutputStream = mSocket.getOutputStream();
+
         // Pairing.
-        String aPin = setupPin(aServer);
-        Intent aIntent = new Intent(CommunicationService.MSG_PAIRING_STARTED);
-        aIntent.putExtra("PIN", aPin);
-        mPin = aPin;
+        mPin = setupPin(mServer);
+        mIntent = new Intent(CommunicationService.MSG_PAIRING_STARTED);
+        mIntent.putExtra("PIN", mPin);
         LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast(
-                        aIntent);
+                mIntent);
         // Send out
-        String aName = CommunicationService.getDeviceName(); // TODO: get the proper name
-        sendCommand("LO_SERVER_CLIENT_PAIR\n" + aName + "\n" + aPin + "\n\n");
-
-        // Wait until we get the appropriate string back...
-        String aTemp = mReader.readLine();
-
-        if (aTemp == null) {
-            throw new IOException(
-                            "End of stream reached before any data received.");
-        }
-
-        while (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) {
-            if (aTemp.equals("LO_SERVER_VALIDATING_PIN")) {
-                // Broadcast that we need a pin screen.
-                aIntent = new Intent(
-                                CommunicationService.STATUS_PAIRING_PINVALIDATION);
-                aIntent.putExtra("PIN", aPin);
-                aIntent.putExtra("SERVERNAME", aServer.getName());
-                mPin = aPin;
-                LocalBroadcastManager.getInstance(mCommunicationService)
-                                .sendBroadcast(aIntent);
-                while (mReader.readLine().length() != 0) {
-                    // Read off empty lines
-                }
-                aTemp = mReader.readLine();
-            } else {
-                return;
-            }
-        }
-
-        aIntent = new Intent(CommunicationService.MSG_PAIRING_SUCCESSFUL);
-        LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast(
-                        aIntent);
-
-        while (mReader.readLine().length() != 0) {
-            // Get rid of extra lines
-            Log.i(Globals.TAG, "NetworkClient: extra line");
-        }
-        Log.i(Globals.TAG, "NetworkClient: calling startListening");
-        startListening();
-
+        String aName = CommunicationService.getDeviceName(); // TODO: get the
+                                                             // proper name
+        sendCommand("LO_SERVER_CLIENT_PAIR\n" + aName + "\n" + mPin + "\n\n");
     }
 
     private String setupPin(Server aServer) {
         // Get settings
         SharedPreferences aPreferences = mCommunicationService
-                        .getSharedPreferences("sdremote_authorisedremotes",
-                                        android.content.Context.MODE_PRIVATE);
+                .getSharedPreferences("sdremote_authorisedremotes",
+                        android.content.Context.MODE_PRIVATE);
         if (aPreferences.contains(aServer.getName())) {
             return aPreferences.getString(aServer.getName(), "");
         } else {
@@ -132,6 +97,46 @@
         }
     }
 
+    @Override
+    public void validating() throws IOException {
+
+        // Wait until we get the appropriate string back...
+        String aTemp = mReader.readLine();
+
+        if (aTemp == null) {
+            throw new IOException(
+                    "End of stream reached before any data received.");
+        }
+
+        while (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) {
+            if (aTemp.equals("LO_SERVER_VALIDATING_PIN")) {
+                // Broadcast that we need a pin screen.
+                mIntent = new Intent(
+                        CommunicationService.STATUS_PAIRING_PINVALIDATION);
+                mIntent.putExtra("PIN", mPin);
+                mIntent.putExtra("SERVERNAME", mServer.getName());
+                LocalBroadcastManager.getInstance(mCommunicationService)
+                        .sendBroadcast(mIntent);
+                while (mReader.readLine().length() != 0) {
+                    // Read off empty lines
+                }
+                aTemp = mReader.readLine();
+            } else {
+                return;
+            }
+        }
+
+        mIntent = new Intent(CommunicationService.MSG_PAIRING_SUCCESSFUL);
+        LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast(
+                mIntent);
+
+        while (mReader.readLine().length() != 0) {
+            // Get rid of extra lines
+            Log.i(Globals.TAG, "NetworkClient: extra line");
+        }
+        Log.i(Globals.TAG, "NetworkClient: calling startListening");
+        startListening();
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/ReconnectionActivity.java b/android/sdremote/src/org/libreoffice/impressremote/communication/ReconnectionActivity.java
index 8417cde..8622737 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/ReconnectionActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/ReconnectionActivity.java
@@ -8,18 +8,99 @@
  */
 package org.libreoffice.impressremote.communication;
 
+import org.libreoffice.impressremote.ActivityChangeBroadcastProcessor;
 import org.libreoffice.impressremote.R;
+import org.libreoffice.impressremote.SelectorActivity;
 
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.ServiceConnection;
 import android.os.Bundle;
+import android.os.IBinder;
+import android.support.v4.content.LocalBroadcastManager;
 
 import com.actionbarsherlock.app.SherlockActivity;
+import com.actionbarsherlock.view.MenuItem;
 
 public class ReconnectionActivity extends SherlockActivity {
+
+    private ActivityChangeBroadcastProcessor mBroadcastProcessor;
+    private CommunicationService mCommunicationService;
+
+    // private TextView mCountDownTextView;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_reconnect);
+        // mCountDownTextView = (TextView) findViewById(R.id.countDownTV);
+
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        bindService(new Intent(this, CommunicationService.class), mConnection,
+                Context.BIND_IMPORTANT);
+
+        final Server desiredServer = getIntent().getParcelableExtra("server");
+
+        IntentFilter aFilter = new IntentFilter();
+
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        mBroadcastProcessor.addToFilter(aFilter);
+
+        LocalBroadcastManager.getInstance(this).registerReceiver(mListener,
+                aFilter);
+
+        getSupportActionBar().setTitle(desiredServer.getName());
+
+        // TODO Connection to desired server
+        // Create a countdown clock for 10 seconds, then double the delay
+        // with every failure. Until it reaches 1min. Like Gmail retry
+
+    }
+
+    private BroadcastReceiver mListener = new BroadcastReceiver() {
+
+        @Override
+        public void onReceive(Context aContext, Intent aIntent) {
+            mBroadcastProcessor.onReceive(aContext, aIntent);
+        }
+    };
+
+    private ServiceConnection mConnection = new ServiceConnection() {
+
+        @Override
+        public void onServiceConnected(ComponentName aClassName,
+                IBinder aService) {
+            mCommunicationService = ((CommunicationService.CBinder) aService)
+                    .getService();
+
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName aClassName) {
+            mCommunicationService = null;
+        }
+    };
+
+    @Override
+    public void onBackPressed() {
+        Intent aIntent = new Intent(this, SelectorActivity.class);
+        aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        startActivity(aIntent);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            onBackPressed();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
     }
 
 }
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Server.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Server.java
index 77e6eb3..503f87a 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Server.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Server.java
@@ -8,7 +8,10 @@
  */
 package org.libreoffice.impressremote.communication;
 
-public class Server {
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class Server implements Parcelable {
 
     public enum Protocol {
         NETWORK, BLUETOOTH
@@ -56,6 +59,36 @@
     public String toString() {
         return getClass().getName() + '@' + Integer.toHexString(hashCode()) + ":{" + mAddress + "," + mName + "}";
     }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeString(mAddress);
+        out.writeString(mName);
+        out.writeString(mProtocol.name());
+        out.writeLong(mTimeDiscovered);
+    }
+
+    public static final Parcelable.Creator<Server> CREATOR = new Parcelable.Creator<Server>() {
+        public Server createFromParcel(Parcel in) {
+            return new Server(in);
+        }
+
+        public Server[] newArray(int size) {
+            return new Server[size];
+        }
+    };
+
+    private Server(Parcel in) {
+        mAddress = in.readString();
+        mName = in.readString();
+        mProtocol = Protocol.valueOf(in.readString());
+        mTimeDiscovered = in.readLong();
+    }
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

-- 
To view, visit https://gerrit.libreoffice.org/3366
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I424a470aa02b0c74b28cb9f9ba79489aa0d4ab1b
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Siqi LIU <me at siqi.fr>



More information about the LibreOffice mailing list