# HG changeset patch # User Da Risk # Date 1262967377 -3600 # Node ID aa1bad380eec3b7e8d283786d2eb3dc2c9ed64f6 # Parent fd6d31c4460e54d71129c5d2b8c7d7d15f604ed0# Parent d33917d9800e5ba2bd7ba6f2ade398b47dd5b492 merge diff -r d33917d9800e -r aa1bad380eec default.properties --- a/default.properties Fri Jan 08 16:37:15 2010 +0100 +++ b/default.properties Fri Jan 08 17:16:17 2010 +0100 @@ -10,5 +10,5 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-6 +target=android-5 apk-configurations= diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/service/LoginAsyncTask.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/beem/project/beem/service/LoginAsyncTask.java Fri Jan 08 17:16:17 2010 +0100 @@ -0,0 +1,122 @@ +/* + BEEM is a videoconference application on the Android Platform. + + Copyright (C) 2009 by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + This file is part of BEEM. + + BEEM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + BEEM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with BEEM. If not, see . + + Please send bug reports with examples or suggestions to + contact@beem-project.com or http://dev.beem-project.com/ + + Epitech, hereby disclaims all copyright interest in the program "Beem" + written by Frederic-Charles Barthelery, + Jean-Manuel Da Silva, + Nikita Kozlov, + Philippe Lago, + Jean Baptiste Vergely, + Vincent Veronis. + + Nicolas Sadirac, November 26, 2009 + President of Epitech. + + Flavien Astraud, November 26, 2009 + Head of the EIP Laboratory. + +*/ +package com.beem.project.beem.service; + +import android.os.AsyncTask; +import android.os.RemoteException; +import android.util.Log; +import com.beem.project.beem.service.aidl.IXmppConnection; +import com.beem.project.beem.service.aidl.IXmppFacade; + +/** + * This is an asynchronous task that will launch a connection to the XMPP server. + * @see android.os.AsyncTask + * @author Da Risk + */ +public class LoginAsyncTask extends AsyncTask { + + public static final String TAG = "BeemLoginTask"; + + public static final int STATE_CONNECTION_RUNNING = 1; + public static final int STATE_LOGIN_RUNNING = 2; + public static final int STATE_LOGIN_SUCCESS = 3; + public static final int STATE_LOGIN_FAILED = 4; + + private IXmppConnection mConnection; + private String mErrorMessage; + + /** + * Constructor. + */ + public LoginAsyncTask() { + } + + @Override + protected Boolean doInBackground(IXmppFacade... params) { + boolean result = true; + IXmppFacade facade = params[0]; + try { + publishProgress(STATE_CONNECTION_RUNNING); + mConnection = facade.createConnection(); + if (!mConnection.connect()) { + mErrorMessage = mConnection.getErrorMessage(); + return false; + } + publishProgress(STATE_LOGIN_RUNNING); + + if (!mConnection.login()) { + mErrorMessage = mConnection.getErrorMessage(); + publishProgress(STATE_LOGIN_FAILED); + return false; + } + publishProgress(STATE_LOGIN_SUCCESS); + } catch (RemoteException e) { + mErrorMessage= "Exception during connection :" + e; + result = false; + } + return result; + } + + /** + * Make sur to call the parent method when overriding this method. + */ + @Override + protected void onCancelled() { + try { + if (mConnection != null && mConnection.isAuthentificated()) { + mConnection.disconnect(); + } + } catch (RemoteException e) { + Log.d(TAG, "Remote exception", e); + } + } + + /** + * Get the error Message. + * @return the error message. null if no error + */ + public String getErrorMessage() { + return mErrorMessage; + } +} diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/service/Message.java --- a/src/com/beem/project/beem/service/Message.java Fri Jan 08 16:37:15 2010 +0100 +++ b/src/com/beem/project/beem/service/Message.java Fri Jan 08 17:16:17 2010 +0100 @@ -139,6 +139,7 @@ break; } this.mFrom = smackMsg.getFrom(); + //TODO better handling of error messages if (mType == MSG_TYPE_ERROR) { XMPPError er = smackMsg.getError(); String msg = er.getMessage(); diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/service/XmppConnectionAdapter.java --- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java Fri Jan 08 16:37:15 2010 +0100 +++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java Fri Jan 08 17:16:17 2010 +0100 @@ -100,6 +100,7 @@ private PrivacyListManagerAdapter mPrivacyListManager; private final BeemService mService; private final RemoteCallbackList mRemoteConnListeners = new RemoteCallbackList(); + private final SubscribePacketListener mSubscribePacketListener = new SubscribePacketListener(); private final ConnexionListenerAdapter mConListener = new ConnexionListenerAdapter(); @@ -159,6 +160,70 @@ mRemoteConnListeners.register(listen); } + @Override + public boolean connect() throws RemoteException { + if (mAdaptee.isConnected()) + return true; + else { + try { + mAdaptee.connect(); + mAdaptee.addConnectionListener(mConListener); + return true; + } catch (XMPPException e) { + Log.e(TAG, "Error while connecting", e); + if (!"".equals(e.getMessage())) + mErrorMsg = e.getMessage(); + else + mErrorMsg = e.toString(); + } + return false; + } + } + + @Override + public boolean login() throws RemoteException { + if (mAdaptee.isAuthenticated()) + return true; + try { + mAdaptee.login(mLogin, mPassword, mResource); + mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService); + mPrivacyListManager = new PrivacyListManagerAdapter(PrivacyListManager.getInstanceFor(mAdaptee)); + + this.initFeatures(); // pour declarer les features xmpp qu'on + // supporte + ChatStateManager.getInstance(mAdaptee); + + PacketFilter filter = new PacketFilter() { + + @Override + public boolean accept(Packet packet) { + if (packet instanceof Presence) { + Presence pres = (Presence) packet; + if (pres.getType() == Presence.Type.subscribe) + return true; + } + return false; + } + }; + + mAdaptee.addPacketListener(mSubscribePacketListener, filter); + + mService.resetStatus(); + mService.initJingle(mAdaptee); + + // triggerAsynchronousConnectEvent(); + changeStatus(Status.CONTACT_STATUS_AVAILABLE, mService.getServicePreference().getString("status_text", "")); + return true; + } catch (XMPPException e) { + Log.e(TAG, "Error while connecting", e); + if (!"".equals(e.getMessage())) + mErrorMsg = e.getMessage(); + else + mErrorMsg = e.toString(); + return false; + } + } + /** * {@inheritDoc} */ @@ -185,39 +250,8 @@ */ @Override public boolean connectSync() throws RemoteException { - try { - mAdaptee.connect(); - mAdaptee.addConnectionListener(mConListener); - mAdaptee.login(mLogin, mPassword, mResource); - - mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService); - mPrivacyListManager = new PrivacyListManagerAdapter(PrivacyListManager.getInstanceFor(mAdaptee)); - - this.initFeatures(); // pour declarer les features xmpp qu'on - // supporte - ChatStateManager.getInstance(mAdaptee); - - triggerAsynchronousConnectEvent(); - changeStatus(Status.CONTACT_STATUS_AVAILABLE, mService.getServicePreference().getString("status_text", "")); - return true; - } catch (XMPPException e) { - Log.d(TAG, "Error while connecting", e); - if (e.getXMPPError() != null && e.getXMPPError().getMessage() != null) { - mErrorMsg = e.getXMPPError().getMessage(); - Log.d(TAG, "XMPP Error " + e.getXMPPError().getCode() + "message :" + e.getXMPPError().getMessage()); - } else if (e.getStreamError() != null) { - mErrorMsg = e.getStreamError().toString(); - Log.d(TAG, "Stream Error " + e.getStreamError().getCode() + "message :" + e.getStreamError()); - } else if (e.getMessage() != null) { - // SASL !! - mErrorMsg = e.getMessage(); - Log.d(TAG, "Error " + e.getMessage()); - } else - mErrorMsg = "Error On Connection"; - mConListener.connectionFailed(mErrorMsg); - } catch (IllegalStateException e) { - mConListener.connectionFailed(e.getMessage()); - } + if (connect()) + return login(); return false; } @@ -281,7 +315,6 @@ mStatusNotification.setLatestEventInfo(mService, "Beem Status", text, PendingIntent.getActivity(mService, 0, new Intent(mService, ChangeStatus.class), 0)); mService.sendNotification(BeemService.NOTIFICATION_STATUS_ID, mStatusNotification); - } /** @@ -608,4 +641,31 @@ } } + /** + * This PacketListener will set a notification when you got a subscribtion request. + * @author Da Risk + */ + private class SubscribePacketListener implements PacketListener { + @Override + public void processPacket(Packet packet) { + if ( ! (packet instanceof Presence)) + return; + Presence p = (Presence) packet; + if (p.getType() != Presence.Type.subscribe) + return; + String from = p.getFrom(); + Notification notif = new Notification(android.R.drawable.stat_notify_more, mService.getString( + R.string.AcceptContactRequest, from), System.currentTimeMillis()); + notif.defaults = Notification.DEFAULT_ALL; + notif.flags = Notification.FLAG_AUTO_CANCEL; + Intent intent = new Intent(mService, Subscription.class); + intent.putExtra("from", from); + notif.setLatestEventInfo(mService, from, mService + .getString(R.string.AcceptContactRequestFrom, from), PendingIntent.getActivity(mService, 0, + intent, PendingIntent.FLAG_ONE_SHOT)); + int id = p.hashCode(); + mService.sendNotification(id, notif); + } + } + } diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/service/aidl/IXmppConnection.aidl --- a/src/com/beem/project/beem/service/aidl/IXmppConnection.aidl Fri Jan 08 16:37:15 2010 +0100 +++ b/src/com/beem/project/beem/service/aidl/IXmppConnection.aidl Fri Jan 08 17:16:17 2010 +0100 @@ -50,6 +50,10 @@ interface IXmppConnection { + boolean connect(); + + boolean login(); + boolean connectSync(); void connectAsync(); diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/ui/Chat.java --- a/src/com/beem/project/beem/ui/Chat.java Fri Jan 08 16:37:15 2010 +0100 +++ b/src/com/beem/project/beem/ui/Chat.java Fri Jan 08 17:16:17 2010 +0100 @@ -499,6 +499,7 @@ @Override public void run() { + //TODO gerer les messages de types error if (msg.getBody() != null && msg.getType() != Message.MSG_TYPE_ERROR) { MessageText lastMessage = mListMessages.size() != 0 ? mListMessages.get(mListMessages .size() - 1) : null; diff -r d33917d9800e -r aa1bad380eec src/com/beem/project/beem/ui/LoginAnim.java --- a/src/com/beem/project/beem/ui/LoginAnim.java Fri Jan 08 16:37:15 2010 +0100 +++ b/src/com/beem/project/beem/ui/LoginAnim.java Fri Jan 08 17:16:17 2010 +0100 @@ -63,6 +63,7 @@ import com.beem.project.beem.R; import com.beem.project.beem.service.aidl.IXmppConnection; import com.beem.project.beem.service.aidl.IXmppFacade; +import com.beem.project.beem.service.LoginAsyncTask; /** * This class is an activity which display an animation during the connection with the server. @@ -79,7 +80,7 @@ private Animation mRotateAnim; private final ServiceConnection mServConn = new LoginServiceConnection(); private IXmppFacade mXmppFacade; - private AsyncTask mTask; + private AsyncTask mTask; private Button mCancelBt; /** @@ -175,36 +176,12 @@ /** * Asynchronous class for connection. */ - class LoginTask extends AsyncTask { - - private IXmppConnection mConnection; - private String mMsg; + private class LoginTask extends LoginAsyncTask{ /** - * Constructor. - */ - LoginTask() { - } - - /* (non-Javadoc) - * @see android.os.AsyncTask#doInBackground(Params[]) + * Constructor. */ - @Override - protected Boolean doInBackground(IXmppFacade... params) { - boolean result = true; - IXmppFacade facade = params[0]; - try { - mConnection = facade.createConnection(); - if (!mConnection.isAuthentificated()) { - result = mConnection.connectSync(); - if (!result) - mMsg = mConnection.getErrorMessage(); - } - } catch (RemoteException e) { - mMsg = "Exception during connection"; - result = false; - } - return result; + LoginTask() { } /* (non-Javadoc) @@ -216,7 +193,7 @@ if (result == null || !result) { // Task cancelled or exception if (!result) { Intent i = new Intent(); - i.putExtra("message", mMsg); + i.putExtra("message", getErrorMessage()); LoginAnim.this.setResult(Activity.RESULT_CANCELED, i); } else LoginAnim.this.setResult(Activity.RESULT_CANCELED); @@ -229,18 +206,17 @@ } } + @Override + protected void onProgressUpdate(Integer ... values) { + Log.d(TAG, "onProgress " + values[0]); + } + /* (non-Javadoc) * @see android.os.AsyncTask#onCancelled() */ @Override protected void onCancelled() { - try { - if (mConnection != null && mConnection.isAuthentificated()) { - mConnection.disconnect(); - } - } catch (RemoteException e) { - Log.d(TAG, "Remote exception", e); - } + super.onCancelled(); LoginAnim.this.stopService(LoginAnim.SERVICE_INTENT); }