-
-
Save ChristopherWalz/89a071b1606460e18ce7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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