gestion de ConnectionClosedOnError
authorNikita Kozlov <nikita@beem-project.com>
Sun, 27 Sep 2009 19:08:01 +0200
changeset 412 5031fb756b29
parent 411 f3f170821417
child 413 a6ad4afc4fd6
child 416 ca334bc39396
gestion de ConnectionClosedOnError
AndroidManifest.xml
src/com/beem/project/beem/BeemService.java
src/com/beem/project/beem/service/XmppConnectionAdapter.java
src/com/beem/project/beem/ui/AddContact.java
src/com/beem/project/beem/ui/ChangeStatus.java
src/com/beem/project/beem/ui/ContactList.java
src/com/beem/project/beem/ui/Login.java
src/com/beem/project/beem/ui/SendIM.java
src/com/beem/project/beem/ui/Settings.java
src/com/beem/project/beem/utils/BeemBroadcastReceiver.java
--- a/AndroidManifest.xml	Sun Sep 27 17:51:06 2009 +0200
+++ b/AndroidManifest.xml	Sun Sep 27 19:08:01 2009 +0200
@@ -40,8 +40,7 @@
 					android:name="com.beem.project.beem.service.XmppConnectionAdapter.CONNECTION_CLOSED" />
 			</intent-filter>
 		</activity>
-		<activity android:name=".ui.Subscription" android:label="@string/app_name" />
-		<activity android:name=".ui.EditSettings" android:label="@string/edit_settings_name">
+		<activity android:name=".ui.Subscription" android:label="@string/app_name">
 			<intent-filter android:label="Beem Connection">
 				<action
 					android:name="com.beem.project.beem.service.XmppConnectionAdapter.CONNECTION_CLOSED" />
--- a/src/com/beem/project/beem/BeemService.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/BeemService.java	Sun Sep 27 19:08:01 2009 +0200
@@ -101,6 +101,7 @@
     
     @Override
     public boolean onUnbind(Intent intent) {
+	Log.e("BEEMSERVICE", "ONUNBIND()");
 	if (!mConnection.getAdaptee().isConnected()) {
 	    this.stopSelf();
 	}	    
--- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Sun Sep 27 19:08:01 2009 +0200
@@ -21,13 +21,14 @@
 import android.os.RemoteException;
 import android.util.Log;
 
+import com.beem.project.beem.BeemService;
 import com.beem.project.beem.R;
-import com.beem.project.beem.BeemService;
 import com.beem.project.beem.service.aidl.IBeemConnectionListener;
 import com.beem.project.beem.service.aidl.IChatManager;
 import com.beem.project.beem.service.aidl.IRoster;
 import com.beem.project.beem.service.aidl.IXmppConnection;
 import com.beem.project.beem.ui.Subscription;
+import com.beem.project.beem.utils.BeemBroadcastReceiver;
 
 /**
  * This class implements an adapter for XMPPConnection.
@@ -38,7 +39,7 @@
     /**
      * Beem connection closed Intent name.
      */
-    public static final String BEEM_CONNECTION_CLOSED = "BeemConnectionClosed";
+    
     private static final String TAG = "XMPPConnectionAdapter";
     private XMPPConnection mAdaptee;
     private IChatManager mChatManager;
@@ -273,7 +274,9 @@
 	public void connectionClosed() {
 	    Log.d(TAG, "closing connection");
 	    mRoster = null;
-	    mService.sendBroadcast(new Intent(BEEM_CONNECTION_CLOSED));
+	    Intent intent = new Intent(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED);
+	    intent.putExtra("message", mService.getString(R.string.BeemBroadcastReceiverDisconnect));
+	    mService.sendBroadcast(intent);
 	    mService.stopSelf();
 	}
 
@@ -281,23 +284,13 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void connectionClosedOnError(Exception arg0) {
+	public void connectionClosedOnError(Exception exception) {
 	    Log.d(TAG, "connectionClosedOnError");
 	    mRoster = null;
-	    final int n = mRemoteConnListeners.beginBroadcast();
-
-	    for (int i = 0; i < n; i++) {
-		IBeemConnectionListener listener = mRemoteConnListeners.getBroadcastItem(i);
-		try {
-		    if (listener != null)
-			listener.connectionClosedOnError();
-		} catch (RemoteException e) {
-		    // The RemoteCallbackList will take care of removing the
-		    // dead listeners.
-		    Log.w(TAG, "Error while triggering remote connection listeners", e);
-		}
-	    }
-	    mRemoteConnListeners.finishBroadcast();
+	    Intent intent = new Intent(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED);
+	    intent.putExtra("message", exception.getMessage());
+	    mService.sendBroadcast(intent);
+	    mService.stopSelf();
 	}
 
 	/**
--- a/src/com/beem/project/beem/ui/AddContact.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/AddContact.java	Sun Sep 27 19:08:01 2009 +0200
@@ -5,7 +5,6 @@
 import java.util.regex.Pattern;
 
 import android.app.Activity;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -22,7 +21,6 @@
 
 import com.beem.project.beem.BeemService;
 import com.beem.project.beem.R;
-import com.beem.project.beem.service.XmppConnectionAdapter;
 import com.beem.project.beem.service.aidl.IXmppFacade;
 import com.beem.project.beem.utils.BeemBroadcastReceiver;
 /**
@@ -36,7 +34,7 @@
     private final List<String> mGroup = new ArrayList<String>();
     private IXmppFacade mXmppFacade;
     private final ServiceConnection mServConn = new BeemServiceConnection();
-    private BroadcastReceiver mReceiver;
+    private BeemBroadcastReceiver mReceiver;
 
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
@@ -56,16 +54,7 @@
 	setContentView(R.layout.addcontact);
 	Button ok = (Button) findViewById(R.id.addc_ok);
 	ok.setOnClickListener(mOkListener);
-	mReceiver = new BeemBroadcastReceiver();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void onStop() {
-	super.onStop();
-	unbindService(mServConn);
+	mReceiver = new BeemBroadcastReceiver(mServConn);
     }
 
     /**
@@ -74,8 +63,9 @@
     @Override
     protected void onResume() {
 	super.onResume();
-	this.registerReceiver(mReceiver, new IntentFilter(XmppConnectionAdapter.BEEM_CONNECTION_CLOSED));
+	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
 	bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
+	mReceiver.setBinded();
     }
 
     /**
@@ -85,6 +75,8 @@
     protected void onPause() {
 	super.onPause();
 	this.unregisterReceiver(mReceiver);
+	if (mReceiver.isBinded())
+	    unbindService(mServConn);
     }
 
     /**
--- a/src/com/beem/project/beem/ui/ChangeStatus.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/ChangeStatus.java	Sun Sep 27 19:08:01 2009 +0200
@@ -1,7 +1,6 @@
 package com.beem.project.beem.ui;
 
 import android.app.Activity;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -21,7 +20,6 @@
 
 import com.beem.project.beem.BeemService;
 import com.beem.project.beem.R;
-import com.beem.project.beem.service.XmppConnectionAdapter;
 import com.beem.project.beem.service.aidl.IXmppFacade;
 import com.beem.project.beem.utils.BeemBroadcastReceiver;
 import com.beem.project.beem.utils.Status;
@@ -54,7 +52,7 @@
     private IXmppFacade mXmppFacade;
     private final ServiceConnection mServConn = new BeemServiceConnection();
     private final OnClickListener mOnClickOk = new MyOnClickListener();
-    private BroadcastReceiver mReceiver;
+    private BeemBroadcastReceiver mReceiver;
 
     /**
      * constructor.
@@ -123,7 +121,7 @@
 	mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 	mSpinner.setAdapter(mAdapter);
 	mToast = Toast.makeText(this, R.string.ChangeStatusOk, Toast.LENGTH_LONG);
-	mReceiver = new BeemBroadcastReceiver();
+	mReceiver = new BeemBroadcastReceiver(mServConn);
 	mStatusText.setText(getPreferenceString(R.string.PreferenceStatusText));
 	mSpinner.setSelection(getPreferenceStatusIndex());
     }
@@ -132,19 +130,11 @@
      * {@inheritDoc}
      */
     @Override
-    protected void onDestroy() {
-	super.onDestroy();
-	unbindService(mServConn);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     protected void onResume() {
 	super.onResume();
 	bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
-	this.registerReceiver(mReceiver, new IntentFilter(XmppConnectionAdapter.BEEM_CONNECTION_CLOSED));
+	mReceiver.setBinded();
+	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
     }
 
     /**
@@ -154,6 +144,8 @@
     protected void onPause() {
 	super.onPause();
 	this.unregisterReceiver(mReceiver);
+	if (mReceiver.isBinded())
+	    unbindService(mServConn);
     }
 
     /**
--- a/src/com/beem/project/beem/ui/ContactList.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/ContactList.java	Sun Sep 27 19:08:01 2009 +0200
@@ -10,7 +10,6 @@
 import org.jivesoftware.smack.util.StringUtils;
 
 import android.app.Activity;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -21,6 +20,7 @@
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -39,7 +39,6 @@
 import com.beem.project.beem.R;
 import com.beem.project.beem.service.Contact;
 import com.beem.project.beem.service.PresenceAdapter;
-import com.beem.project.beem.service.XmppConnectionAdapter;
 import com.beem.project.beem.service.aidl.IBeemRosterListener;
 import com.beem.project.beem.service.aidl.IRoster;
 import com.beem.project.beem.service.aidl.IXmppFacade;
@@ -64,7 +63,7 @@
     private Handler mHandler;
     private IXmppFacade mXmppFacade;
     private final ServiceConnection mServConn = new BeemServiceConnection();
-    private BroadcastReceiver mReceiver;
+    private BeemBroadcastReceiver mReceiver;
 
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
@@ -87,7 +86,7 @@
 	mAdapterContactList = new BeemContactList(this);
 	mAdapterBanner = new BeemBanner(this);
 	mHandler = new Handler();
-	mReceiver = new BeemBroadcastReceiver();
+	mReceiver = new BeemBroadcastReceiver(mServConn);
     }
 
     /**
@@ -96,7 +95,7 @@
     @Override
     protected void onResume() {
 	super.onResume();
-	this.registerReceiver(mReceiver, new IntentFilter(XmppConnectionAdapter.BEEM_CONNECTION_CLOSED));
+	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
     }
 
     /**
@@ -159,6 +158,7 @@
     protected void onStart() {
 	super.onStart();
 	bindService(SERVICE_INTENT, mServConn, BIND_AUTO_CREATE);
+	mReceiver.setBinded();
     }
 
     /**
@@ -166,8 +166,10 @@
      */
     @Override
     protected void onStop() {
+	Log.d("CONTACTLIST","onStop");
 	super.onStop();
-	unbindService(mServConn);
+	if (mReceiver.isBinded())
+	    unbindService(mServConn);
     }
 
     /**
@@ -519,7 +521,7 @@
 			break;
 		    default:
 			imageDrawable = getResources().getDrawable(R.drawable.error);
-		    	break;
+		    break;
 		}
 		imgV.setImageDrawable(imageDrawable);
 
--- a/src/com/beem/project/beem/ui/Login.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/Login.java	Sun Sep 27 19:08:01 2009 +0200
@@ -171,6 +171,10 @@
 
 	@Override
 	public void connectionClosedOnError() throws RemoteException {
+	    mIsConnected = false;
+	    if (mXmppFacade != null) {
+		mXmppFacade = null;
+	    }
 	}
 
 	@Override
--- a/src/com/beem/project/beem/ui/SendIM.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/SendIM.java	Sun Sep 27 19:08:01 2009 +0200
@@ -5,7 +5,6 @@
 import org.jivesoftware.smack.util.StringUtils;
 
 import android.app.Activity;
-import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -35,7 +34,6 @@
 import com.beem.project.beem.service.Contact;
 import com.beem.project.beem.service.Message;
 import com.beem.project.beem.service.PresenceAdapter;
-import com.beem.project.beem.service.XmppConnectionAdapter;
 import com.beem.project.beem.service.aidl.IBeemRosterListener;
 import com.beem.project.beem.service.aidl.IChat;
 import com.beem.project.beem.service.aidl.IChatManager;
@@ -73,7 +71,7 @@
     private final ServiceConnection mServConn = new BeemServiceConnection();
     private IXmppFacade mXmppFacade;
     private TextView mStatusText;
-    private BroadcastReceiver mReceiver;
+    private BeemBroadcastReceiver mReceiver;
 
     private static final Intent SERVICE_INTENT = new Intent();
     static {
@@ -125,7 +123,7 @@
 	mScrolling = (ScrollView) findViewById(R.id.sendimscroll);
 	mStatusText = (TextView) findViewById(R.id.sendimstatus);
 	setViewHeader();
-	mReceiver = new BeemBroadcastReceiver();
+	mReceiver = new BeemBroadcastReceiver(mServConn);
     }
 
     /**
@@ -246,7 +244,8 @@
 	} catch (RemoteException e) {
 	    Log.d(TAG, "Error while closing chat", e);
 	}
-	unbindService(mServConn);
+	if (mReceiver.isBinded())
+	    unbindService(mServConn);
     }
 
     /**
@@ -255,8 +254,9 @@
     @Override
     protected void onResume() {
 	super.onResume();
-	this.registerReceiver(mReceiver, new IntentFilter(XmppConnectionAdapter.BEEM_CONNECTION_CLOSED));
+	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
 	bindService(new Intent(this, BeemService.class), mServConn, BIND_AUTO_CREATE);
+	mReceiver.setBinded();
 	mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
     }
 
--- a/src/com/beem/project/beem/ui/Settings.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/ui/Settings.java	Sun Sep 27 19:08:01 2009 +0200
@@ -13,7 +13,7 @@
 import android.view.MenuItem;
 
 import com.beem.project.beem.R;
-import com.beem.project.beem.service.XmppConnectionAdapter;
+import com.beem.project.beem.utils.BeemBroadcastReceiver;
 
 /**
  * This class represents an activity which allows the user to change his account or proxy parameters.
@@ -22,7 +22,7 @@
 public class Settings extends PreferenceActivity {
 
     private static final Intent SERVICE_INTENT = new Intent();
-    private BeemBroadcastReceiver mReceiver;
+    private SettingsBroadcastReceiver mReceiver;
 
     static {
 	SERVICE_INTENT.setComponent(new ComponentName("com.beem.project.beem", "com.beem.project.beem.BeemService"));
@@ -38,7 +38,7 @@
     public void onCreate(Bundle savedInstanceState) {
 	super.onCreate(savedInstanceState);
 	addPreferencesFromResource(R.layout.preferences);
-	mReceiver = new BeemBroadcastReceiver();
+	mReceiver = new SettingsBroadcastReceiver();
     }
 
     /**
@@ -56,7 +56,7 @@
     @Override
     public void onResume() {
 	super.onResume();
-	this.registerReceiver(mReceiver, new IntentFilter(XmppConnectionAdapter.BEEM_CONNECTION_CLOSED));
+	this.registerReceiver(mReceiver, new IntentFilter(BeemBroadcastReceiver.BEEM_CONNECTION_CLOSED));
     }
 
     /**
@@ -111,12 +111,11 @@
     /**
      * disconnect Broadcast receiver.
      */
-    private class BeemBroadcastReceiver extends BroadcastReceiver {
-
+    private class SettingsBroadcastReceiver extends BroadcastReceiver {
 	/**
 	 * Constructor.
 	 */
-	public BeemBroadcastReceiver() {
+	public SettingsBroadcastReceiver() {
 	}
 
 	@Override
--- a/src/com/beem/project/beem/utils/BeemBroadcastReceiver.java	Sun Sep 27 17:51:06 2009 +0200
+++ b/src/com/beem/project/beem/utils/BeemBroadcastReceiver.java	Sun Sep 27 19:08:01 2009 +0200
@@ -3,9 +3,9 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.ServiceConnection;
 import android.widget.Toast;
 
-import com.beem.project.beem.R;
 import com.beem.project.beem.ui.Login;
 
 /**
@@ -14,10 +14,16 @@
  */
 public class BeemBroadcastReceiver extends BroadcastReceiver {
 
+    public static final String BEEM_CONNECTION_CLOSED = "BeemConnectionClosed";
+    private ServiceConnection mService;
+    private boolean mIsBinded;
+    
     /**
      * constructor.
      */
-    public BeemBroadcastReceiver() {
+    public BeemBroadcastReceiver(ServiceConnection service) {
+	mService = service;
+	mIsBinded = false;
     }
 
     /**
@@ -25,7 +31,18 @@
      */
     @Override
     public void onReceive(Context context, Intent intent) {
+	context.unbindService(mService);
+	mIsBinded = false;
 	context.startActivity(new Intent(context, Login.class));
-	Toast.makeText(context, context.getString(R.string.BeemBroadcastReceiverDisconnect), Toast.LENGTH_LONG).show();
+	CharSequence message = intent.getCharSequenceExtra("message");	
+	Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
+    }
+    
+    public void setBinded() {
+	mIsBinded = true;
+    }
+
+    public boolean isBinded() {
+	return mIsBinded;
     }
 }