package com.vt.vthacks; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URI; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import com.vt.vthacks.GroupDialogFragment.GroupDialogListener; import com.vt.vthacks.model.IGroup; import com.vt.vthacks.model.IGroupList; import com.vt.vthacks.model.impl.GroupList; import com.vt.vthacks.view.GroupAdapter; import com.vt.vthacks.view.PullToRefreshListView; import com.vt.vthacks.view.PullToRefreshListView.OnRefreshListener; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; public class GroupFinderFragment extends Fragment { private static final String TAG = "GroupFinderFragment"; private GroupAdapter adapter; private PullToRefreshListView listView; private GroupFinderListener listener; public interface GroupFinderListener { public void onAddGroupClicked(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.group_finder, container, false); listView = (PullToRefreshListView) view.findViewById(R.id.groups_list_view); listView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { new GetGroupsTask().execute(); } }); adapter = new GroupAdapter(getActivity(), new GroupList(null)); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View v, int pos, long id) { IGroup group = (IGroup) adapter.getAdapter().getItem(pos); DialogFragment dialog = GroupDialogFragment.newInstance(new GroupDialogListener() { /** * For serialization. */ private static final long serialVersionUID = 1790810097819737677L; @Override public void onPasswordEntered(String groupID, String password) { if (groupID == null) { Toast.makeText(getActivity(), R.string.group_id_not_found, Toast.LENGTH_SHORT).show(); return; } if (password == null || password.length() <= 0) { Toast.makeText(getActivity(), R.string.password_empty, Toast.LENGTH_SHORT).show(); return; } Log.d(TAG, groupID); DeleteGroupTaskArgs args = new DeleteGroupTaskArgs(groupID, password); new DeleteGroupTask().execute(args); } @Override public void onCancelClicked() { } }, group); dialog.show(GroupFinderFragment.this.getFragmentManager(), "groupFinderDialog"); } }); listView.onRefresh(); return view; } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof GroupFinderListener) { this.listener = (GroupFinderListener)activity; } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.group, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_add_group: if (listener != null) { listener.onAddGroupClicked(); } break; } return super.onOptionsItemSelected(item); } private class GetGroupsTask extends AsyncTask<Void, Void, IGroupList> { @Override protected IGroupList doInBackground(Void... arg0) { return GroupList.fromServer(); } @Override protected void onPostExecute(IGroupList result) { super.onPostExecute(result); if (result != null) { adapter.clear(); adapter.addAll(result); adapter.notifyDataSetChanged(); } Date date = new Date(System.currentTimeMillis()); listView.onRefreshComplete("Last updated at " + DateFormat.getDateTimeInstance().format(date)); } } private class DeleteGroupTask extends AsyncTask<DeleteGroupTaskArgs, Void, HttpResponse> { private static final String TAG = "DeleteGroupTask"; private static final String HOST_NAME = "vthacks-env-pmkrjpmqpu.elasticbeanstalk.com"; private static final int PORT = 80; private static final String SCHEME = "http"; @Override protected HttpResponse doInBackground(DeleteGroupTaskArgs ... args) { if (args == null || args.length != 1) { return null; } DeleteGroupTaskArgs deleteGroupTaskArgs = args[0]; HttpClient httpClient = new DefaultHttpClient(); HttpHost httpHost = new HttpHost(HOST_NAME, PORT, SCHEME); HttpDeleteWithBody delete = new HttpDeleteWithBody(); delete.setURI(URI.create("/groups")); List<NameValuePair> formParameters = new ArrayList<NameValuePair>(); formParameters.add(new BasicNameValuePair("password", deleteGroupTaskArgs.getPassword())); formParameters.add(new BasicNameValuePair("groupID", deleteGroupTaskArgs.getGroupID())); try { delete.setEntity(new UrlEncodedFormEntity(formParameters)); } catch (UnsupportedEncodingException e) { Log.d(TAG, "UnsupportedEncodingException: " + e.getMessage()); return null; } try { return httpClient.execute(httpHost, delete); } catch (ClientProtocolException e) { Log.d(TAG, "ClientProtocolException: " + e.getMessage()); return null; } catch (IOException e) { Log.d(TAG, "IOException: " + e.getMessage()); return null; } } @Override protected void onPostExecute(HttpResponse result) { super.onPostExecute(result); if (result == null) { Toast.makeText(getActivity(), R.string.http_problem_with_response, Toast.LENGTH_SHORT).show(); return; } int responseCode = result.getStatusLine().getStatusCode(); if (responseCode != 200) { if (responseCode == 400) { Toast.makeText(getActivity(), R.string.http_malformed_request, Toast.LENGTH_SHORT).show(); } else if (responseCode == 404) { Toast.makeText(getActivity(), R.string.http_group_not_found, Toast.LENGTH_SHORT).show(); } else if (responseCode == 401) { Toast.makeText(getActivity(), R.string.incorrect_password, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), R.string.http_problem_with_response, Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getActivity(), R.string.delete_group_success, Toast.LENGTH_SHORT).show(); listView.onRefresh(); } } } private class DeleteGroupTaskArgs { private String groupID; private String password; public DeleteGroupTaskArgs(String groupID, String password) { this.groupID = groupID; this.password = password; } public String getPassword() { return password; } private String getGroupID() { return groupID; } } }