Android Open Source - geoar-app Geo A R Application






From Project

Back to project page geoar-app.

License

The source code is released under:

Apache License

If you think the Android project geoar-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2012 52North Initiative for Geospatial Open Source Software GmbH
 *//from   w  w  w  . j  a  v a  2  s .  c om
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.n52.geoar;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.List;

import org.n52.geoar.utils.DataSourceLoggerFactory;
import org.n52.geoar.utils.DataSourceLoggerFactory.LoggerCallable;
import org.n52.geoar.newdata.PluginLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import android.app.Activity;
import android.app.Application;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;

public class GeoARApplication extends Application {
  private static Logger LOG;

  public static Context applicationContext;

  public static final String PREFERENCES_FILE = "GeoAR";
  private static final String STACKTRACE_FILENAME = "stacktrace.log";
  private static final String LOG_FILEPATH = "logs/logfile.txt";
  private static final String REPORT_EMAIL = "geoar@52north.org";

  private UncaughtExceptionHandler defaultUncaughtExceptionHandler;

  private static File stacktraceFile;
  private static File logFile;

  @Override
  public void onCreate() {
    // Store application Context as static field
    applicationContext = getApplicationContext();

    // File to save uncaught exception trace to
    stacktraceFile = new File(applicationContext.getFilesDir(),
        STACKTRACE_FILENAME);
    // File path to logfile
    logFile = new File(applicationContext.getFilesDir() + "/"
        + LOG_FILEPATH);
    // Set system properties with log file, logback config references to
    // these,
    // so do not use LoggerFactory before this point
    System.setProperty("LOG_DIR", logFile.getParent());
    int sepIndex = logFile.getName().lastIndexOf(".");
    System.setProperty("LOG_NAME", logFile.getName().substring(0, sepIndex));
    System.setProperty("LOG_EXT", logFile.getName().substring(sepIndex + 1));

    LOG = LoggerFactory.getLogger(GeoARApplication.class);

    // Set uncaught exception handler
    defaultUncaughtExceptionHandler = Thread
        .getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

      @Override
      public void uncaughtException(Thread thread, Throwable ex) {
        LOG.error("Uncaught exception in thread " + thread.getName(),
            ex);
        try {
          FileOutputStream fos = openFileOutput(STACKTRACE_FILENAME,
              Context.MODE_PRIVATE);
          ex.printStackTrace(new PrintStream(fos));
          fos.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }

        // fall back to standard handler
        if (defaultUncaughtExceptionHandler != null) {
          defaultUncaughtExceptionHandler.uncaughtException(thread,
              ex);
        }
      }
    });

    // ensure that plugins can access the main logger
    DataSourceLoggerFactory.setLoggerCallable(new LoggerCallable() {
      @Override
      public org.n52.geoar.utils.DataSourceLoggerFactory.Logger call(
          Class<?> clazz) {
        return new PluginLogger(clazz);
      }
    });

    super.onCreate();
  }

  /**
   * Checks if there is a recorded stacktrace
   */
  public static boolean checkAppFailed() {
    return stacktraceFile.exists();
  }

  /**
   * Deletes latest stacktrace record
   */
  public static void clearAppFailed() {
    if (!checkAppFailed())
      return;

    new File(applicationContext.getFilesDir(), STACKTRACE_FILENAME)
        .delete();
  }

  /**
   * Creates an {@link Intent#ACTION_SEND_MULTIPLE} Intent to create an email
   * with last stacktrace and current logfiles as attachments.
   * 
   * @param context
   */
  public static void sendFailMail(Activity context) {
    List<File> attachments = new ArrayList<File>();
    if (checkAppFailed()) {
      attachments.add(stacktraceFile);
    }

    if (logFile.exists()) {
      attachments.add(logFile);
    }
    sendMail(context, "GeoAR Error Report",
        applicationContext.getString(R.string.text_error_report),
        attachments);
  }

  /**
   * Copies specified {@link File}s to globally readable locations and returns
   * their {@link Uri}s
   * 
   * @param attachments
   * @return
   * @throws IOException
   */
  private static ArrayList<Uri> getFailAttachments(List<File> attachments)
      throws IOException {
    ArrayList<Uri> copiesUris = new ArrayList<Uri>(attachments.size());
    for (int i = 0, attachmentsSize = attachments.size(); i < attachmentsSize; i++) {

      InputStream inputStream = new FileInputStream(attachments.get(i));
      int sepIndex = attachments.get(i).getName().lastIndexOf(".");
      attachments.get(i).getName().substring(sepIndex);

      File fileCopy = new File(
          applicationContext.getExternalFilesDir(null), "fail_"
              + i
              + attachments.get(i).getName()
                  .substring(sepIndex + 1));
      copiesUris.add(Uri.fromFile(fileCopy));
      OutputStream outputStream = new FileOutputStream(fileCopy);

      byte[] buf = new byte[4096];
      int len;
      while ((len = inputStream.read(buf)) > 0) {
        outputStream.write(buf, 0, len);
      }
      inputStream.close();
      outputStream.close();
    }

    return copiesUris;
  }

  public static void sendFeedbackMail(Activity context) {
    List<File> attachments = new ArrayList<File>();
    if (logFile.exists()) {
      attachments.add(logFile);
    }
    sendMail(context, "GeoAR Feedback Report",
        applicationContext.getString(R.string.text_feedback_report),
        attachments);
  }

  private static void sendMail(Activity context, String subject,
      String message, List<File> attachments) {
    Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_TEXT, message);
    intent.putExtra(Intent.EXTRA_EMAIL, new String[] { REPORT_EMAIL });

    try {
      intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,
          getFailAttachments(attachments));
      context.startActivity(intent);
    } catch (ActivityNotFoundException e) {
      Toast.makeText(context, R.string.could_not_find_email_application,
          Toast.LENGTH_LONG).show();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}




Java Source Code List

.DataSourcesOverlay.java
.VisualizationOverlayItem.java
org.n52.geoar.AboutDialog.java
org.n52.geoar.DataSourceListAdapter.java
org.n52.geoar.GeoARActivity.java
org.n52.geoar.GeoARApplication.java
org.n52.geoar.ar.view.ARFragment.java
org.n52.geoar.ar.view.ARObject.java
org.n52.geoar.ar.view.ARView.java
org.n52.geoar.ar.view.DataSourceVisualizationHandler.java
org.n52.geoar.ar.view.IntroController.java
org.n52.geoar.ar.view.IntroViewer.java
org.n52.geoar.ar.view.gl.ARSurfaceViewRenderer.java
org.n52.geoar.ar.view.gl.ARSurfaceView.java
org.n52.geoar.ar.view.gl.GLESCamera.java
org.n52.geoar.ar.view.gl.MultisampleConfigs.java
org.n52.geoar.ar.view.gl.SurfaceTopology.java
org.n52.geoar.ar.view.overlay.ARCanvasSurfaceView.java
org.n52.geoar.ar.view.overlay.GUIDrawable.java
org.n52.geoar.ar.view.overlay.Radar.java
org.n52.geoar.exception.UnsupportedGeometryType.java
org.n52.geoar.map.view.DataSourceOverlayHandler.java
org.n52.geoar.map.view.GeoARMapView.java
org.n52.geoar.map.view.MapActivityContext.java
org.n52.geoar.map.view.MapFragment.java
org.n52.geoar.map.view.overlay.DataSourceOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePointOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolygonOverlay.java
org.n52.geoar.map.view.overlay.DataSourcePolylineOverlay.java
org.n52.geoar.map.view.overlay.DataSourcesOverlay.java
org.n52.geoar.map.view.overlay.OverlayType.java
org.n52.geoar.map.view.overlay.PointOverlayType.java
org.n52.geoar.map.view.overlay.PolygonOverlayType.java
org.n52.geoar.map.view.overlay.PolylineOverlayType.java
org.n52.geoar.newdata.CheckList.java
org.n52.geoar.newdata.DataCache.java
org.n52.geoar.newdata.DataSourceHolder.java
org.n52.geoar.newdata.DataSourceInstanceHolder.java
org.n52.geoar.newdata.DataSourceInstanceSettingsDialogActivity.java
org.n52.geoar.newdata.InstalledPluginHolder.java
org.n52.geoar.newdata.PluginActivityContext.java
org.n52.geoar.newdata.PluginContext.java
org.n52.geoar.newdata.PluginDialogFragment.java
org.n52.geoar.newdata.PluginDownloadHolder.java
org.n52.geoar.newdata.PluginDownloader.java
org.n52.geoar.newdata.PluginFragment.java
org.n52.geoar.newdata.PluginGridAdapter.java
org.n52.geoar.newdata.PluginHolder.java
org.n52.geoar.newdata.PluginLoader.java
org.n52.geoar.newdata.PluginLogger.java
org.n52.geoar.newdata.PluginStateInputStream.java
org.n52.geoar.newdata.Tile.java
org.n52.geoar.settings.DateTimeSettingsViewField.java
org.n52.geoar.settings.DateUtils.java
org.n52.geoar.settings.NumberSettingsViewField.java
org.n52.geoar.settings.SettingsException.java
org.n52.geoar.settings.SettingsHelper.java
org.n52.geoar.settings.SettingsViewField.java
org.n52.geoar.settings.SettingsView.java
org.n52.geoar.settings.SpinnerSettingsViewField.java
org.n52.geoar.settings.StringSettingsViewField.java
org.n52.geoar.tracking.camera.CameraView.java
org.n52.geoar.tracking.camera.RealityCamera.java
org.n52.geoar.tracking.location.AdaptiveLowPassSensorBuffer.java
org.n52.geoar.tracking.location.LocationHandler.java
org.n52.geoar.tracking.location.LowPassSensorBuffer.java
org.n52.geoar.tracking.location.MeanSensorBuffer.java
org.n52.geoar.tracking.location.SensorBuffer.java
org.n52.geoar.view.InfoView.java
org.n52.geoar.view.geoar.CalibrationControlView.java
org.n52.geoar.view.geoar.Settings.java
org.n52.geoar.view.geoar.gl.mode.BilligerColorShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerLightShader.java
org.n52.geoar.view.geoar.gl.mode.BilligerTextureShader.java
org.n52.geoar.view.geoar.gl.mode.BoundingBox.java
org.n52.geoar.view.geoar.gl.mode.FeatureShader.java
org.n52.geoar.view.geoar.gl.mode.PhongFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.RenderFeature2.java
org.n52.geoar.view.geoar.gl.mode.Spatial.java
org.n52.geoar.view.geoar.gl.mode.TextureFeatureShader.java
org.n52.geoar.view.geoar.gl.mode.Texture.java
org.n52.geoar.view.geoar.gl.mode.features.CubeFeature2.java
org.n52.geoar.view.geoar.gl.mode.features.FlatCircleFeature.java
org.n52.geoar.view.geoar.gl.mode.features.HeightMapFeature.java
org.n52.geoar.view.geoar.gl.mode.features.NewGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.ReferencedGridFeature.java
org.n52.geoar.view.geoar.gl.mode.features.SphereFeature.java
org.n52.geoar.view.geoar.gl.mode.features.TriangleFeature.java