/* * Geopaparazzi - Digital field mapping on Android based devices * Copyright (C) 2010 HydroloGIS (www.hydrologis.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package eu.geopaparazzi.library.forms; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_KEY; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_READONLY; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_SIZE; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_TYPE; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_URL; import static eu.geopaparazzi.library.forms.FormUtilities.TAG_VALUE; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_BOOLEAN; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_DATE; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_DOUBLE; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_LABEL; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_LABELWITHLINE; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_MAP; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_NFCUID; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_PICTURES; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_SKETCH; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_STRING; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_STRINGAREA; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_STRINGCOMBO; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_STRINGMULTIPLECHOICE; import static eu.geopaparazzi.library.forms.FormUtilities.TYPE_TIME; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import eu.geopaparazzi.library.R; import eu.geopaparazzi.library.database.GPLog; import eu.geopaparazzi.library.forms.constraints.Constraints; import eu.geopaparazzi.library.forms.views.GNfcUidView; import eu.geopaparazzi.library.forms.views.GView; import eu.geopaparazzi.library.util.FileUtilities; import eu.geopaparazzi.library.util.LibraryConstants; import eu.geopaparazzi.library.util.ResourcesManager; /** * The fragment detail view. * * @author Andrea Antonello (www.hydrologis.com) */ public class FragmentDetail extends Fragment { private HashMap<String, GView> key2WidgetMap = new HashMap<String, GView>(); private HashMap<Integer, GView> requestCodes2WidgetMap = new HashMap<Integer, GView>(); private HashMap<String, Constraints> key2ConstraintsMap = new HashMap<String, Constraints>(); private List<String> keyList = new ArrayList<String>(); private String selectedFormName; private JSONObject sectionObject; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated( Bundle savedInstanceState ) { super.onActivityCreated(savedInstanceState); } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { View view = inflater.inflate(R.layout.details, container, false); LinearLayout mainView = (LinearLayout) view.findViewById(R.id.form_linear); try { FragmentActivity activity = getActivity(); if (selectedFormName == null || sectionObject == null) { FragmentList listFragment = (FragmentList) getFragmentManager().findFragmentById(R.id.listFragment); if (listFragment != null) { selectedFormName = listFragment.getSelectedItemName(); sectionObject = listFragment.getSectionObject(); } else { if (activity instanceof FragmentDetailActivity) { // case of portrait mode FragmentDetailActivity fragmentDetailActivity = (FragmentDetailActivity) activity; selectedFormName = fragmentDetailActivity.getFormName(); sectionObject = fragmentDetailActivity.getSectionObject(); } } } if (selectedFormName != null) { JSONObject formObject = TagsManager.getForm4Name(selectedFormName, sectionObject); key2WidgetMap.clear(); requestCodes2WidgetMap.clear(); int requestCode = 666; keyList.clear(); key2ConstraintsMap.clear(); JSONArray formItemsArray = TagsManager.getFormItems(formObject); int length = formItemsArray.length(); for( int i = 0; i < length; i++ ) { JSONObject jsonObject = formItemsArray.getJSONObject(i); String key = "-"; //$NON-NLS-1$ if (jsonObject.has(TAG_KEY)) key = jsonObject.getString(TAG_KEY).trim(); String value = ""; //$NON-NLS-1$ if (jsonObject.has(TAG_VALUE)) { value = jsonObject.getString(TAG_VALUE).trim(); } String type = FormUtilities.TYPE_STRING; if (jsonObject.has(TAG_TYPE)) { type = jsonObject.getString(TAG_TYPE).trim(); } boolean readonly = false; if (jsonObject.has(TAG_READONLY)) { String readonlyStr = jsonObject.getString(TAG_READONLY).trim(); readonly = Boolean.parseBoolean(readonlyStr); } Constraints constraints = new Constraints(); FormUtilities.handleConstraints(jsonObject, constraints); key2ConstraintsMap.put(key, constraints); String constraintDescription = constraints.getDescription(); GView addedView = null; if (type.equals(TYPE_STRING)) { addedView = FormUtilities.addEditText(activity, mainView, key, value, 0, 0, constraintDescription, readonly); } else if (type.equals(TYPE_STRINGAREA)) { addedView = FormUtilities.addEditText(activity, mainView, key, value, 0, 7, constraintDescription, readonly); } else if (type.equals(TYPE_DOUBLE)) { addedView = FormUtilities.addEditText(activity, mainView, key, value, 1, 0, constraintDescription, readonly); } else if (type.equals(TYPE_DATE)) { addedView = FormUtilities.addDateView(FragmentDetail.this, mainView, key, value, constraintDescription, readonly); } else if (type.equals(TYPE_TIME)) { addedView = FormUtilities.addTimeView(FragmentDetail.this, mainView, key, value, constraintDescription, readonly); } else if (type.equals(TYPE_LABEL)) { String size = "20"; //$NON-NLS-1$ if (jsonObject.has(TAG_SIZE)) size = jsonObject.getString(TAG_SIZE); String url = null; if (jsonObject.has(TAG_URL)) url = jsonObject.getString(TAG_URL); addedView = FormUtilities.addTextView(activity, mainView, value, size, false, url); } else if (type.equals(TYPE_LABELWITHLINE)) { String size = "20"; //$NON-NLS-1$ if (jsonObject.has(TAG_SIZE)) size = jsonObject.getString(TAG_SIZE); String url = null; if (jsonObject.has(TAG_URL)) url = jsonObject.getString(TAG_URL); addedView = FormUtilities.addTextView(activity, mainView, value, size, true, url); } else if (type.equals(TYPE_BOOLEAN)) { addedView = FormUtilities.addBooleanView(activity, mainView, key, value, constraintDescription, readonly); } else if (type.equals(TYPE_STRINGCOMBO)) { JSONArray comboItems = TagsManager.getComboItems(jsonObject); String[] itemsArray = TagsManager.comboItems2StringArray(comboItems); addedView = FormUtilities.addComboView(activity, mainView, key, value, itemsArray, constraintDescription); } else if (type.equals(TYPE_STRINGMULTIPLECHOICE)) { JSONArray comboItems = TagsManager.getComboItems(jsonObject); String[] itemsArray = TagsManager.comboItems2StringArray(comboItems); addedView = FormUtilities.addMultiSelectionView(activity, mainView, key, value, itemsArray, constraintDescription); } else if (type.equals(TYPE_PICTURES)) { addedView = FormUtilities.addPictureView(activity, mainView, key, value, constraintDescription); } else if (type.equals(TYPE_SKETCH)) { addedView = FormUtilities.addSketchView(activity, mainView, key, value, constraintDescription); } else if (type.equals(TYPE_MAP)) { if (value == null || value.length() <= 0) { File applicationDir = ResourcesManager.getInstance(activity).getApplicationDir(); File mediaDir = ResourcesManager.getInstance(activity).getMediaDir(); File tmpImage = new File(applicationDir, LibraryConstants.TMPPNGIMAGENAME); if (tmpImage.exists()) { Date currentDate = new Date(); String currentDatestring = LibraryConstants.TIMESTAMPFORMATTER.format(currentDate); File newImageFile = new File(mediaDir, "IMG_" + currentDatestring + ".png"); //$NON-NLS-1$ //$NON-NLS-2$ FileUtilities.copyFile(tmpImage, newImageFile); value = newImageFile.getParentFile().getName() + File.separator + newImageFile.getName(); } } addedView = FormUtilities.addMapView(activity, mainView, key, value, constraintDescription); } else if (type.equals(TYPE_NFCUID)) { addedView = new GNfcUidView(this, null, requestCode, mainView, key, value, constraintDescription); } else { GPLog.addLogEntry(this, null, null, "Type non implemented yet: " + type); } key2WidgetMap.put(key, addedView); keyList.add(key); requestCodes2WidgetMap.put(requestCode, addedView); requestCode++; } } } catch (Exception e) { e.printStackTrace(); } return view; } public void onActivityResult( int requestCode, int resultCode, Intent data ) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { GView gView = requestCodes2WidgetMap.get(requestCode); if (gView != null) { gView.setOnActivityResult(data); } } } public JSONObject getSectionObject() { return sectionObject; } public void setForm( String selectedItemName, JSONObject sectionObject ) { this.selectedFormName = selectedItemName; this.sectionObject = sectionObject; } /** * Store the form items the widgets. * * @param doConstraintsCheck if <code>true</code>, a check on all constraints is performed. * @return <code>null</code>, if everything was saved properly, the key of the items * that didn't pass the constraint check. * @throws Exception */ public String storeFormItems( boolean doConstraintsCheck ) throws Exception { if (selectedFormName == null) { return null; } JSONObject form4Name = TagsManager.getForm4Name(selectedFormName, sectionObject); JSONArray formItems = TagsManager.getFormItems(form4Name); // update the items for( String key : keyList ) { Constraints constraints = key2ConstraintsMap.get(key); GView view = key2WidgetMap.get(key); if (view != null) { String text = view.getValue(); if (doConstraintsCheck && !constraints.isValid(text)) { return key; } try { if (text != null) FormUtilities.update(formItems, key, text); } catch (JSONException e) { GPLog.error(this, e.getLocalizedMessage(), e); e.printStackTrace(); } } } FragmentList listFragment = (FragmentList) getFragmentManager().findFragmentById(R.id.listFragment); if (listFragment != null) { FormUtilities.updateExtras(formItems, listFragment.getLatitude(), listFragment.getLongitude()); } else { FragmentActivity activity = getActivity(); if (activity instanceof FragmentDetailActivity) { // case of portrait mode FragmentDetailActivity fragmentDetailActivity = (FragmentDetailActivity) activity; FormUtilities .updateExtras(formItems, fragmentDetailActivity.getLatitude(), fragmentDetailActivity.getLongitude()); } else { throw new RuntimeException("Fragmentlist not available"); //$NON-NLS-1$ } } return null; } }