src/com/beem/project/beem/ui/SendIM.java
author nikita@nikita-rack
Thu, 09 Apr 2009 20:26:58 +0200
changeset 99 8de21ac527ce
parent 84 9a4dbd7fe546
child 101 ccc48305bdeb
permissions -rw-r--r--
revert pour refaire un push propre

package com.beem.project.beem.ui;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
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.ArrayAdapter;
import android.widget.EditText;

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;

/**
 * @author barbu This activity class provide the view for instant messaging
 *         after selecting a correspondant.
 */

public class SendIM extends ListActivity implements OnClickListener,
	OnKeyListener {
    private EditText mToSend;
    private ArrayList<String> mMessages = new ArrayList<String>();
    private ArrayAdapter<String> mAdapter;
    private SendIMDialogSmiley mSmyDialog;
    private SharedPreferences mSet;
    private SharedPreferences mGlobalSettings;
    private BeemApplication mBeemApplication;
    private Handler mHandler;
    private IXmppFacade mService = null;
    private Contact mContact;
    private IChatManager mChatManager;
    private IChatManagerListener mChatManagerListener;
    private IMessageListener mMessageListener;
    private IChat mChat;

    /**
     * Constructor.
     */
    public SendIM() {
	super();
    }

    /**
     * Overload of onCreate() Activity inherited function
     */
    @Override
    public 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);
	mGlobalSettings = getSharedPreferences(getString(R.string.PreferenceFileName), MODE_PRIVATE);

	mAdapter = new ArrayAdapter<String>(this, R.layout.messagelist,
		mMessages);
	setListAdapter(mAdapter);

	mToSend.setOnClickListener(this);
	mToSend.setOnKeyListener(this);

	mContact = getIntent().getParcelableExtra("contact");
    }

    @Override
    public void onStart() {
	super.onStart();
	mBeemApplication.startBeemService();
	mService = mBeemApplication.getXmppFacade();
	try {
	    mChatManager = mService.getChatManager();
	    mChatManager.addChatCreationListener(mChatManagerListener);
	    mChat = mChatManager.createChat(mContact, mMessageListener);
	} catch (RemoteException e) {
	    // TODO Auto-generated catch block
	    e.printStackTrace();
	}
    }

    /**
     * Abstract method inherited from OnClickListener
     */
    public void onClick(View view) {
	sendText();
    }

    /**
     * This method send a message to the server over the XMPP connection and
     * display it on activity view TODO : Exception si la connexion se coupe
     * pendant la conversation
     */
    private void sendText() {
	String text = mToSend.getText().toString();
	String from = mGlobalSettings.getString(getString(R.string.PreferenceJID), "You");
	if (!text.equals("")) {
	    Message msg = new Message(mContact.getJID(), Message.MSG_TYPE_CHAT);
	    msg.setBody(text);
	    try {
		mChat.sendMessage(msg);
	    } catch (RemoteException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	    mAdapter.add(from + getString(R.string.SendIMSays) + text);
	    mToSend.setText(null);
	}
    }

    /**
     * Abstract method inherited from OnKeyListener
     */
    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;
	    }
	}
	return false;
    }

    /**
     * Callback for menu creation.
     * 
     * @param menu
     *            the menu created
     * @return true on success, false otherwise
     */
    @Override
    public final boolean onCreateOptionsMenu(Menu menu) {
	super.onCreateOptionsMenu(menu);
	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.sendimmenu, menu);
	return true;
    }

    @Override
    public final boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	    case R.id.sendim_smiley:
		mSmyDialog.show();
		return true;
	    default:
		return false;
	}
    }
    
    private class OnChatListener extends IChatManagerListener.Stub {

	@Override
	public void chatCreated(IChat chat, boolean locally)
		throws RemoteException {
	    Log.i("LOG", "chatCreated");
	    
	}
	
    }
    
    private class OnMessageListener extends IMessageListener.Stub {

	@Override
	public void processMessage(IChat chat, Message msg)
		throws RemoteException {
	    Log.i("LOG", "processMessage");
	    mAdapter.add(mContact.getJID() + " "
		    + getString(R.string.SendIMSays) + msg.getBody());
	}
	
    }
}