br.org.funcate.dynamicforms.FormActivity.java Source code

Java tutorial

Introduction

Here is the source code for br.org.funcate.dynamicforms.FormActivity.java

Source

/*
 * 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 br.org.funcate.dynamicforms;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import br.org.funcate.dynamicforms.constraints.Constraints;
import br.org.funcate.dynamicforms.util.LibraryConstants;
import br.org.funcate.dynamicforms.util.Utilities;

import static br.org.funcate.dynamicforms.FormUtilities.TAG_IS_RENDER_LABEL;
import static br.org.funcate.dynamicforms.FormUtilities.TAG_KEY;
import static br.org.funcate.dynamicforms.FormUtilities.TAG_VALUE;

/**
 * The form activity.
 * <p/>
 * <p>This returns an array of {@link String} data that can be retrieved
 * through: {@link LibraryConstants#PREFS_KEY_FORM} and contain:</p>
 * <ul>
 * <li>longitude</li>
 * <li>latitude</li>
 * <li>elevation (or -1.0)</li>
 * <li>timestamp</li>
 * <li>a name for the form</li>
 * <li>the filled form data json</li>
 * </ul>
 *
 * @author Andrea Antonello (www.hydrologis.com)
 */
@SuppressWarnings("nls")
public class FormActivity extends FragmentActivity {

    private double latitude = -9999.0;
    private double longitude = -9999.0;
    private double elevation = -9999.0;
    private String sectionName;
    private JSONObject sectionObject;
    private List<String> formNames4Section = new ArrayList<String>();
    private String sectionObjectString;
    private long noteId = -1;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // make sure the orientation can't be changed once this activity started
        int currentOrientation = getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            sectionName = extras.getString(LibraryConstants.PREFS_KEY_FORM_NAME);
            sectionObjectString = extras.getString(LibraryConstants.PREFS_KEY_FORM_JSON);
            latitude = extras.getDouble(LibraryConstants.LATITUDE);
            longitude = extras.getDouble(LibraryConstants.LONGITUDE);
            elevation = extras.getDouble(LibraryConstants.ELEVATION);
            noteId = extras.getLong(LibraryConstants.SELECTED_POINT_ID);
        }

        try {
            if (sectionObjectString == null) {
                sectionObject = TagsManager.getInstance(this).getSectionByName(sectionName);
                // copy the section object, which will be kept around along the activity
                sectionObjectString = sectionObject.toString();
            }

            sectionObject = new JSONObject(sectionObjectString);
            formNames4Section = TagsManager.getFormNames4Section(sectionObject);
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
        setContentView(R.layout.form);

    }

    /**
     * @return the list of titles.
     */
    public List<String> getFragmentTitles() {
        return formNames4Section;
    }

    public long getNoteId() {
        return noteId;
    }

    /**
     * @return the section names.
     */
    public String getSectionName() {
        return sectionName;
    }

    /**
     * @return the section object.
     */
    public JSONObject getSectionObject() {
        return sectionObject;
    }

    /**
     * @param sectionObject teh object to set.
     */
    public void setSectionObject(JSONObject sectionObject) {
        this.sectionObject = sectionObject;
    }

    /**
     * @return the lat
     */
    public double getLatitude() {
        return latitude;
    }

    /**
     * @return the lon
     */
    public double getLongitude() {
        return longitude;
    }

    /**
     * Save action.
     *
     * @param view parent.
     */
    public void saveClicked(View view) {
        try {
            saveAction();
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
            Utilities.messageDialog(this, e.getLocalizedMessage(), null);
        }
    }

    /**
     * Cancel action.
     *
     * @param view parent.
     */
    public void cancelClicked(View view) {
        finish();
    }

    private void saveAction() throws Exception {
        // if in landscape mode store last inserted info, since that fragment has not been stored
        FragmentDetail detailFragment = (FragmentDetail) getSupportFragmentManager()
                .findFragmentById(R.id.detailFragment);
        if (detailFragment != null) {
            detailFragment.storeFormItems(false);
        }

        // extract and check constraints
        List<String> availableFormNames = TagsManager.getFormNames4Section(sectionObject);
        String renderingLabel = null;
        for (String formName : availableFormNames) {
            JSONObject formObject = TagsManager.getForm4Name(formName, sectionObject);

            JSONArray formItemsArray = TagsManager.getFormItems(formObject);
            if (formItemsArray == null)
                continue;

            int length = formItemsArray.length();

            String value = null;
            for (int i = 0; i < length; i++) {
                JSONObject jsonObject = formItemsArray.getJSONObject(i);

                String key = "-";
                if (jsonObject.has(TAG_KEY))
                    key = jsonObject.getString(TAG_KEY).trim();

                if (jsonObject.has(TAG_VALUE)) {
                    value = jsonObject.getString(TAG_VALUE).trim();
                }
                if (jsonObject.has(TAG_IS_RENDER_LABEL)) {
                    String isRenderingLabelStr = jsonObject.getString(TAG_IS_RENDER_LABEL).trim();
                    boolean isRenderingLabel = Boolean.parseBoolean(isRenderingLabelStr);
                    if (isRenderingLabel)
                        renderingLabel = value;
                }

                // inject latitude
                if (key.equals(LibraryConstants.LATITUDE)) {
                    String latitudeString = String.valueOf(latitude);
                    value = latitudeString;
                    jsonObject.put(TAG_VALUE, latitudeString);
                }
                // inject longitude
                if (key.equals(LibraryConstants.LONGITUDE)) {
                    String longitudeString = String.valueOf(longitude);
                    value = longitudeString;
                    jsonObject.put(TAG_VALUE, longitudeString);
                }

                Constraints constraints = FormUtilities.handleConstraints(jsonObject, null);
                if (value == null || !constraints.isValid(value)) {
                    String constraintDescription = constraints.getDescription();
                    String validfieldMsg = getString(R.string.form_field_check);
                    String msg = Utilities.format(validfieldMsg, key, formName, constraintDescription);
                    Utilities.messageDialog(this, msg, null);
                    return;
                }
            }
        }

        // finally store data
        String sectionObjectString = sectionObject.toString();
        long timestamp = System.currentTimeMillis();

        if (renderingLabel == null) {
            renderingLabel = sectionName;
        }
        String[] formDataArray = { //
                String.valueOf(noteId), //
                String.valueOf(longitude), //
                String.valueOf(latitude), //
                String.valueOf(elevation), //
                String.valueOf(timestamp), //
                renderingLabel, //
                "POI", //
                sectionObjectString };
        Intent intent = getIntent();
        intent.putExtra(LibraryConstants.PREFS_KEY_FORM, formDataArray);
        setResult(Activity.RESULT_OK, intent);
        finish();
    }

    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // force to exit through the exit button, in order to avoid losing info
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}