package uk.ac.cam.echo.fragments; import uk.ac.cam.echo.ConversationStringUtil; import uk.ac.cam.echo.MessageAdapter; import uk.ac.cam.echo.R; import uk.ac.cam.echo.Toaster; import uk.ac.cam.echo.client.ClientApi; import uk.ac.cam.echo.client.data.MessageData; import uk.ac.cam.echo.data.Conversation; import uk.ac.cam.echo.data.Message; import uk.ac.cam.echo.data.User; import uk.ac.cam.echo.data.async.Handler; import uk.ac.cam.echo.services.EchoService; import android.app.ActionBar; import android.app.Fragment; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import java.util.List; import java.util.Timer; import java.util.TimerTask; import javax.validation.constraints.Null; import javax.ws.rs.client.Client; public class ConversationFragment extends Fragment { private static final String ID = "_id"; long id; boolean preview; private static EchoService echoService; private static User user; private static ClientApi api; Context context; ListView listView; List<Message> messageList; MessageAdapter adapter; private static Timer timer; boolean getAndListenAlreadyCalled; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); View view = inflater.inflate(R.layout.message_listview_layout, container, false); id = getArguments().getLong(ID); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); listView = (ListView)view.findViewById(R.id.messageListView); Log.d("LISTEN",(api==null) ? "api is null" : "Not null"); if(api != null && id > 0){ getAndListen(); } } @Override public void onResume() { super.onResume(); timer = new Timer(); if(api!=null) callAsynchronousTask(timer); } @Override public void onPause() { timer.cancel(); super.onPause(); } public void getAndListen() { if(!getAndListenAlreadyCalled) { Log.d("LISTEN", "getAndListen for " + id); new GetMessage().execute(id); new Listen().execute(id); } } public void onServiceReady() { Log.d("ConversationFragment", "onServiceReady()"); getAndListen(); } // Factory method to create a fragment based on the conversationID public static ConversationFragment newInstance(long id, boolean preview, EchoService service) { ConversationFragment cf = new ConversationFragment(); cf.setIsPreview(preview); if(service != null){ cf.setService(service); if(service.getUser() != null) cf.setUser(service.getUser()); } Bundle args = new Bundle(); args.putLong(ID, id); cf.setArguments(args); return cf; } // returns id of the conversation current displayed public long getShownIndex() { return getArguments().getLong(ID, 0); } public MessageAdapter getAdapter() { return adapter; } public ListView getListView() { return listView; } public void setIsPreview(boolean p) { preview = p; } public void setApi(ClientApi clientApi) { api = clientApi; } public void setUser(User u) { user = u; } public void setService(EchoService service) {echoService = service; } public void callAsynchronousTask(Timer timer) { TimerTask doAsynchronousTask = new TimerTask() { @Override public void run() { Log.d("NOTIF", "asyncupdate called"); if(user.getCurrentConversation() == null) return; Message update = api.conferenceResource.notify(1, user.getId(), user.getCurrentConversation().getId(), 300000); echoService.notifyUpdate(update); } }; timer.schedule(doAsynchronousTask, 30000, 150000); //execute in every 50000 ms } // ASYNCHRONOUS TASKS // Listening to new messages private class Listen extends AsyncTask<Long, Message, Void> { long id; @Override protected Void doInBackground(Long... longs) { id = longs[0]; //timer = new Timer(); Handler<Message> handler = new Handler<Message>() { @Override public void handle(Message message) { publishProgress(message); Log.d("LISTEN", "message received"); } }; api.conversationResource.listenToMessages(id).subscribe(handler); return null; } @Override protected void onProgressUpdate(Message... values) { super.onProgressUpdate(values); adapter.updateMessage(values[0]); } } // Getting previous messages private class GetMessage extends AsyncTask<Long, Void, List<Message>> { long id; Conversation conversation; List<Message> msgList; public String title; String users; @Override protected List<Message> doInBackground(Long... args) { id = args[0]; Log.d("ConversationFragment", "ID: " + id); conversation = api.conversationResource.get(id); Log.d("ConversationFragment", conversation == null ? "conv is null " : "conv is not null"); title = conversation.getName(); users = ConversationStringUtil.getUserText(conversation.getUsers()); if(preview) { msgList = (List)conversation.getMessages(25); } else { msgList = (List)conversation.getMessages(); } Log.d("MESSAGES", "loaded all the messages"); return msgList; } @Override protected void onPostExecute(List<Message> result) { messageList = msgList; adapter = MessageAdapter.newInstance(context, R.layout.message_row_remote, messageList, api, user); adapter.setListView(listView); adapter.setNotifyOnChange(true); listView.setAdapter(adapter); listView.setSelection(adapter.getCount() - 1); getAndListenAlreadyCalled = true; } } }