package com.mhacks.android.chat;
import android.app.ListFragment;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.BounceInterpolator;
import android.view.animation.TranslateAnimation;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.ValueEventListener;
import com.mhacks.android.R;
public class ChatFragment extends ListFragment {
private static final String FIREBASE_URL = "https://mhacks-chat.firebaseio.com";
private static final int MAX_VISIBLE_CHATS = 50;
private String username;
private String avatar_url;
private Firebase firebase;
private ValueEventListener connectedListener;
private ProgressBar connectionStatusThrobber;
private ChatListAdapter chatListAdapter;
private EditText inputText;
private RelativeLayout mLayout;
private SharedPreferences mSharedPreferences;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_chat, null);
// Make sure we have a username
mSharedPreferences = getActivity().getSharedPreferences("login", Context.MODE_PRIVATE);
username = mSharedPreferences.getString("username", "Anonymous");
avatar_url = mSharedPreferences.getString("avatar_url", "http://www.genengnews.com/app_themes/genconnect/images/default_profile.jpg");
// Setup our Firebase
firebase = new Firebase(FIREBASE_URL);
// Setup our input methods. Enter key on the keyboard or pushing the send button
inputText = (EditText) view.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;
}
});
inputText.requestFocus();
view.findViewById(R.id.sendButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendMessage();
}
});
connectionStatusThrobber = (ProgressBar) view.findViewById(R.id.chat_connection_status_throbber);
mSharedPreferences = getActivity().getSharedPreferences("login", Context.MODE_PRIVATE);
setRetainInstance(true);
mLayout = (RelativeLayout) view;
return view;
}
@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();
chatListAdapter = new ChatListAdapter(firebase.limit(MAX_VISIBLE_CHATS), getActivity(), R.layout.chat_message);
listView.setAdapter(chatListAdapter);
chatListAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(chatListAdapter.getCount() - 1);
}
});
// Finally, a little indication of connection status
connectedListener = firebase.getRoot().child(".info/connected").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean connected = (Boolean) dataSnapshot.getValue();
if (connected) {
connectionStatusThrobber.setVisibility(View.INVISIBLE);
} else {
connectionStatusThrobber.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// Nothing
}
});
}
@Override
public void onStop() {
super.onStop();
firebase.getRoot().child(".info/connected").removeEventListener(connectedListener);
chatListAdapter.cleanup();
}
private void sendMessage() {
String rawInput = inputText.getText().toString();
String trimmedInput = rawInput.trim();
if (!trimmedInput.equals("")) {
// Create our 'model', a Chat object
Chat chat = new Chat(trimmedInput, username, avatar_url);
// Create a new, auto-generated child of that chat location, and save our chat data there
firebase.push().setValue(chat);
inputText.setText("");
} else {
inputText.setText("");
}
}
public void putDave() {
final DisplayMetrics metrics = getResources().getDisplayMetrics();
int size = 68 * metrics.densityDpi / 160;
final ImageView view = new ImageView(getActivity());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(size, size);
view.setLayoutParams(params);
view.setScaleType(ImageView.ScaleType.FIT_XY);
view.setAdjustViewBounds(true);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mLayout.removeView(view);
}
});
view.setPivotX(view.getWidth() / 2);
view.setPivotY(view.getHeight()/2);
float fromX = 0.0f, fromY = 0.0f;
double random = Math.random();
if (random < 0.5) {
if (random < 0.25) {
Log.d("HellYeah", "Aligned bottom...");
fromY = size;
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
view.setImageResource(R.drawable.popup_dave_bottom);
} else {
Log.d("HellYeah", "Aligned top...");
fromY = -size;
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
view.setImageResource(R.drawable.popup_dave_top);
}
params.leftMargin = (int) (Math.random() * (mLayout.getWidth() - size));
Log.d("HellYeah", "Left margin: " + params.leftMargin);
} else {
if (random > 0.75) {
Log.d("HellYeah", "Aligned left...");
fromX = -size;
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
view.setImageResource(R.drawable.popup_dave_left);
} else {
Log.d("HellYeah", "Aligned right...");
fromX = size;
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
view.setImageResource(R.drawable.popup_dave_right);
}
params.topMargin = (int) (Math.random() * (mLayout.getHeight() - size));
Log.d("HellYeah", "Top margin: " + params.topMargin);
}
final TranslateAnimation animation = new TranslateAnimation(
Animation.ABSOLUTE, fromX,
Animation.ABSOLUTE, 0.0f,
Animation.ABSOLUTE, fromY,
Animation.ABSOLUTE, 0.0f);
animation.setDuration(500);
animation.setInterpolator(new BounceInterpolator());
view.setAnimation(animation);
mLayout.addView(view);
}
}