Skip to content

Instantly share code, notes, and snippets.

@ChristopherWalz
Last active August 29, 2015 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChristopherWalz/89a071b1606460e18ce7 to your computer and use it in GitHub Desktop.
Save ChristopherWalz/89a071b1606460e18ce7 to your computer and use it in GitHub Desktop.
public class RoomChatFragment extends Fragment {
ArrayList<Message> messages;
ListView listView;
MessageAdapter messageAdapter;
Context context;
MessageDatabase messageDatabase;
UserHandler user;
int roomID;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_room_chat, container, false);
listView = (ListView) view.findViewById(R.id.list);
final EditText enterMessageView = (EditText) view.findViewById(R.id.enter_message);
Button sendButtonView = (Button) view.findViewById(R.id.send_button);
context = getActivity();
messageDatabase = MessageDatabase.getInstance(context);
user = new UserHandler(context);
roomID = user.getRoomID();
// get all messages
messages = new ArrayList<Message>();
messageDatabase.getConditionBuilder().add(DatabaseHelper.KEY_MESSAGE_ROOM_ID + " = ?",
new String[] { String.valueOf(roomID) });
messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_LOCAL_TIME + " DESC");
messageDatabase.getConditionBuilder().setSqlLimit(100);
messages.addAll(messageDatabase.getList());
// get "user joined/left" messages
UserDatabase userDatabase = UserDatabase.getInstance(context);
messages.addAll(userDatabase.getJoinLeaveMessages(roomID));
Collections.sort(messages);
messageAdapter = new MessageAdapter(getActivity(), R.layout.list_message_item, messages);
listView.setAdapter(messageAdapter);
MainApplication app = (MainApplication) context.getApplicationContext();
app.setOnRoomMessageUpdateListener(new OnRoomMessageUpdateListener() {
@Override
public void onUpdate() {
// save message with highest time, so we can only query the new
// messages
long highestTime = getHighestMessageTime();
messageDatabase.getConditionBuilder().add(
DatabaseHelper.KEY_MESSAGE_ROOM_ID + " = ? AND " + DatabaseHelper.KEY_MESSAGE_LOCAL_TIME
+ " > ? AND " + DatabaseHelper.MESSAGE_TABLE_NAME + "."
+ DatabaseHelper.KEY_MESSAGE_USER_ID + " <> ?",
new String[] { String.valueOf(roomID), String.valueOf(highestTime),
String.valueOf(user.getUserID()) });
messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_LOCAL_TIME + " DESC");
final ArrayList<Message> newMessages = messageDatabase.getList();
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
messages.addAll(newMessages);
messageAdapter.notifyDataSetChanged();
}
});
}
});
app.setOnNewAvatar(new OnNewAvatarListener() {
@Override
public void onUpdate() {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
messageAdapter.notifyDataSetChanged();
}
});
}
});
app.setOnRoomUserUpdateListener(new OnRoomUserUpdateListener() {
@Override
public void onUpdate(final User user, final int roomID, final int joinStatus) {
if (RoomChatFragment.this.roomID != roomID) {
return;
}
final String message;
if (joinStatus == OnRoomUserUpdateListener.USER_JOINED) {
message = context.getString(R.string.join_room_message, user.getUsername());
} else {
message = context.getString(R.string.leave_room_message, user.getUsername());
}
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
messages.add(new Message(-1, user, message, System.currentTimeMillis(), System
.currentTimeMillis(), false, roomID, 0, true, Message.TYPE_JOINLEAVE));
messageAdapter.notifyDataSetChanged();
}
});
}
});
sendButtonView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String message = enterMessageView.getText().toString().trim();
if (message.isEmpty()) {
return;
}
if (message.length() > AppUtil.MAX_MESSAGE_LENGTH) {
enterMessageView.setError(getString(R.string.max_length, AppUtil.MAX_MESSAGE_LENGTH));
return;
}
// flood control
long currentTime = System.currentTimeMillis();
if ((user.getLastMessageTime() + 800) > currentTime) {
// TODO show error message?
return;
}
final Message messageObject = new Message(-1, new User(user.getUserID(), user.getUsername(), false, 0,
0), message, currentTime, currentTime, true, roomID, 0, false, Message.TYPE_MESSAGE);
messages.add(messageObject);
messageAdapter.notifyDataSetChanged();
enterMessageView.setText("");
RequestParams params = new RequestParams();
params.put("action", "sendMessage");
params.put("chatType", "room");
params.put("toRoomID", roomID);
params.put("message", messageObject.getMessage());
ServerUtil.post("", params, context, new CustomResponseHandler(context) {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
try {
String status = response.getString("status");
if (status.equals(AppUtil.REQUEST_SUCCESS)) {
// message successfully saved online
ContentValues values = new ContentValues();
values.put(DatabaseHelper.KEY_MESSAGE_MESSAGE_ID, response.getInt("messageID"));
values.put(DatabaseHelper.KEY_MESSAGE_MESSAGE, messageObject.getMessage());
values.put(DatabaseHelper.KEY_MESSAGE_USER_ID, messageObject.getUser().getUserID());
values.put(DatabaseHelper.KEY_MESSAGE_ROOM_ID, messageObject.getRoomID());
long time = Long.parseLong(response.getString("time")) * 1000;
values.put(DatabaseHelper.KEY_MESSAGE_TIME, time);
values.put(DatabaseHelper.KEY_MESSAGE_LOCAL_TIME, messageObject.getLocalTime());
values.put(DatabaseHelper.KEY_MESSAGE_SENT, 1);
long messageID = messageDatabase.insert(values);
// mark message as sent
messageObject.setSent(true);
messageObject.setTime(time);
messageObject.setId(messageID);
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
messageAdapter.notifyDataSetChanged();
}
});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
super.onFailure(statusCode, headers, responseString, throwable);
onFailure();
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
onFailure();
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable,
JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
onFailure();
}
private void onFailure() {
messageObject.setResendable(true);
messages.remove(messageObject);
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
messageAdapter.notifyDataSetChanged();
}
});
Toast.makeText(context, getString(R.string.error_sending_message), Toast.LENGTH_LONG).show();
}
});
}
});
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
final Message message = messages.get(position);
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(message.getMessage(), message.getMessage());
clipboard.setPrimaryClip(clip);
Toast.makeText(context, R.string.message_copied, Toast.LENGTH_SHORT).show();
return false;
}
});
return view;
}
private long getHighestMessageTime() {
long highestTime = 0;
int userID = user.getUserID();
for (Message message : messages) {
long time = message.getLocalTime();
if (userID != message.getUser().getUserID() && time > highestTime) {
highestTime = time;
}
}
return highestTime;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment