# HG changeset patch # User Nikita Kozlov # Date 1254071281 -7200 # Node ID 5031fb756b2934ef4d998521f6d83fab7a54e6cf # Parent f3f17082141749b29a12737b79796aeaae8dd20a gestion de ConnectionClosedOnError diff -r f3f170821417 -r 5031fb756b29 AndroidManifest.xml --- 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" /> - - + diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/BeemService.java --- 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(); } diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/service/XmppConnectionAdapter.java --- 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(); } /** diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/AddContact.java --- 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 mGroup = new ArrayList(); 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); } /** diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/ChangeStatus.java --- 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); } /** diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/ContactList.java --- 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); diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/Login.java --- 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 diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/SendIM.java --- 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); } diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/ui/Settings.java --- 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 diff -r f3f170821417 -r 5031fb756b29 src/com/beem/project/beem/utils/BeemBroadcastReceiver.java --- 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; } }