package com.beem.project.beem.ui;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import com.beem.project.beem.BeemApplication;
import com.beem.project.beem.R;
import com.beem.project.beem.service.Contact;
import com.beem.project.beem.service.Message;
import com.beem.project.beem.service.aidl.IChat;
import com.beem.project.beem.service.aidl.IChatManager;
import com.beem.project.beem.service.aidl.IChatManagerListener;
import com.beem.project.beem.service.aidl.IMessageListener;
import com.beem.project.beem.service.aidl.IXmppFacade;
/**
* This activity class provides the view for instant messaging after selecting a correspondant.
*
* @author barbu
*/
public class SendIM extends Activity implements OnClickListener, OnKeyListener {
/**
* Listener for chat creation. (maybe not necessary)
*
* @author darisk
*/
private class OnChatListener extends IChatManagerListener.Stub {
/**
* {@inheritDoc}
*/
@Override
public void chatCreated(IChat chat, boolean locally) throws RemoteException {
Log.i("LOG", "chatCreated");
}
}
/**
* Listener for new chat messages.
*
* @author darisk
*/
private class OnMessageListener extends IMessageListener.Stub {
/**
* {@inheritDoc}
*/
@Override
public void processMessage(IChat chat, Message msg) throws RemoteException {
if (chat != mChat)
return;
final Message m = msg;
mHandler.post(new Runnable() {
@Override
public void run() {
if (m.getBody() != null) {
if (mSpeak == 2)
mText.append(m.getBody() + "\n");
else {
String str = String.format(getString(R.string.SendIMSays), m.getFrom());
mText.append(str);
mText.append(m.getBody() + "\n");
}
mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
mToSend.requestFocus();
mSpeak = 2;
}
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void stateChanged(IChat chat) throws RemoteException {
// TODO: a integrer dans l'ui
// Log.d(TAG, "state changed");
}
}
private static final String TAG = "SEND_IM";
private EditText mToSend;
private SendIMDialogSmiley mSmyDialog;
private SharedPreferences mSet;
private BeemApplication mBeemApplication;
private Handler mHandler;
private IXmppFacade mService;
private Contact mContact;
private IChatManager mChatManager;
private IChatManagerListener mChatManagerListener;
private IMessageListener mMessageListener;
private IChat mChat;
private TextView mText;
private TextView mLogin;
private ScrollView mScrolling;
private char mSpeak;
/**
* Constructor.
*/
public SendIM() {
super();
}
/**
* {@inheritDoc}
*/
@Override
public void onClick(View view) {
sendText();
}
/**
* {@inheritDoc}
*/
@Override
protected void onCreate(Bundle saveBundle) {
super.onCreate(saveBundle);
mHandler = new Handler();
mChatManagerListener = new OnChatListener();
mMessageListener = new OnMessageListener();
mBeemApplication = BeemApplication.getApplication(this);
setContentView(R.layout.sendim);
mToSend = (EditText) findViewById(R.id.userText);
mSet = getSharedPreferences("lol", MODE_PRIVATE);
mSmyDialog = new SendIMDialogSmiley(this, mSet);
mToSend.setOnClickListener(this);
mToSend.setOnKeyListener(this);
mLogin = (TextView) findViewById(R.id.sendimlogin);
// mContact = getIntent().getParcelableExtra("contact");
mContact = new Contact(getIntent().getData());
setViewHeader();
mText = (TextView) findViewById(R.id.sendimlist);
mScrolling = (ScrollView) findViewById(R.id.sendimscroll);
}
/**
* {@inheritDoc}
*/
@Override
public final boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.sendimmenu, menu);
return true;
}
/**
* {@inheritDoc}
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (mChatManager != null) {
try {
mChatManager.removeChatCreationListener(mChatManagerListener);
// TODO trouver quand detruire le chat
// mChatManager.destroyChat(mChat);
} catch (RemoteException e) {
Log.e(TAG, "mchat manager and SendIM destroy", e);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
sendText();
return true;
default:
return false;
}
}
return false;
}
/**
* {@inheritDoc}
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mContact = new Contact(intent.getData());
setViewHeader();
}
/**
* {@inheritDoc}
*/
@Override
public final boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.sendim_smiley:
mSmyDialog.show();
return true;
default:
return false;
}
}
/**
* {@inheritDoc}
*/
@Override
protected void onPause() {
super.onPause();
try {
mChat.setOpen(false);
} catch (RemoteException e) {
Log.d(TAG, "Error while closing chat", e);
}
}
/**
* {@inheritDoc}
*/
@Override
protected void onResume() {
super.onResume();
mBeemApplication = BeemApplication.getApplication(this);
if (!mBeemApplication.isConnected())
mBeemApplication.startBeemService();
mBeemApplication.callWhenConnectedToServer(mHandler, new Runnable() {
@Override
public void run() {
mService = mBeemApplication.getXmppFacade();
try {
if (mChatManager == null) {
mChatManager = mService.getChatManager();
mChatManager.addChatCreationListener(mChatManagerListener);
}
switchChat(mContact);
} catch (RemoteException e) {
Log.e(TAG, "Error during chat manager creation", e);
}
}
});
}
/**
* {@inheritDoc}
*/
@Override
protected void onStart() {
super.onStart();
// TODO cancel the notification if any
if (mContact == null)
mContact = getIntent().getParcelableExtra("contact");
mService = mBeemApplication.getXmppFacade();
setViewHeader();
}
/**
* {@inheritDoc}
*/
@Override
protected void onStop() {
super.onStop();
try {
mChat.setOpen(false);
} catch (RemoteException e) {
Log.d(TAG, "mchat open false", e);
}
mBeemApplication.unbindBeemService();
}
/**
* Send a message to the contact over the XMPP connection. Also display it on activity view.
* TODO : Gerer l'exception si la connexion se coupe pendant la conversation
*/
private void sendText() {
String text = mToSend.getText().toString();
if (!text.equals("")) {
Message msg = new Message(mContact.getJID(), Message.MSG_TYPE_CHAT);
msg.setBody(text);
try {
mChat.sendMessage(msg);
if (mSpeak != 1)
mText.append(getString(R.string.SendIMYouSay) + text + '\n');
else
mText.append(text + "\n");
mToSend.setText(null);
mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
mToSend.requestFocus();
mSpeak = 1;
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Set the header information in the window.
*/
private void setViewHeader() {
Drawable avatar = getResources().getDrawable(R.drawable.avatar);
ImageView imgV = (ImageView) findViewById(R.id.sendimavatar);
imgV.setImageDrawable(avatar);
mLogin = (TextView) findViewById(R.id.sendimlogin);
mLogin.setText(mContact.getJID());
TextView status = (TextView) findViewById(R.id.sendimstatus);
status.setTextSize(12);
mLogin.setTextColor(getResources().getColor(R.color.white));
String statmsg = mContact.getMsgState();
if (statmsg != null)
status.setText(statmsg);
}
/**
* Show the message history.
*
* @param messages
* list of message to display
*/
private void showMessageList(List<Message> messages) {
mText.setText("");
mSpeak = 0;
for (Message message : messages) {
String from = message.getFrom();
if (from == null) {
if (mSpeak != 1)
mText.append(getString(R.string.SendIMYouSay));
mSpeak = 1;
} else {
if (mSpeak != 2) {
String str = String.format(getString(R.string.SendIMSays), from);
mText.append(str);
}
mSpeak = 2;
}
mText.append(message.getBody() + '\n');
}
mScrolling.fullScroll(ScrollView.FOCUS_DOWN);
}
/**
* Change the correspondant of the chat.
*
* @param newContact
* New contact to chat with
* @throws RemoteException
* if an errors occurs in the connection with the service
*/
private void switchChat(Contact newContact) throws RemoteException {
if (mChat != null)
mChat.setOpen(false);
mChat = mChatManager.createChat(newContact, mMessageListener);
showMessageList(mChat.getMessages());
mChat.setOpen(true);
mContact = newContact;
mToSend.requestFocus();
}
}