package com.mobmonkey.mobmonkeyandroid.fragments;
import java.text.ParseException;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
import com.mobmonkey.mobmonkeyandroid.R;
import com.mobmonkey.mobmonkeyandroid.arrayadapters.MMOpenRequestsArrayAdapter;
import com.mobmonkey.mobmonkeyandroid.arrayadaptersitems.MMOpenRequestsItem;
import com.mobmonkey.mobmonkeyandroid.utils.MMConstants;
import com.mobmonkey.mobmonkeyandroid.utils.MMExpandedListView;
import com.mobmonkey.mobmonkeyandroid.utils.MMFragment;
import com.mobmonkey.mobmonkeyandroid.utils.MMUtility;
import com.mobmonkey.mobmonkeysdk.adapters.MMRequestAdapter;
import com.mobmonkey.mobmonkeysdk.utils.MMProgressDialog;
import com.mobmonkey.mobmonkeysdk.utils.MMSDKConstants;
import com.mobmonkey.mobmonkeysdk.utils.MMCallback;
import com.mobmonkey.mobmonkeysdk.utils.MMLocationListener;
import com.mobmonkey.mobmonkeysdk.utils.MMLocationManager;
/**
* Android {@link Fragment} to display Open requests Fragment.
* @author Dezapp, LLC
*
*/
public class OpenRequestsFragment extends MMFragment implements OnItemClickListener {
private static final String TAG = "OpenRequestsScreen: ";
private MMExpandedListView elvOpenedRequests;
private Location location;
private JSONArray openRequests;
private MMOpenRequestsArrayAdapter arrayAdapter;
private SharedPreferences userPrefs;
/*
* (non-Javadoc)
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
userPrefs = getActivity().getSharedPreferences(MMSDKConstants.USER_PREFS, Context.MODE_PRIVATE);
MMRequestAdapter.getOpenRequests(new OpenRequestCallback());
MMProgressDialog.displayDialog(getActivity(),
MMSDKConstants.DEFAULT_STRING_EMPTY,
getString(R.string.pd_retrieving_all_open_requests));
View view = inflater.inflate(R.layout.fragment_openrequests_screen, container, false);
elvOpenedRequests = (MMExpandedListView) view.findViewById(R.id.elvopenrequests);
location = MMLocationManager.getGPSLocation();
return view;
}
/*
* (non-Javadoc)
* @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long)
*/
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
final int pos = position;
new AlertDialog.Builder(getActivity())
.setTitle(R.string.ad_title_delete_request)
.setMessage(R.string.ad_message_delete_request)
.setCancelable(false)
.setPositiveButton(R.string.ad_btn_delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
deleteRequest(pos);
}
})
.setNegativeButton(R.string.ad_btn_cancel, null)
.show();
}
/*
* (non-Javadoc)
* @see com.mobmonkey.mobmonkey.utils.MMFragment#onFragmentBackPressed()
*/
@Override
public void onFragmentBackPressed() {
}
/**
* function that generate an array of {@link MMOpenRequestsItem} and returns it.
* @return {@link MMOpenedRequestsItem[]}
* @throws JSONException
* @throws NumberFormatException
* @throws ParseException
*/
private MMOpenRequestsItem[] getOpenedRequestItems() throws JSONException, NumberFormatException, ParseException {
MMOpenRequestsItem[] openedRequestItems = new MMOpenRequestsItem[openRequests.length()];
for(int i = 0; i < openRequests.length(); i++) {
JSONObject jObj = openRequests.getJSONObject(i);
MMOpenRequestsItem item = new MMOpenRequestsItem();
item.title = jObj.getString(MMSDKConstants.JSON_KEY_NAME_OF_LOCATION);
if(jObj.getString(MMSDKConstants.JSON_KEY_MESSAGE).equals(MMSDKConstants.DEFAULT_STRING_NULL)) {
item.message = MMSDKConstants.DEFAULT_STRING_EMPTY;
} else {
item.message = jObj.getString(MMSDKConstants.JSON_KEY_MESSAGE);
}
//date can be null. leave time as a blank string if its null
if(jObj.getString(MMSDKConstants.JSON_KEY_REQUEST_DATE).equals(MMSDKConstants.DEFAULT_STRING_NULL)) {
item.time = MMSDKConstants.DEFAULT_STRING_EMPTY;
} else {
item.time = MMUtility.getDate(Long.parseLong(jObj.getString(MMSDKConstants.JSON_KEY_REQUEST_DATE)),
MMSDKConstants.DATE_FORMAT_MMMM_DD_HH_SEMICOLON_MMA);
}
item.dis = MMUtility.calcDist(location,
jObj.getDouble(MMSDKConstants.JSON_KEY_LATITUDE),
jObj.getDouble(MMSDKConstants.JSON_KEY_LONGITUDE)) + MMSDKConstants.DEFAULT_STRING_SPACE + getString(R.string.miles);
item.mediaType = jObj.getInt(MMSDKConstants.JSON_KEY_MEDIA_TYPE);
openedRequestItems[i] = item;
}
return openedRequestItems;
}
/**
*
* @param position
*/
private void deleteRequest(int position) {
try {
MMRequestAdapter.deleteRequest(new DeleteRequestCallback(position),
openRequests.getJSONObject(position).getString(MMSDKConstants.JSON_KEY_REQUEST_ID),
openRequests.getJSONObject(position).getString(MMSDKConstants.JSON_KEY_RECURRING));
MMProgressDialog.displayDialog(getActivity(),
MMSDKConstants.DEFAULT_STRING_EMPTY,
getString(R.string.pd_deleting_request));
} catch (JSONException e) {
e.printStackTrace();
}
}
/**
*
* @author Dezapp, LLC
*
*/
private class DeleteRequestCallback implements MMCallback {
private int position;
public DeleteRequestCallback(int position) {
this.position = position;
}
@Override
public void processCallback(Object obj) {
MMProgressDialog.dismissDialog();
if(obj != null) {
Log.d(TAG, (String)obj);
if(((String) obj).equals(MMSDKConstants.CONNECTION_TIMED_OUT)) {
Toast.makeText(getActivity(), getString(R.string.toast_connection_timed_out), Toast.LENGTH_SHORT).show();
} else {
try {
JSONObject jObj = new JSONObject((String)obj);
if(jObj.getString(MMSDKConstants.JSON_KEY_STATUS).equals(MMSDKConstants.RESPONSE_STATUS_SUCCESS)) {
ArrayList<JSONObject> temp = new ArrayList<JSONObject>();
for(int i = 0; i < openRequests.length(); i++) {
temp.add(openRequests.getJSONObject(i));
}
temp.remove(position);
openRequests = new JSONArray(temp);
arrayAdapter = new MMOpenRequestsArrayAdapter(getActivity(), R.layout.listview_row_openrequests, getOpenedRequestItems());
elvOpenedRequests.setAdapter(arrayAdapter);
elvOpenedRequests.invalidate();
Toast.makeText(getActivity().getApplicationContext(),
getString(R.string.toast_request) + MMSDKConstants.DEFAULT_STRING_SPACE + jObj.getString(MMSDKConstants.JSON_KEY_DESCRIPTION),
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity().getApplicationContext(), jObj.getString(MMSDKConstants.JSON_KEY_DESCRIPTION), Toast.LENGTH_LONG).show();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
}
/**
*
* @author Dezapp, LLC
*
*/
private class OpenRequestCallback implements MMCallback {
@Override
public void processCallback(Object obj) {
MMProgressDialog.dismissDialog();
if(obj != null) {
if(((String) obj).equals(MMSDKConstants.CONNECTION_TIMED_OUT)) {
Toast.makeText(getActivity(), getString(R.string.toast_connection_timed_out), Toast.LENGTH_SHORT).show();
} else {
try {
Log.d(TAG, "OpenRequestCallback: " + (String) obj);
openRequests = new JSONArray((String) obj);
arrayAdapter = new MMOpenRequestsArrayAdapter(getActivity(), R.layout.listview_row_openrequests, getOpenedRequestItems());
elvOpenedRequests.setAdapter(arrayAdapter);
elvOpenedRequests.setVisibility(View.VISIBLE);
elvOpenedRequests.setOnItemClickListener(OpenRequestsFragment.this);
} catch (JSONException ex) {
ex.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
}
}