package tof.cv.mpp;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.AdapterDataObserver;
import android.text.InputType;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import tof.cv.mpp.MyPreferenceActivity.Prefs1Fragment;
import tof.cv.mpp.Utils.DbAdapterConnection;
import tof.cv.mpp.adapter.MessageViewHolder;
import tof.cv.mpp.bo.Message;
public class ChatFragment extends Fragment {
/**
* Called when the activity is first created.
*/
FirebaseRecyclerAdapter mFirebaseAdapter;
private TextView mTitleText;
private Button btnSettings;
private Button btnSend;
private EditText messageTxtField;
private final String TAG = "MessagesTrain.java";
private boolean posted = false;
String trainId;
DatabaseReference ref;
private static final int MENU_FILTER = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_chat, null);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mTitleText = (TextView) getView().findViewById(R.id.pseudo);
btnSettings = (Button) getView().findViewById(R.id.settings);
btnSend = (Button) getView().findViewById(R.id.send);
messageTxtField = (EditText) getView().findViewById(
R.id.yourmessage);
setBtnSettingsListener();
setBtnSendListener();
update();
boolean isTablet = this.getActivity().getResources().getBoolean(R.bool.tablet_layout);
((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(
!isTablet);
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(R.string.nav_drawer_chat);
((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(null);
}
private void setBtnSendListener() {
btnSend.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
if (posted) {
Toast.makeText(getActivity(),
R.string.chat_send_err_max_messages, Toast.LENGTH_LONG)
.show();
} else {
String pseudo = PreferenceManager
.getDefaultSharedPreferences(getActivity())
.getString("prefPseudo", "Anonymous");
if (pseudo.contentEquals("Anonymous"))
Toast.makeText(
getActivity(),
R.string.chat_send_err_username,
Toast.LENGTH_LONG).show();
else if (messageTxtField.getText().toString()
.contentEquals(""))
Toast.makeText(getActivity(), R.string.chat_send_err_empty,
Toast.LENGTH_LONG).show();
else {
postMessage(pseudo);
}
}
}
});
}
private void postMessage(final String pseudo) {
Calendar c = Calendar.getInstance();
System.out.println("Current time => " + c.getTime());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = df.format(c.getTime());
ref.push().setValue(new Message(pseudo, messageTxtField.getText().toString(), formattedDate, trainId));
update();
View view = getActivity().getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
messageTxtField.setText("");
messageTxtField.clearFocus();
}
private void setBtnSettingsListener() {
btnSettings.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= 11)
startActivity(new Intent(getActivity(),
MyPreferenceActivity.class).putExtra(
PreferenceActivity.EXTRA_SHOW_FRAGMENT,
Prefs1Fragment.class.getName()));
else {
startActivity(new Intent(getActivity(), MyPreferenceActivity.class));
}
}
});
}
public void update() {
Log.e("CVE", "TRAIN: " + trainId);
final RecyclerView mMessageRecyclerView = (RecyclerView) getView().findViewById(R.id.recyclerview);
ref = FirebaseDatabase.getInstance().getReference().child("chat").getRef();
Query ref2 = trainId == null ? ref.limitToLast(99) : ref.orderByChild("train_id")
.equalTo(trainId).limitToLast(99);
mFirebaseAdapter = new FirebaseRecyclerAdapter<Message,
MessageViewHolder>(
Message.class,
R.layout.row_message,
MessageViewHolder.class,
ref2) {
@Override
protected void populateViewHolder(MessageViewHolder viewHolder,
final Message message, int position) {
viewHolder.getNickname().setText(message.getUser_name());
viewHolder.getMessagebody().setText(message.getUser_message());
if (message.getEntry_date().contains(":"))
viewHolder.getTime().setText(message.getEntry_date().substring(0, message.getEntry_date().lastIndexOf(":")));
else
viewHolder.getTime().setText(message.getEntry_date());
viewHolder.getTrainid().setText(message.getTrain_id());
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder ad = new AlertDialog.Builder(getActivity());
if (trainId == null) {
ad.setTitle(getResources().getString(
R.string.chat_open_train_messages,
message.getTrain_id()));
ad.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
Bundle bundle = new Bundle();
bundle.putString(DbAdapterConnection.KEY_NAME,
message.getTrain_id());
Intent mIntent = new Intent(getContext(),
ChatActivity.class);
mIntent.putExtras(bundle);
startActivityForResult(mIntent, 0);
}
});
ad.setNegativeButton(android.R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
}
});
ad.show();
} else {
ad.setTitle(getResources().getString(R.string.chat_open_train_info,
message.getTrain_id()));
ad.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
Intent i = new Intent(getActivity(),
InfoTrainActivity.class);
i.putExtra(DbAdapterConnection.KEY_NAME,
message.getTrain_id());
startActivity(i);
}
});
ad.setNegativeButton(android.R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int arg1) {
}
});
ad.show();
}
}
});
}
@Override
protected void onDataChanged() {
int itemCount= mMessageRecyclerView.getAdapter().getItemCount();
TextView messagesEmpty = (TextView) getActivity().findViewById(
R.id.emptychat);
if (itemCount > 0) {
if (getActivity() instanceof InfoTrainActivity)
((InfoTrainActivity) getActivity()).setChatBadge(itemCount);
messagesEmpty.setVisibility(View.GONE);
} else {
messagesEmpty.setVisibility(View.VISIBLE);
messagesEmpty.setText(R.string.chat_no_message);
}
}
};
AdapterDataObserver mObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeChanged(int positionStart, int itemCount) {
Log.e("CVEADAPTER", "onItemRangeChanged ");
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
Log.e("CVEADAPTER", "onItemRangeMoved ");
}
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
Log.e("CVEADAPTER", "onItemRangeChanged ");
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart,itemCount);
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
Log.e("CVEADAPTER", "onItemRangeRemoved ");
}
};
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
mMessageRecyclerView.setLayoutManager(mLayoutManager);
mMessageRecyclerView.setAdapter(mFirebaseAdapter);
mFirebaseAdapter.registerAdapterDataObserver(mObserver);
}
@Override
public void onDestroy() {
super.onDestroy();
mFirebaseAdapter.cleanup();
}
public void onResume() {
super.onResume();
Log.i("BETRAINS", "train ID= " + trainId);
if (trainId != null)
mTitleText.setText(PreferenceManager.getDefaultSharedPreferences(
getActivity()).getString("prefPseudo", "Anonymous")
+ " - " + trainId);
else
mTitleText.setText(PreferenceManager.getDefaultSharedPreferences(
getActivity()).getString("prefPseudo", "Anonymous"));
LinearLayout mSendLayout = (LinearLayout) getView().findViewById(
R.id.send_layout);
if (trainId == null) {
mSendLayout.setVisibility(View.GONE);
}
update();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.add(Menu.NONE, MENU_FILTER, Menu.NONE, "Filter")
.setIcon(R.drawable.ic_menu_search)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_FILTER:
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
alert.setTitle(R.string.chat_action_filter);
alert.setMessage(R.string.chat_filter_message);
// Set an EditText view to get user input
final EditText input = new EditText(getActivity());
input.setInputType(InputType.TYPE_CLASS_NUMBER);
alert.setView(input);
alert.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Bundle bundle = new Bundle();
bundle.putString(DbAdapterConnection.KEY_NAME,
input.getText().toString());
Intent mIntent = new Intent(getActivity(),
ChatActivity.class);
mIntent.putExtras(bundle);
startActivity(mIntent);
}
});
alert.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
}
});
alert.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}