StorageHelper can save Tracks as JSON to storage

master
y20k 2016-09-21 14:51:36 +02:00
parent 5c0a694667
commit 403cb3f134
3 changed files with 163 additions and 3 deletions

View File

@ -8,8 +8,8 @@ android {
applicationId "org.y20k.trackbook" applicationId "org.y20k.trackbook"
minSdkVersion 22 minSdkVersion 22
targetSdkVersion 24 targetSdkVersion 24
versionCode 4 versionCode 5
versionName "0.9.3 (The Great Gig in the Sky)" versionName "0.9.4 (The Great Gig in the Sky)"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
} }
buildTypes { buildTypes {
@ -26,4 +26,5 @@ dependencies {
compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1' compile 'com.android.support:design:24.2.1'
compile 'org.osmdroid:osmdroid-android:5.2@aar' compile 'org.osmdroid:osmdroid-android:5.2@aar'
compile 'com.google.code.gson:gson:2.4'
} }

View File

@ -26,7 +26,7 @@ import android.util.Log;
*/ */
public final class LogHelper { public final class LogHelper {
private final static boolean mTesting = false; private final static boolean mTesting = true;
public static void d(final String tag, String message) { public static void d(final String tag, String message) {
// include logging only in debug versions // include logging only in debug versions

View File

@ -0,0 +1,159 @@
/**
* StorageHelper.java
* Implements the StorageHelper class
* A StorageHelper deals with saving and loading recorded tracks
*
* This file is part of
* TRACKBOOK - Movement Recorder for Android
*
* Copyright (c) 2016 - Y20K.org
* Licensed under the MIT-License
* http://opensource.org/licenses/MIT
*
* Trackbook uses osmdroid - OpenStreetMap-Tools for Android
* https://github.com/osmdroid/osmdroid
*/
package org.y20k.trackbook.helpers;
import android.app.Activity;
import android.os.Environment;
import android.support.v4.os.EnvironmentCompat;
import android.widget.Toast;
import com.google.gson.Gson;
import org.y20k.trackbook.R;
import org.y20k.trackbook.core.Track;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* StorageHelper class
*/
public class StorageHelper implements TrackbookKeys {
/* Define log tag */
private static final String LOG_TAG = StorageHelper.class.getSimpleName();
/* Main class variables */
private final Activity mActivity;
private File mFolder;
/* Constructor */
public StorageHelper(Activity activity) {
mActivity = activity;
mFolder = mActivity.getExternalFilesDir("Tracks");
// mFolder = getTracksDirectory();
// create folder if necessary
if (mFolder != null && !mFolder.exists()) {
LogHelper.v(LOG_TAG, "Creating new folder: " + mFolder.toString());
mFolder.mkdir();
}
}
/* Saves track object to file */
public boolean saveTrack(Track track) {
Date recordingStart = track.getRecordingStart();
if (mFolder.exists() && mFolder.isDirectory() && mFolder.canWrite() && recordingStart != null) {
// construct filename from track recording date
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US);
String fileName = dateFormat.format(recordingStart) + ".trackbook";
File file = new File(mFolder.toString() + "/" + fileName);
// convert to JSON
Gson gson = new Gson();
String json = gson.toJson(track);
// write track
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
LogHelper.v(LOG_TAG, "Saving track to external storage: " + file.toString());
bw.write(json);
} catch (IOException e) {
LogHelper.e(LOG_TAG, "Unable to saving track to external storage (IOException): " + file.toString());
}
return true;
} else {
LogHelper.e(LOG_TAG, "Unable to save track to external storage.");
return false;
}
}
/* Loads given file into memory */
public Track loadTrack (File file) {
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
LogHelper.v(LOG_TAG, "Loading track to external storage: " + file.toString());
String line;
StringBuilder sb = new StringBuilder("");
// read until last line reached
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
// get track from JSON
Gson gson = new Gson();
return gson.fromJson(sb.toString(), Track.class);
} catch (IOException e) {
LogHelper.e(LOG_TAG, "Unable to read file from external storage: " + file.toString());
return null;
}
}
/* Gets the last track from directory */
public File getLastTrack() {
if (mFolder != null && mFolder.isDirectory()) {
File[] files = mFolder.listFiles();
// TODO
return files[0];
}
// TODO
return null;
}
/* Return a write-able sub-directory from external storage */
private File getTracksDirectory() {
String subDirectory = "Tracks";
File[] storage = mActivity.getExternalFilesDirs(subDirectory);
for (File file : storage) {
if (file != null) {
String state = EnvironmentCompat.getStorageState(file);
if (Environment.MEDIA_MOUNTED.equals(state)) {
LogHelper.i(LOG_TAG, "External storage: " + file.toString());
return file;
}
}
}
Toast.makeText(mActivity, R.string.toast_message_no_external_storage, Toast.LENGTH_LONG).show();
LogHelper.e(LOG_TAG, "Unable to access external storage.");
return null;
}
}