package org.ecomap.android.app.activities; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.Snackbar; import android.support.design.widget.TextInputLayout; import android.support.v4.widget.NestedScrollView; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.UiSettings; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import org.ecomap.android.app.R; import org.ecomap.android.app.User; import org.ecomap.android.app.data.EcoMapContract; import org.ecomap.android.app.data.model.ProblemPhotoEntry; import org.ecomap.android.app.fragments.EcoMapFragment; import org.ecomap.android.app.sync.UploadingServiceSession; import org.ecomap.android.app.tasks.AddProblemTask; import org.ecomap.android.app.utils.AddPhotoImageAdapter; import org.ecomap.android.app.utils.MapClustering; import org.ecomap.android.app.utils.NetworkAvailability; import org.ecomap.android.app.utils.SharedPreferencesHelper; import org.ecomap.android.app.utils.SnackBarHelper; import org.ecomap.android.app.widget.NonScrollableListView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import me.iwf.photopicker.PhotoPickerActivity; import me.iwf.photopicker.utils.PhotoPickerIntent; public class AddProblemActivity extends AppCompatActivity implements UploadingServiceSession.Callbacks { private EditText problemTitle; private EditText problemDescription; private EditText problemSolution; private TextInputLayout tilProblemTitle; private static NonScrollableListView nonScrollableListView; public static final ArrayList<ProblemPhotoEntry> selectedPhotos = new ArrayList<>(); private AddPhotoImageAdapter imgAdapter; private final int REQUEST_CODE = 1; private int problemType; private GoogleMap mMap; private MapClustering mapClusterer; private LatLng markerPosition; private CameraPosition cameraPosition; private static Context mContext; private UploadingServiceSession mServiceSession; @Override protected void onResume() { super.onResume(); mServiceSession.doBindService(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_problem); mContext = this; SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.add_problem_map); mMap = mapFragment.getMap(); UiSettings uiSettings = mMap.getUiSettings(); uiSettings.setMapToolbarEnabled(false); mapClusterer = new MapClustering(mMap, mContext); markerPosition = EcoMapFragment.getMarkerPosition(); cameraPosition = EcoMapFragment.getCameraPosition(); setMarkerToMap(); mServiceSession = new UploadingServiceSession(this, getClass().getCanonicalName(), this); problemTitle = (EditText) findViewById(R.id.problemTitle); problemDescription = (EditText) findViewById(R.id.problemDescription); problemSolution = (EditText) findViewById(R.id.problemSolution); tilProblemTitle = (TextInputLayout) findViewById(R.id.til_problemTitle); tilProblemTitle.setErrorEnabled(true); TextInputLayout tilProblemDescription = (TextInputLayout) findViewById(R.id.til_problemDescription); tilProblemDescription.setErrorEnabled(true); TextInputLayout tilProblemSolution = (TextInputLayout) findViewById(R.id.til_problemSolution); tilProblemSolution.setErrorEnabled(true); Spinner spinner = (Spinner) findViewById(R.id.spinner); Button addPhotoButton = (Button) findViewById(R.id.add_photo); nonScrollableListView = (NonScrollableListView) findViewById(R.id.add_problem_non_scrollable_list_view); imgAdapter = new AddPhotoImageAdapter(selectedPhotos); nonScrollableListView.setAdapter(imgAdapter); Toolbar toolbar = (Toolbar) findViewById(R.id.add_problem_toolbar); setSupportActionBar(toolbar); try { ActionBar ab = getSupportActionBar(); if (ab != null) { ab.setDisplayHomeAsUpEnabled(true); } } catch (NullPointerException e) { e.printStackTrace(); } CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.add_problem_collapsing_toolbar); collapsingToolbar.setTitle(getString(R.string.item_addProblem)); collapsingToolbar.setExpandedTitleColor(getResources().getColor(android.R.color.transparent)); problemTitle.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (problemTitle.getText().toString().isEmpty()) { tilProblemTitle.setError(getString(R.string.problem_title_blank)); } else { tilProblemTitle.setErrorEnabled(false); } } else { if (!problemTitle.getText().toString().isEmpty()) { tilProblemTitle.setErrorEnabled(false); } } } }); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { problemType = position + 1; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { markerPosition = latLng; EcoMapFragment.setMarkerPosition(markerPosition); mapClusterer.addMarkerToMap(markerPosition); } }); addPhotoButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Send intent to library for picking photos PhotoPickerIntent intent = new PhotoPickerIntent(mContext); intent.setPhotoCount(8); intent.setShowCamera(true); startActivityForResult(intent, REQUEST_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //Getting photo paths from lib if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) { if (data != null) { selectedPhotos.clear(); final ArrayList<String> list = data.getStringArrayListExtra(PhotoPickerActivity.KEY_SELECTED_PHOTOS); for (String imgURL : list) { selectedPhotos.add(new ProblemPhotoEntry("", imgURL)); } imgAdapter.updateDataSet(selectedPhotos); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_add_problem, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: EcoMapFragment.disableAddProblemMode(); selectedPhotos.clear(); this.finish(); return true; case R.id.add_problem_done_menu_item: sendProblemToServer(); hideSoftInput(); default: return super.onOptionsItemSelected(item); } } @Override protected void onStop() { mServiceSession.doUnbindService(); super.onStop(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } @Override public void onBackPressed() { EcoMapFragment.disableAddProblemMode(); selectedPhotos.clear(); super.onBackPressed(); } @Override public void allTasksFinished() { selectedPhotos.clear(); } public static NonScrollableListView getNonScrollableListView() { return nonScrollableListView; } private void hideSoftInput() { InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(INPUT_METHOD_SERVICE); View v = this.getCurrentFocus(); inputMethodManager.hideSoftInputFromWindow(v != null ? v.getWindowToken() : null, 0); } private void setMarkerToMap() { if (markerPosition != null) { mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(markerPosition, cameraPosition.zoom)); mapClusterer.addMarkerToMap(markerPosition); } } private void sendProblemToServer() { if (!problemTitle.getText().toString().isEmpty()) { tilProblemTitle.setErrorEnabled(false); String[] params = new String[9]; params[0] = "UNSOLVED"; params[1] = "3"; params[2] = problemTitle.getText().toString(); params[3] = String.valueOf(problemType); params[4] = problemDescription.getText().toString(); params[5] = problemSolution.getText().toString(); params[6] = "1"; params[7] = String.valueOf(markerPosition.latitude); params[8] = String.valueOf(markerPosition.longitude); if (new NetworkAvailability(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).isNetworkAvailable()) { if (mServiceSession.isBound()) { new AddProblemTask(mContext, mServiceSession, this).execute(params); } } else { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); ContentValues contentValuesProblems = new ContentValues(); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_STATUS, params[0]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_SEVERITY, params[1]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_TITLE, params[2]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_PROBLEM_TYPE_ID, params[3]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_CONTENT, params[4]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_PROPOSAL, params[5]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_REGION_ID, params[6]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_LATITUDE, params[7]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_LONGTITUDE, params[8]); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_USER_FIRST_NAME, User.getFirstName()); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_USER_LAST_NAME, User.getLastName()); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_DATE, format.format(new Date())); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_USER_ID, User.getUserId()); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_COMMENTS_NUMBER, 0); contentValuesProblems.put(EcoMapContract.ProblemsEntry.COLUMN_NUMBER_OF_VOTES, 0); JSONArray pendingIDsArray = new JSONArray(); //Checking selected photos if (!selectedPhotos.isEmpty()) { for (int i = 0; i < selectedPhotos.size(); i++) { //Get path for each photo final ProblemPhotoEntry photoEntry = selectedPhotos.get(i); final String path = photoEntry.getImgURL(); final String comment = photoEntry.getCaption(); //Start new AsyncTask for each photo and comment (test problem ID is 361) try { JSONObject jsonObject = new JSONObject(); jsonObject.put("path", path); jsonObject.put("comment", comment); pendingIDsArray.put(jsonObject); } catch (JSONException e) { e.printStackTrace(); } } } try { ContentValues contentValuesPendingIDs = new ContentValues(); Uri uri_id = getContentResolver().insert(EcoMapContract.ProblemsEntry.CONTENT_URI, contentValuesProblems); long res_id = ContentUris.parseId(uri_id); contentValuesPendingIDs.put(EcoMapContract.PendingProblemsEntry.COLUMN_PROBLEM_ID, String.valueOf(res_id)); contentValuesPendingIDs.put(EcoMapContract.PendingProblemsEntry.COLUMN_PHOTOS, pendingIDsArray.toString()); Uri res = getContentResolver().insert(EcoMapContract.PendingProblemsEntry.CONTENT_URI, contentValuesPendingIDs); res_id = ContentUris.parseId(res); if (res_id > 0) SharedPreferencesHelper.setFlagPendingProblemsOn(); }catch (SQLiteException e){ String LOG_TAG = AddProblemActivity.class.getSimpleName(); Log.e(LOG_TAG, e.getMessage(), e); } EcoMapFragment.disableAddProblemMode(); finish(); SnackBarHelper.showInfoSnackBar(this, R.string.check_internet, Snackbar.LENGTH_LONG); } } else { tilProblemTitle.setError(getString(R.string.problem_title_blank)); SnackBarHelper.showWarningSnackBar(this, R.string.problem_title_blank, Snackbar.LENGTH_SHORT); } } }