package pro.dbro.ble.ui.fragment;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import pro.dbro.ble.R;
import pro.dbro.ble.data.DataStore;
import pro.dbro.ble.ui.adapter.MessageAdapter;
/**
* A Fragment that currently allows chatting only in the public broadcast mode
* ala Twitter.
*/
public class MessagingFragment extends Fragment implements MessageAdapter.MessageSelectedListener {
public static final String TAG = "MessageListFragment";
public static interface ChatFragmentCallback {
public void onMessageSendRequested(String message);
public void onMessageSelected(View identiconView, View usernameView, int messageId, int peerId);
}
private ChatFragmentCallback mCallback;
DataStore mDataStore;
RecyclerView mRecyclerView;
MessageAdapter mAdapter;
EditText mMessageEntry;
View mRoot;
public MessagingFragment() {
// Required empty public constructor
}
public void setDataStore(DataStore dataStore) {
mDataStore = dataStore;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mDataStore == null)
throw new IllegalStateException("MessageListFragment must be equipped with a DataStore. Did you call #setDataStore");
// Inflate the layout for this fragment
mRoot = inflater.inflate(R.layout.fragment_message, container, false);
mMessageEntry = (EditText) mRoot.findViewById(R.id.messageEntry);
mMessageEntry.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
sendMessage(v.getText().toString());
v.setText("");
return true;
}
return false;
}
});
mRoot.findViewById(R.id.sendMessageButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSendMessageButtonClick(v);
}
});
mRecyclerView = (RecyclerView) mRoot.findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapter = new MessageAdapter(getActivity(), null, mDataStore, this, MessageAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mRecyclerView.setAdapter(mAdapter);
return mRoot;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (ChatFragmentCallback) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ChatFragmentCallback");
}
}
public void onSendMessageButtonClick(View v) {
sendMessage(mMessageEntry.getText().toString());
mMessageEntry.setText("");
}
private void sendMessage(String message) {
if (message.length() == 0) return;
Log.i(TAG, "Sending message " + message);
// For now treat all messsages as public broadcast
mCallback.onMessageSendRequested(message);
}
@Override
public void onMessageSelected(View identiconView, View usernameView, int messageId, int peerId) {
mCallback.onMessageSelected(identiconView, usernameView, messageId, peerId);
}
public void animateIn() {
mRoot.setAlpha(0);
ObjectAnimator animator = ObjectAnimator.ofFloat(mRoot, "alpha", 0f, 1f)
.setDuration(300);
animator.setStartDelay(550);
animator.start();
}
}