From 22df3abb24bcba8fc282bafb6f33254f42385242 Mon Sep 17 00:00:00 2001 From: y20k Date: Wed, 15 Feb 2017 15:29:21 +0100 Subject: [PATCH] track selection is now fully functional (#10) --- AUTHORS.md | 4 +- app/build.gradle | 2 +- .../java/org/y20k/trackbook/MainActivity.java | 2 +- .../trackbook/MainActivityMapFragment.java | 4 +- .../trackbook/MainActivityTrackFragment.java | 72 +++++++++++-- .../org/y20k/trackbook/TrackerService.java | 2 +- .../org/y20k/trackbook/core/TrackBundle.java | 85 +++++++++++++++ .../trackbook/helpers/DropdownAdapter.java | 53 ++------- .../y20k/trackbook/helpers/StorageHelper.java | 102 +++++++++++------- .../y20k/trackbook/helpers/TrackbookKeys.java | 6 +- .../main/res/layout/fragment_main_track.xml | 11 +- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 2 +- 16 files changed, 242 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/org/y20k/trackbook/core/TrackBundle.java diff --git a/AUTHORS.md b/AUTHORS.md index bc2f9e5..1890be2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -5,7 +5,9 @@ AUTHORS Trackbook is designed, developed and maintained by: [y20k](https://github.com/y20k) ### Translations -German version: [y20k](https://github.com/y20k) +Dutch version: [Vistaus](Vistaus) + +German version: [y20k](https://github.com/Vistaus) Japanese version: [naofum](https://github.com/y20k) diff --git a/app/build.gradle b/app/build.gradle index 93ebc54..4905700 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,6 +25,6 @@ dependencies { compile 'com.android.support:appcompat-v7:25.1.1' compile 'com.android.support:design:25.1.1' compile 'com.android.support:cardview-v7:25.1.1' - compile 'org.osmdroid:osmdroid-android:5.6.3' + compile 'org.osmdroid:osmdroid-android:5.6.4' compile 'com.google.code.gson:gson:2.8.0' } diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.java b/app/src/main/java/org/y20k/trackbook/MainActivity.java index 61d07d8..5f1c9e5 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.java @@ -621,7 +621,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { case FRAGMENT_ID_MAP: return getString(R.string.tab_map); case FRAGMENT_ID_TRACK: - return getString(R.string.tab_last_track); + return getString(R.string.tab_last_tracks); } return null; } diff --git a/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java b/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java index 5ca7340..d24abe2 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java @@ -604,7 +604,7 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { protected Void doInBackground(Void... voids) { LogHelper.v(LOG_TAG, "Saving track object in background."); // save track object - mStorageHelper.saveTrack(mTrack, FILE_TYPE_TRACK); + mStorageHelper.saveTrack(mTrack, FILE_MOST_CURRENT_TRACK); return null; } @@ -636,7 +636,7 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { protected Void doInBackground(Void... voids) { LogHelper.v(LOG_TAG, "Loading temporary track object in background."); // load track object - mTrack = mStorageHelper.loadTrack(FILE_TYPE_TEMP); + mTrack = mStorageHelper.loadTrack(FILE_TEMP_TRACK); return null; } diff --git a/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java b/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java index 4c6c35f..f6cd4b4 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java @@ -32,6 +32,7 @@ import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; @@ -50,6 +51,7 @@ import org.y20k.trackbook.helpers.MapHelper; import org.y20k.trackbook.helpers.StorageHelper; import org.y20k.trackbook.helpers.TrackbookKeys; +import java.io.File; import java.text.DateFormat; import java.util.Locale; @@ -57,7 +59,7 @@ import java.util.Locale; /** * MainActivityTrackFragment class */ -public class MainActivityTrackFragment extends Fragment implements TrackbookKeys { +public class MainActivityTrackFragment extends Fragment implements AdapterView.OnItemSelectedListener, TrackbookKeys { /* Define log tag */ private static final String LOG_TAG = MainActivityTrackFragment.class.getSimpleName(); @@ -79,6 +81,7 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys private TextView mRecordingStartView; private TextView mRecordingStopView; private BottomSheetBehavior mStatisticsSheetBehavior; + private int mCurrentTrack; private Track mTrack; private BroadcastReceiver mTrackSavedReceiver; @@ -93,6 +96,13 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys // store activity mActivity = getActivity(); + // get current track + if (savedInstanceState != null) { + mCurrentTrack = savedInstanceState.getInt(INSTANCE_CURRENT_TRACK, 0); + } else { + mCurrentTrack = 0; + } + // create drop-down adapter mDropdownAdapter = new DropdownAdapter(mActivity); @@ -102,9 +112,14 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys public void onReceive(Context context, Intent intent) { if (intent.hasExtra(EXTRA_SAVE_FINISHED) && intent.getBooleanExtra(EXTRA_SAVE_FINISHED, false)) { LogHelper.v(LOG_TAG, "Save operation detected. Start loading the new track."); + // load track and display map and statistics LoadTrackAsyncHelper loadTrackAsyncHelper = new LoadTrackAsyncHelper(); loadTrackAsyncHelper.execute(); + + mDropdownAdapter.refresh(); + mDropdownAdapter.notifyDataSetChanged(); + mDropdown.setSelection(0); } } }; @@ -137,6 +152,8 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys // add compass to map CompassOverlay compassOverlay = new CompassOverlay(mActivity, new InternalCompassOrientationProvider(mActivity), mMapView); compassOverlay.enableCompass(); + // move the compass overlay down a bit + compassOverlay.setCompassCenter(35.0f, 80.0f); mMapView.getOverlays().add(compassOverlay); // initiate map state @@ -167,7 +184,7 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys mTrack = savedInstanceState.getParcelable(INSTANCE_TRACK_TRACK_MAP); displayTrack(); } else if (mTrack == null) { - // load track and display map and statistics + // load track and display map and statistics // todo get via mCurrentTrack LoadTrackAsyncHelper loadTrackAsyncHelper = new LoadTrackAsyncHelper(); loadTrackAsyncHelper.execute(); } else { @@ -221,14 +238,18 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mDropdown.setAdapter(mDropdownAdapter); + mDropdown.setOnItemSelectedListener(this); + } + + @Override public void onResume() { super.onResume(); - StorageHelper storageHelper = new StorageHelper(mActivity); -// mTrackSelectorAdapter = new ArrayAdapter(mActivity, android.R.layout.simple_spinner_dropdown_item, storageHelper.getListOfTracks()); -// mDropdown.setAdapter(mTrackSelectorAdapter); - mDropdown.setAdapter(mDropdownAdapter); } @@ -258,12 +279,32 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys } + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + // update current track + mCurrentTrack = i; + + // get track file + File trackFile = mDropdownAdapter.getItem(i).getTrackFile(); + + // load track and display map and statistics + LoadTrackAsyncHelper loadTrackAsyncHelper = new LoadTrackAsyncHelper(); + loadTrackAsyncHelper.execute(trackFile); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + + @Override public void onSaveInstanceState(Bundle outState) { outState.putDouble(INSTANCE_LATITUDE_TRACK_MAP, mMapView.getMapCenter().getLatitude()); outState.putDouble(INSTANCE_LONGITUDE_TRACK_MAP, mMapView.getMapCenter().getLongitude()); outState.putInt(INSTANCE_ZOOM_LEVEL_TRACK_MAP, mMapView.getZoomLevel()); outState.putParcelable(INSTANCE_TRACK_TRACK_MAP, mTrack); + outState.putInt(INSTANCE_CURRENT_TRACK, mCurrentTrack); super.onSaveInstanceState(outState); } @@ -313,14 +354,23 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys /** * Inner class: Loads track from external storage using AsyncTask */ - private class LoadTrackAsyncHelper extends AsyncTask { + private class LoadTrackAsyncHelper extends AsyncTask { @Override - protected Void doInBackground(Void... voids) { + protected Void doInBackground(File... files) { LogHelper.v(LOG_TAG, "Loading track object in background."); - // load track object + StorageHelper storageHelper = new StorageHelper(mActivity); - mTrack = storageHelper.loadTrack(FILE_TYPE_TRACK); + + if (files.length > 0) { + // load track object from given file + mTrack = storageHelper.loadTrack(files[0]); + } else { + // load track object from most current file + mTrack = storageHelper.loadTrack(FILE_MOST_CURRENT_TRACK); + } + + return null; } @@ -328,6 +378,8 @@ public class MainActivityTrackFragment extends Fragment implements TrackbookKeys protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); LogHelper.v(LOG_TAG, "Loading finished. Displaying map and statistics of track."); + + // display track on map displayTrack(); } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.java b/app/src/main/java/org/y20k/trackbook/TrackerService.java index e0bcc9e..826962b 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.java +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.java @@ -424,7 +424,7 @@ public class TrackerService extends Service implements TrackbookKeys, SensorEven LogHelper.v(LOG_TAG, "Saving temporary track object in background."); // save track object StorageHelper storageHelper = new StorageHelper(TrackerService.this); - storageHelper.saveTrack(mTrack, FILE_TYPE_TEMP); + storageHelper.saveTrack(mTrack, FILE_TEMP_TRACK); return null; } diff --git a/app/src/main/java/org/y20k/trackbook/core/TrackBundle.java b/app/src/main/java/org/y20k/trackbook/core/TrackBundle.java new file mode 100644 index 0000000..08fa97a --- /dev/null +++ b/app/src/main/java/org/y20k/trackbook/core/TrackBundle.java @@ -0,0 +1,85 @@ +/** + * TrackBundle.java + * Implements a TrackBundle + * TrackBundle is a container for file and corresponding name of a track + * + * This file is part of + * TRACKBOOK - Movement Recorder for Android + * + * Copyright (c) 2016-17 - 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.core; + +import org.y20k.trackbook.helpers.LogHelper; + +import java.io.File; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + + +/** + * TrackBundle class + */ +public class TrackBundle { + + /* Define log tag */ + private static final String LOG_TAG = TrackBundle.class.getSimpleName(); + + /* Main class variables */ + private File mTrackFile; + private String mTrackName; + + + /* Constructor */ + public TrackBundle(File file) { + mTrackFile = file; + mTrackName = buildTrackName(file); + } + + + /* Getter for track file */ + public File getTrackFile() { + return mTrackFile; + } + + + /* Getter for track name */ + public String getTrackName() { + return mTrackName; + } + + + /* Builds a readable track name from the track's file name */ + private String buildTrackName(File file) { + + // get file name without extension + String readableTrackName = file.getName(); + readableTrackName = readableTrackName.substring(0, readableTrackName.indexOf(".trackbook")); + + try { + // convert file name to date + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.US); + Date trackDate = dateFormat.parse(readableTrackName); + + // convert date to track name string according to current locale + readableTrackName = DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(trackDate) + " - " + + DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()).format(trackDate); + + } catch (ParseException e) { + LogHelper.w(LOG_TAG, "Unable to parse file name into date object (yyyy-MM-dd-HH-mm-ss): " + e); + } + + return readableTrackName; + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/DropdownAdapter.java b/app/src/main/java/org/y20k/trackbook/helpers/DropdownAdapter.java index 51d6755..7b06422 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/DropdownAdapter.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/DropdownAdapter.java @@ -25,20 +25,21 @@ import android.support.v7.widget.ThemedSpinnerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.BaseAdapter; import android.widget.TextView; import org.y20k.trackbook.R; +import org.y20k.trackbook.core.TrackBundle; import java.io.File; import java.util.ArrayList; -import java.util.Date; import java.util.List; /** * DropdownHelper class */ -public class DropdownAdapter implements ThemedSpinnerAdapter, TrackbookKeys { +public class DropdownAdapter extends BaseAdapter implements ThemedSpinnerAdapter, TrackbookKeys { /* Define log tag */ private static final String LOG_TAG = DropdownAdapter.class.getSimpleName(); @@ -157,6 +158,13 @@ public class DropdownAdapter implements ThemedSpinnerAdapter, TrackbookKeys { } + /* Refreshes the adapter data */ + public void refresh() { + // re-initialize the adapter's array list + initializeTrackBundleList(); + } + + /* Initializes list of track bundles */ private void initializeTrackBundleList() { @@ -172,45 +180,4 @@ public class DropdownAdapter implements ThemedSpinnerAdapter, TrackbookKeys { } - - /** - * Inner class: Container for file and corresponding name of a track - */ - private class TrackBundle { - File trackFile; - String trackName; - - /* Constructor */ - TrackBundle(File file) { - trackFile = file; - trackName = buildTrackName(file); - } - - /* Getter for track fike */ - File getTrackFile() { - return trackFile; - } - - /* Getter for track name */ - String getTrackName() { - return trackName; - } - - /* Builds a readable track name from the track's file name */ - String buildTrackName(File file) { - // todo get date back from track name - Date date = null; - - // todo get name according to current locale - String readableTrackName = null; - - return file.getName(); - // return readableTrackName; - } - - } - /** - * End of inner class - */ - } diff --git a/app/src/main/java/org/y20k/trackbook/helpers/StorageHelper.java b/app/src/main/java/org/y20k/trackbook/helpers/StorageHelper.java index fa85b8b..73f8ccf 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/StorageHelper.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/StorageHelper.java @@ -104,7 +104,7 @@ public class StorageHelper implements TrackbookKeys { if (mFolder != null && mFolder.exists() && mFolder.isDirectory() && mFolder.canWrite() && recordingStart != null && track != null) { // create file object String fileName; - if (fileType == FILE_TYPE_TEMP) { + if (fileType == FILE_TEMP_TRACK) { // case: temp file fileName = FILE_NAME_TEMP + FILE_TYPE_EXTENSION; } else { @@ -130,7 +130,7 @@ public class StorageHelper implements TrackbookKeys { } // if write was successful delete old track files - only if not a temp file - if (fileType != FILE_TYPE_TEMP) { + if (fileType != FILE_TEMP_TRACK) { // include temp file if it exists deleteOldTracks(true); } @@ -146,19 +146,76 @@ public class StorageHelper implements TrackbookKeys { /* Loads given file into memory */ - public Track loadTrack (int fileType) { + public Track loadTrack(int fileType) { // get file reference - File file; - if (fileType == FILE_TYPE_TEMP) { - file = getTempFile(); - } else { - file = getMostCurrentTrack(); + File trackFile; + switch (fileType) { + case FILE_TEMP_TRACK: + trackFile = getTempFile(); + break; + case FILE_MOST_CURRENT_TRACK: + trackFile = getMostCurrentTrack(); + break; + default: + trackFile = null; + break; } + // read & parse file and return track + return readTrackFromFile(trackFile); + } + + + /* Loads given file into memory */ + public Track loadTrack(File file) { + + // get file reference + File trackFile; + if (file != null) { + trackFile = file; + } else { + // fallback + trackFile = getMostCurrentTrack(); + } + + // read & parse file and return track + return readTrackFromFile(trackFile); + } + + + /* Gets a list of .trackbook files - excluding the temp file */ + public File[] getListOfTrackbookFiles() { + // TODO HANDLE CASE: EMPTY FILE LIST + + // get files and sort them + return sortFiles(mFolder.listFiles()); + } + + + /* Gets a list of tracks based on their file names */ + public List getListOfTracks() { + List listOfTracks = new ArrayList(); + + // get files and sort them + File[] files = mFolder.listFiles(); + files = sortFiles(files); + + for (File file : files) { + listOfTracks.add(file.getName()); + } + + // TODO HANDLE CASE: EMPTY FILE LIST + return listOfTracks; + } + + + // loads file and parses it into a track + private Track readTrackFromFile(File file) { + // check if given file was null if (file == null) { - LogHelper.e(LOG_TAG, "Did not receive file object."); + LogHelper.e(LOG_TAG, "Did not receive a file object."); return null; } @@ -186,33 +243,6 @@ public class StorageHelper implements TrackbookKeys { LogHelper.e(LOG_TAG, "Unable to read file from external storage: " + file.toString()); return null; } - - } - - - /* Gets a list of .trackbook files - excluding the temp file */ - public File[] getListOfTrackbookFiles() { - // TODO HANDLE CASE: EMPTY FILE LIST - - // get files and sort them - return sortFiles(mFolder.listFiles()); - } - - - /* Gets a list of tracks based on their file names */ - public List getListOfTracks() { - List listOfTracks = new ArrayList(); - - // get files and sort them - File[] files = mFolder.listFiles(); - files = sortFiles(files); - - for (File file : files) { - listOfTracks.add(file.getName()); - } - - // TODO HANDLE CASE: EMPTY FILE LIST - return listOfTracks; } diff --git a/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java b/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java index 8af9fdd..199afd3 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java @@ -64,6 +64,7 @@ public interface TrackbookKeys { String INSTANCE_LONGITUDE_TRACK_MAP = "longitudeTrackMap"; String INSTANCE_ZOOM_LEVEL_TRACK_MAP = "zoomLevelTrackMap"; String INSTANCE_CURRENT_LOCATION = "currentLocation"; + String INSTANCE_CURRENT_TRACK = "currentTrack"; /* FRAGMENT IDS */ int FRAGMENT_ID_MAP = 0; @@ -89,13 +90,14 @@ public interface TrackbookKeys { int FAB_STATE_DEFAULT = 0; int FAB_STATE_RECORDING = 1; int FAB_STATE_SAVE = 2; - int FILE_TYPE_TEMP = 0; - int FILE_TYPE_TRACK = 1; + int FILE_TEMP_TRACK = 0; + int FILE_MOST_CURRENT_TRACK = 1; String DIRECTORY_NAME = "tracks"; String FILE_TYPE_EXTENSION = ".trackbook"; String FILE_NAME_TEMP = "temp"; + double DEFAULT_LATITUDE = 49.41667; // latitude Nordkapp, Norway double DEFAULT_LONGITUDE = 8.67201; // longitude Nordkapp, Norway } diff --git a/app/src/main/res/layout/fragment_main_track.xml b/app/src/main/res/layout/fragment_main_track.xml index 977f134..07f7d9e 100644 --- a/app/src/main/res/layout/fragment_main_track.xml +++ b/app/src/main/res/layout/fragment_main_track.xml @@ -19,6 +19,7 @@ android:layout_height="match_parent" android:contentDescription="@string/descr_map_last_track" /> + - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 49f75f0..f3e2063 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -14,6 +14,7 @@ KARTE LETZTE AUFZEICHNUNG + LETZTE AUFZEICHNUNGEN Trackbook ist inaktiv diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f360d37..0887ee0 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -10,6 +10,7 @@ 地図 最後のトラック + LAST TRACKS Trackbook 実行中 Trackbook は実行していません @@ -25,7 +26,6 @@ クリア 保存してクリア - アクセス許可を付与しました。 Trackbook を起動できません。 外部ストレージにアクセスできません。 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 8073e0e..7775bf8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -8,6 +8,7 @@ KAART LAATSTE BAAN + LAST TRACKS Trackbook is actief Trackbook is niet actief diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54b2a3c..0b99f20 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ MAP LAST TRACK + LAST TRACKS Trackbook running diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 20f9dbc..267c6bb 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -16,7 +16,7 @@