package com.firebase.androidchat; import android.app.ListActivity; import android.content.Intent; import android.content.SharedPreferences; import android.database.DataSetObserver; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.firebase.client.DataSnapshot; import com.firebase.client.Firebase; import com.firebase.client.FirebaseError; import com.firebase.client.ValueEventListener; import java.util.Random; import client.smrtms.com.smrtms_client.controller.LoginUser; import client.smrtms.com.smrtms_client.R; public class ChatActivity extends ListActivity { // FIREBASE URL private static final String FIREBASE_URL = "https://flickering-heat-823.firebaseIO.com"; private String mUsername; private Firebase mFirebaseRef; private ValueEventListener mConnectedListener; private ChatListAdapter mChatListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Firebase.setAndroidContext(this); setContentView(R.layout.activity_main); // Make sure we have a mUsername setupUsername(); //get UserID from chat Partner Intent origin = getIntent(); String chatName; String chatPartnerID = origin.getStringExtra("UserKey"); if(chatPartnerID.contains("Event")) { chatName = origin.getStringExtra("EventName"); } else { //Bigger UserID always first string so chat is equivalent if (Integer.parseInt(LoginUser.getInstance().getID()) > Integer.parseInt(chatPartnerID)) { chatName = LoginUser.getInstance().getID() + chatPartnerID; } else { chatName = chatPartnerID + LoginUser.getInstance().getID(); } } setTitle("Chatting as " + mUsername); // Setup our Firebase mFirebaseRef mFirebaseRef = new Firebase(FIREBASE_URL).child(chatName); // Setup our input methods. Enter key on the keyboard or pushing the send button EditText inputText = (EditText) findViewById(R.id.messageInput); inputText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { if (actionId == EditorInfo.IME_NULL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) { sendMessage(); } return true; } }); findViewById(R.id.sendButton).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendMessage(); } }); } @Override public void onStart() { super.onStart(); // Setup our view and list adapter. Ensure it scrolls to the bottom as data changes final ListView listView = getListView(); // Tell our list adapter that we only want 50 messages at a time mChatListAdapter = new ChatListAdapter(mFirebaseRef.limit(50), this, R.layout.chat_message, mUsername); listView.setAdapter(mChatListAdapter); mChatListAdapter.registerDataSetObserver(new DataSetObserver() { @Override public void onChanged() { super.onChanged(); listView.setSelection(mChatListAdapter.getCount() - 1); } }); // Finally, a little indication of connection status mConnectedListener = mFirebaseRef.getRoot().child(".info/connected").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { boolean connected = (Boolean) dataSnapshot.getValue(); if (connected) { Toast.makeText(ChatActivity.this, "Connected to Firebase", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(ChatActivity.this, "Disconnected from Firebase", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(FirebaseError firebaseError) { // No-op } }); } @Override public void onStop() { super.onStop(); mFirebaseRef.getRoot().child(".info/connected").removeEventListener(mConnectedListener); mChatListAdapter.cleanup(); } private void setupUsername() { SharedPreferences prefs = getApplication().getSharedPreferences("ChatPrefs", 0); mUsername = prefs.getString("username", null); if (mUsername == null) { Random r = new Random(); // Assign a random user name if we don't have one saved. mUsername = LoginUser.getInstance().getUsername(); prefs.edit().putString("username", mUsername).commit(); } } private void sendMessage() { EditText inputText = (EditText) findViewById(R.id.messageInput); String input = inputText.getText().toString(); if (!input.equals("")) { // Create our 'model', a Chat object Chat chat = new Chat(input, LoginUser.getInstance().getUsername()); // Create a new, auto-generated child of that chat location, and save our chat data there mFirebaseRef.push().setValue(chat); inputText.setText(""); } } }