package com.vt.vthacks; import java.text.DateFormat; import java.util.Date; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.vt.vthacks.model.IAnnouncementList; import com.vt.vthacks.model.impl.Announcement; import com.vt.vthacks.model.impl.AnnouncementList; import com.vt.vthacks.view.AnnouncementAdapter; import com.vt.vthacks.view.PullToRefreshListView; import com.vt.vthacks.view.PullToRefreshListView.OnRefreshListener; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.ResultReceiver; // ------------------------------------------------------------------------- /** * * This class handles the interaction for the announcements page * * @author Brandon Potts * @version Mar 10, 2014 */ public class AnnouncementsFragment extends Fragment { /** * Holds the List View in the announcement activity */ private PullToRefreshListView listView; private AnnouncementAdapter adapter; private ServiceConnection serviceConnection; // ---------------------------------------------------------- /** * Sets up the announcements page * * @param savedInstanceState is data that was most recently supplied */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); serviceConnection = new PushNotificationServiceConnection(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.announcements, container, false); //tests a basic ArrayAdaptor listView = (PullToRefreshListView) view.findViewById(R.id.announce_list); listView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new GetAnnouncementsTask().execute(); } }); adapter = new AnnouncementAdapter(getActivity(), new AnnouncementList(null)); listView.setAdapter(adapter); listView.onRefresh(); return view; } @Override public void onStart() { super.onStart(); Intent serviceIntent = new Intent(getActivity(), GcmIntentService.class); serviceIntent.putExtra("pushNotificationListener", new PushNotificationListener(new Handler())); getActivity().bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE); } @Override public void onStop() { super.onStop(); getActivity().unbindService(serviceConnection); } private class GetAnnouncementsTask extends AsyncTask<Void, Void, IAnnouncementList> { @Override protected IAnnouncementList doInBackground(Void... arg0) { return AnnouncementList.fromServer(); } @Override protected void onPostExecute(IAnnouncementList result) { super.onPostExecute(result); if (result != null) { adapter.clear(); for (int i = result.size() - 1; i >= 0; i--) { adapter.add(result.get(i)); } adapter.notifyDataSetChanged(); } Date date = new Date(System.currentTimeMillis()); listView.onRefreshComplete("Last updated at " + DateFormat.getDateTimeInstance().format(date)); } } private class PushNotificationListener extends ResultReceiver { private static final String TAG = "PushNotificationListener"; public PushNotificationListener(Handler handler) { super(handler); } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultData == null) { return; } if (resultCode == Constants.PUSH_NOTIFICATION_RECEIVED) { String title = resultData.getString("title"); String message = resultData.getString("message"); long timestamp = resultData.getLong("timestamp", System.currentTimeMillis()); if (title != null && message != null) { Date date = new Date(timestamp); adapter.insert(new Announcement(title, message, DateFormat.getDateTimeInstance().format(date)), 0); adapter.notifyDataSetChanged(); } else { Log.d(TAG, resultData.toString()); } } } } private class PushNotificationServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { // Nothing } @Override public void onServiceDisconnected(ComponentName componentName) { // Nothing } } }