package com.webshrub.citizencomplaint.androidapp;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.location.*;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import static com.webshrub.citizencomplaint.androidapp.CitizenComplaintConstants.*;
/**
* Created by IntelliJ IDEA.
* User: Ahsan.Javed
* Date: 4/26/13
* Time: 5:44 PM
*/
public class CitizenComplaintInsertDetailsTask extends AsyncTask<Void, Void, CitizenComplaintMLADetails> implements LocationListener {
private Context context;
private CitizenComplaint citizenComplaint;
private CitizenComplaintDataSource citizenComplaintDataSource;
private LocationManager locationManager;
private Dialog progressDialog;
public CitizenComplaintInsertDetailsTask(Context context, CitizenComplaint citizenComplaint) {
this.context = context;
this.citizenComplaint = citizenComplaint;
citizenComplaintDataSource = CitizenComplaintDataSource.getInstance(context);
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
String bestProvider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(bestProvider, 99, 0, this);
progressDialog = new Dialog(context);
progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
progressDialog.setCancelable(false);
progressDialog.setContentView(R.layout.citizen_complaint_progress_dialog);
progressDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
@SuppressWarnings("unchecked")
@Override
protected void onPreExecute() {
progressDialog.show();
}
@SuppressWarnings("unchecked")
@Override
protected CitizenComplaintMLADetails doInBackground(Void... params) {
try {
while (citizenComplaint.getLatitude() == null || citizenComplaint.getLongitude() == null) {
if (!CitizenComplaintUtility.isDeviceOnline(context)) {
locationManager.removeUpdates(this);
return null;
} else {
Thread.sleep(99);
}
}
locationManager.removeUpdates(this);
citizenComplaintDataSource.createCitizenComplaint(citizenComplaint);
JSONObject jsonResponse = CitizenComplaintHttpUtil.getJSONFromUrl(context, CITIZEN_COMPLAINT_GET_MLA_ID_URL_PARAMS + "?" + LATTITUDE_PARAMS + "=" + citizenComplaint.getLatitude() + "&" + LONGITUDE_PARAMS + "=" + citizenComplaint.getLongitude());
if (jsonResponse != null) {
String constituencyId = jsonResponse.getString(CONSTITUENCY_ID_PARAMS);
return getOrCreateMLADetails(constituencyId);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(CitizenComplaintMLADetails citizenComplaintMLADetails) {
super.onPostExecute(citizenComplaintMLADetails);
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
if (citizenComplaintMLADetails != null) {
showSummaryDialog(citizenComplaintMLADetails);
} else {
Toast.makeText(context, "Not connected to internet.", Toast.LENGTH_SHORT).show();
}
}
private void showSummaryDialog(CitizenComplaintMLADetails citizenComplaintMLADetails) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.citizen_complaint_summary_dialog, null);
TextView mlaNameConstituency = (TextView) view.findViewById(R.id.mlaNameConstituencyTextView);
mlaNameConstituency.setText(citizenComplaintMLADetails.getMlaName() + ", MLA/" + citizenComplaintMLADetails.getMlaConstituency());
ImageView mlaImage = (ImageView) view.findViewById(R.id.mlaImageView);
mlaImage.setImageURI(citizenComplaintMLADetails.getMlaImageUri());
TextView complaintCategory = (TextView) view.findViewById(R.id.complaintCategoryTextView);
complaintCategory.setText(citizenComplaint.getComplaintCategory());
TextView issueLevel = (TextView) view.findViewById(R.id.issueLevelTextView);
Integer templateId = Integer.parseInt(citizenComplaint.getSelectedTemplateId());
if (templateId >= 0 && templateId <= 9) {
issueLevel.setText(context.getResources().getString(R.string.lackOfInfrastructure));
} else if (templateId >= 10 && templateId <= 19) {
issueLevel.setText(context.getResources().getString(R.string.lackOfMaintenance));
} else if (templateId >= 20 && templateId <= 29) {
issueLevel.setText(context.getResources().getString(R.string.lackOfQualityStaff));
} else if (templateId >= 30 && templateId <= 39) {
issueLevel.setText(context.getResources().getString(R.string.exorbitantPricing));
} else if (templateId >= 40 && templateId <= 49) {
issueLevel.setText(context.getResources().getString(R.string.lackOfAwareness));
}
TextView templateString = (TextView) view.findViewById(R.id.templateStringTextView);
templateString.setText(citizenComplaint.getSelectedTemplateString());
TextView latLong = (TextView) view.findViewById(R.id.latLongTextView);
latLong.setText(citizenComplaint.getLatitude() + "/" + citizenComplaint.getLongitude());
TextView complaintAddress = (TextView) view.findViewById(R.id.complaintAddressTextView);
complaintAddress.setText(citizenComplaint.getComplaintAddress());
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setView(view)
.setCancelable(false)
.setTitle("Complaint Successful")
.setPositiveButton("Another Complaint", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent newIntent = new Intent(context, CitizenComplaintHomeActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onLocationChanged(Location location) {
citizenComplaint.setComplaintAddress("India");
if (CitizenComplaintUtility.isGeocoderPresent()) {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = null;
try {
addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
} catch (IOException e) {
e.printStackTrace();
}
if (addresses != null && addresses.size() > 0) {
Address address = addresses.get(0);
String complaintAddress = String.format("%s, %s, %s", address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "", address.getLocality(), address.getCountryName());
citizenComplaint.setComplaintAddress(complaintAddress);
}
}
//Important to have these two lines at the last because of thread synchronization.
citizenComplaint.setLatitude(Double.toString(location.getLatitude()));
citizenComplaint.setLongitude(Double.toString(location.getLongitude()));
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
private CitizenComplaintMLADetails getOrCreateMLADetails(String mlaConstituencyId) throws Exception {
JSONObject jsonResponse;
CitizenComplaintMLADetails mlaDetails = citizenComplaintDataSource.getMLADetailsByConstituencyId(mlaConstituencyId);
if (mlaDetails == null) {
jsonResponse = CitizenComplaintHttpUtil.getJSONFromUrl(context, CITIZEN_COMPLAINT_GET_MLA_INFO_URL_PARAMS + "/" + mlaConstituencyId);
if (jsonResponse != null) {
JSONArray nodes = jsonResponse.getJSONArray(NODES_PARAMS);
JSONObject node = nodes.getJSONObject(0).getJSONObject(NODE_PARAMS);
String imageUrl = node.getString(IMAGE_PARAMS);
String mlaName = node.getString(MLA_NAME_PARAMS);
String mlaEmail = node.getString(MLA_EMAIL_PARAMS);
String mlaContactNo = node.getString(MLA_CONTACT_NO_PARAMS);
String mlaConstituency = node.getString(MLA_CONSTITUENCY_PARAMS);
Bitmap mlaImage = CitizenComplaintHttpUtil.getBitmapFromUrl(context, imageUrl);
if (mlaImage != null) {
Uri mlaImageUri = CitizenComplaintUtility.saveBitmapToFileSystem(mlaImage);
mlaDetails = new CitizenComplaintMLADetails(mlaName, mlaEmail, mlaContactNo, mlaConstituencyId, mlaConstituency, mlaImageUri);
citizenComplaintDataSource.createMLADetail(mlaDetails);
}
}
}
return mlaDetails;
}
}