diff options
author | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2012-09-18 11:14:04 +0200 |
---|---|---|
committer | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2012-09-18 11:16:23 +0200 |
commit | 4aed4eb1ca76ed5fe52160a1b5cba70df816729d (patch) | |
tree | 6cc66d36eec51035c8305761496ddc4a8cf48f7b /android | |
parent | 988948cb8f94ca791baaa6374493b93b789ba3e9 (diff) |
Further improvements to connection and feedback.
Change-Id: I04c48ad3d465e132ea9adaf840e9f858a7096794
Diffstat (limited to 'android')
6 files changed, 163 insertions, 216 deletions
diff --git a/android/sdremote/res/values/strings.xml b/android/sdremote/res/values/strings.xml index 4f576769aaa5..3a4a14184e86 100644 --- a/android/sdremote/res/values/strings.xml +++ b/android/sdremote/res/values/strings.xml @@ -25,7 +25,9 @@ <string name="selector_noservers">Searching for computers…</string> <string name="selector_delete">Remove server</string> <string name="selector_choose_a_computer">Choose a Computer</string> - <string name="selector_dialog_connecting">Attempting to connect to {0}...</string> + <string name="selector_dialog_connecting">Attempting to connect to {0}…</string> + <string name="selector_dialog_connectionfailed">Impress Remote couldn"''"t connect to {0}.</string> + <string name="selector_dialog_connectionfailed_ok">OK</string> <string name="pairing_instructions_1">In Impress, click on the "Slideshow" menu and select "Impress Remote".</string> <string name="pairing_instructions_2_deviceName">Choose \"{0}\" as your device.</string> <string name="pairing_instructions_3">Then input this PIN:</string> diff --git a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java index 9fcd13e5201a..bf466f43cc9f 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java +++ b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java @@ -10,38 +10,29 @@ package org.libreoffice.impressremote; 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; public class PairingActivity extends SherlockActivity { - private CommunicationService mCommunicationService; - private TextView mPinText; private ActivityChangeBroadcastProcessor mBroadcastProcessor; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { 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( - CommunicationService.MSG_PAIRING_STARTED); - aFilter.addAction(CommunicationService.MSG_PAIRING_SUCCESSFUL); + IntentFilter aFilter = new IntentFilter(); mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this); mBroadcastProcessor.addToFilter(aFilter); @@ -51,66 +42,23 @@ public class PairingActivity extends SherlockActivity { getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - unbindService(mConnection); - } - - private ServiceConnection mConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName aClassName, - IBinder aService) { - setContentView(R.layout.activity_pairing); - mPinText = (TextView) findViewById(R.id.pairing_pin); - mCommunicationService = ((CommunicationService.CBinder) aService) - .getService(); - ((TextView) findViewById(R.id.pairing_instruction2_deviceName)) - .setText(MessageFormat - .format(getResources() - .getString(R.string.pairing_instructions_2_deviceName), - CommunicationService - .getDeviceName())); - - if (mCommunicationService.getState() == State.CONNECTING) { - mPinText.setText(mCommunicationService.getPairingPin()); - getSupportActionBar().setTitle( - mCommunicationService.getPairingDeviceName()); - } + String aPin = getIntent().getStringExtra("PIN"); + String aServerName = getIntent().getStringExtra("SERVERNAME"); - } + ((TextView) findViewById(R.id.pairing_pin)).setText(aPin); + ((TextView) findViewById(R.id.pairing_instruction2_deviceName)) + .setText(MessageFormat + .format(getResources() + .getString(R.string.pairing_instructions_2_deviceName), + aServerName)); - @Override - public void onServiceDisconnected(ComponentName aClassName) { - mCommunicationService = null; - } - }; + getSupportActionBar().setTitle(aServerName); + } private BroadcastReceiver mListener = new BroadcastReceiver() { @Override public void onReceive(Context aContext, Intent aIntent) { - if (mCommunicationService == null) { - return; - } - if (aIntent.getAction().equals( - CommunicationService.MSG_PAIRING_STARTED)) { - String aPin = aIntent.getStringExtra("PIN"); - - mPinText.setText(aPin); - if (mCommunicationService != null) - getSupportActionBar().setTitle( - mCommunicationService - .getPairingDeviceName()); - // refreshLists(); - } else if (aIntent.getAction().equals( - CommunicationService.MSG_PAIRING_SUCCESSFUL)) { - Intent nIntent = new Intent(PairingActivity.this, - StartPresentationActivity.class); - startActivity(nIntent); - } mBroadcastProcessor.onReceive(aContext, aIntent); } }; diff --git a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java index 0803045fcac7..f2930c0a5ead 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java +++ b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java @@ -23,6 +23,7 @@ import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; @@ -63,6 +64,7 @@ public class SelectorActivity extends SherlockActivity { IntentFilter aFilter = new IntentFilter( CommunicationService.MSG_SERVERLIST_CHANGED); + aFilter.addAction(CommunicationService.STATUS_CONNECTION_FAILED); mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this); mBroadcastProcessor.addToFilter(aFilter); @@ -204,6 +206,32 @@ public class SelectorActivity extends SherlockActivity { CommunicationService.MSG_SERVERLIST_CHANGED)) { refreshLists(); return; + } else if (aIntent.getAction().equals( + CommunicationService.STATUS_CONNECTION_FAILED)) { + if (mProgressDialog != null) { + mProgressDialog.dismiss(); + + 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(); + } } mBroadcastProcessor.onReceive(aContext, aIntent); @@ -318,9 +346,14 @@ public class SelectorActivity extends SherlockActivity { mProgressDialog = ProgressDialog.show(SelectorActivity.this, "", aDialogText, true); - // Intent aIntent = new Intent(SelectorActivity.this, - // PairingActivity.class); - // startActivity(aIntent); + mProgressDialog.setCancelable(true); + mProgressDialog.setOnCancelListener(new OnCancelListener() { + + @Override + public void onCancel(DialogInterface dialog) { + mCommunicationService.disconnect(); + } + }); } } diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java index 740602205043..ba8cc9887a7a 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java @@ -9,6 +9,7 @@ package org.libreoffice.impressremote.communication; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.util.UUID; @@ -27,101 +28,57 @@ public class BluetoothClient extends Client { private boolean mBluetoothWasEnabled; private BluetoothAdapter mAdapter; + private BluetoothSocket mSocket; public BluetoothClient(Server aServer, CommunicationService aCommunicationService, - Receiver aReceiver, boolean aBluetoothWasEnabled) { + Receiver aReceiver, boolean aBluetoothWasEnabled) + throws IOException { super(aServer, aCommunicationService, aReceiver); - try { - mAdapter = BluetoothAdapter.getDefaultAdapter(); - mBluetoothWasEnabled = aBluetoothWasEnabled; - if (!mBluetoothWasEnabled) { - mAdapter.enable(); - } - - BluetoothDevice aDevice = mAdapter.getRemoteDevice(aServer - .getAddress()); - mAdapter.cancelDiscovery(); - BluetoothSocket aSocket = aDevice - .createRfcommSocketToServiceRecord(UUID - .fromString("00001101-0000-1000-8000-00805F9B34FB")); - aSocket.connect(); - // mSocket = aSocket; - System.out.println("Connected"); + mAdapter = BluetoothAdapter.getDefaultAdapter(); + mBluetoothWasEnabled = aBluetoothWasEnabled; + if (!mBluetoothWasEnabled) { + mAdapter.enable(); + } - mInputStream = aSocket.getInputStream(); - mReader = new BufferedReader(new InputStreamReader(mInputStream, - CHARSET)); - mOutputStream = aSocket.getOutputStream(); + BluetoothDevice aDevice = mAdapter + .getRemoteDevice(aServer.getAddress()); + mAdapter.cancelDiscovery(); + mSocket = aDevice.createRfcommSocketToServiceRecord(UUID + .fromString("00001101-0000-1000-8000-00805F9B34FB")); + mSocket.connect(); + // mSocket = aSocket; + System.out.println("Connected"); - // mOutputStream.write(20); - // mOutputStream.write(20); - // mOutputStream.write(20); - // mOutputStream.flush(); - // System.out.println("reading"); - // while (true) { - // System.out.println(mInputStream.read()); - // } - String aTemp = mReader.readLine(); - System.out.println("SF:waited"); - if (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) { - return; - } - while (mReader.readLine().length() != 0) { - // Get rid of extra lines - } - Intent aIntent = new Intent( - CommunicationService.MSG_PAIRING_SUCCESSFUL); - LocalBroadcastManager.getInstance(mCommunicationService) - .sendBroadcast(aIntent); - startListening(); - // Pairing. - // Random aRandom = new Random(); - // String aPin = "" + (aRandom.nextInt(9000) + 1000); - // while (aPin.length() < 4) { - // aPin = "0" + aPin; // Add leading zeros if necessary - // } - // Intent aIntent = new Intent( - // CommunicationService.MSG_PAIRING_STARTED); - // aIntent.putExtra("PIN", aPin); - // mPin = aPin; - // LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent); - // // 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... - // System.out.println("SF:waiting"); - // String aTemp = mReader.readLine(); - // System.out.println("SF:waited"); - // if (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) { - // return; - // } else { - // - // } - // while (mReader.readLine().length() != 0) { - // // Get rid of extra lines - // System.out.println("SF: empty line"); - // } - // System.out.println("SD: empty"); - // startListening(); + mInputStream = mSocket.getInputStream(); + mReader = new BufferedReader(new InputStreamReader(mInputStream, + CHARSET)); + mOutputStream = mSocket.getOutputStream(); - } catch (Exception e) { - e.printStackTrace(); + String aTemp = mReader.readLine(); + System.out.println("SF:waited"); + if (!aTemp.equals("LO_SERVER_SERVER_PAIRED")) { + return; } + while (mReader.readLine().length() != 0) { + // Get rid of extra lines + } + Intent aIntent = new Intent(CommunicationService.MSG_PAIRING_SUCCESSFUL); + LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast( + aIntent); + startListening(); } @Override public void closeConnection() { - // try { - // if (mSocket != null) - // mSocket.close(); - // } catch (IOException e) { - // // TODO Auto-generated catch block - // e.printStackTrace(); - // } + try { + if (mSocket != null) + mSocket.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } protected void onDisconnect() { diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java index 085cdff98b9f..511f07f335b1 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java @@ -8,6 +8,7 @@ */ package org.libreoffice.impressremote.communication; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -22,6 +23,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Binder; import android.os.IBinder; +import android.support.v4.content.LocalBroadcastManager; public class CommunicationService extends Service implements Runnable { @@ -88,16 +90,27 @@ public class CommunicationService extends Service implements Runnable { } if (mStateDesired == State.CONNECTED) { mState = State.CONNECTING; - switch (mServerDesired.getProtocol()) { - case NETWORK: - mClient = new NetworkClient(mServerDesired, this, - mReceiver); - break; - case BLUETOOTH: - mClient = new BluetoothClient(mServerDesired, this, - mReceiver, - mBluetoothPreviouslyEnabled); - break; + try { + switch (mServerDesired.getProtocol()) { + case NETWORK: + mClient = new NetworkClient(mServerDesired, + this, mReceiver); + break; + case BLUETOOTH: + mClient = new BluetoothClient(mServerDesired, + this, mReceiver, + mBluetoothPreviouslyEnabled); + break; + } + } catch (IOException e) { + e.printStackTrace(); + mClient = null; + mState = State.DISCONNECTED; + Intent aIntent = new Intent( + CommunicationService.STATUS_CONNECTION_FAILED); + LocalBroadcastManager.getInstance(this) + .sendBroadcast(aIntent); + return; } mTransmitter = new Transmitter(mClient); mState = State.CONNECTED; @@ -194,6 +207,8 @@ public class CommunicationService extends Service implements Runnable { public static final String STATUS_PAIRING_PINVALIDATION = "STATUS_PAIRING_PINVALIDATION"; + public static final String STATUS_CONNECTION_FAILED = "STATUS_CONNECTION_FAILED"; + private Transmitter mTransmitter; private Client mClient; diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java index f875a056db38..09bf16050770 100644 --- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java +++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java @@ -33,66 +33,58 @@ public class NetworkClient extends Client { public NetworkClient(Server aServer, CommunicationService aCommunicationService, - Receiver aReceiver) { + Receiver aReceiver) throws UnknownHostException, + IOException { super(aServer, aCommunicationService, aReceiver); - try { - mName = aServer.getName(); - mSocket = new Socket(aServer.getAddress(), PORT); - mInputStream = mSocket.getInputStream(); - mReader = new BufferedReader(new InputStreamReader(mInputStream, - CHARSET)); - mOutputStream = mSocket.getOutputStream(); - // Pairing. - String aPin = setupPin(aServer); - Intent aIntent = new Intent( - CommunicationService.MSG_PAIRING_STARTED); - aIntent.putExtra("PIN", aPin); - mPin = aPin; - LocalBroadcastManager.getInstance(mCommunicationService) - .sendBroadcast(aIntent); - // 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(); - - 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); - mPin = aPin; - LocalBroadcastManager.getInstance(mCommunicationService) - .sendBroadcast(aIntent); - while (mReader.readLine().length() != 0) { - // Read off empty lines - } - aTemp = mReader.readLine(); - } else { - return; + mName = aServer.getName(); + mSocket = new Socket(aServer.getAddress(), PORT); + mInputStream = mSocket.getInputStream(); + mReader = new BufferedReader(new InputStreamReader(mInputStream, + CHARSET)); + mOutputStream = mSocket.getOutputStream(); + // Pairing. + String aPin = setupPin(aServer); + Intent aIntent = new Intent(CommunicationService.MSG_PAIRING_STARTED); + aIntent.putExtra("PIN", aPin); + mPin = aPin; + LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast( + aIntent); + // 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(); + + 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); + aIntent = new Intent(CommunicationService.MSG_PAIRING_SUCCESSFUL); + LocalBroadcastManager.getInstance(mCommunicationService).sendBroadcast( + aIntent); - while (mReader.readLine().length() != 0) { - // Get rid of extra lines - System.out.println("SF: empty line"); - } - System.out.println("SD: empty"); - startListening(); - } catch (UnknownHostException e) { - // TODO Tell the user we have a problem - e.printStackTrace(); - } catch (IOException e) { - // TODO As above - e.printStackTrace(); + while (mReader.readLine().length() != 0) { + // Get rid of extra lines + System.out.println("SF: empty line"); } + System.out.println("SD: empty"); + startListening(); } |