track selection is now fully functional (#10)

This commit is contained in:
y20k 2017-02-15 15:29:21 +01:00
parent 4cc5c7e5fa
commit 22df3abb24
16 changed files with 242 additions and 108 deletions

View file

@ -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)

View file

@ -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'
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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<String>(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<Void, Void, Void> {
private class LoadTrackAsyncHelper extends AsyncTask<File, Void, Void> {
@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();
}
}

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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
*/
}

View file

@ -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<String> getListOfTracks() {
List<String> listOfTracks = new ArrayList<String>();
// 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<String> getListOfTracks() {
List<String> listOfTracks = new ArrayList<String>();
// 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;
}

View file

@ -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
}

View file

@ -19,6 +19,7 @@
android:layout_height="match_parent"
android:contentDescription="@string/descr_map_last_track" />
<!-- TRACK SELECTION -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -35,6 +36,7 @@
android:theme="@style/TrackbookAppTheme.PopupOverlay"
android:contentDescription="@string/descr_track_selector" />
<ImageButton
android:visibility="gone"
android:id="@+id/delete_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -45,13 +47,6 @@
</RelativeLayout>
<!-- MAP VIEW --> <!-- TODO remove -->
<!-- <org.osmdroid.views.MapView
android:id="@+id/track_map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:contentDescription="@string/descr_map_last_track" /> -->
<!-- BOTTOM SHEET -->
<android.support.v4.widget.NestedScrollView
android:id="@+id/statistics_sheet"
@ -232,8 +227,6 @@
</ScrollView>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

View file

@ -14,6 +14,7 @@
<!-- tabs -->
<string name="tab_map">KARTE</string>
<string name="tab_last_track">LETZTE AUFZEICHNUNG</string>
<string name="tab_last_tracks">LETZTE AUFZEICHNUNGEN</string>
<!-- notification -->
<string name="notification_title_trackbook_not_running">Trackbook ist inaktiv</string>

View file

@ -10,6 +10,7 @@
<string name="tab_map">地図</string>
<string name="tab_last_track">最後のトラック</string>
<string name="tab_last_tracks">LAST TRACKS</string>
<string name="notification_title_trackbook_running">Trackbook 実行中</string>
<string name="notification_title_trackbook_not_running">Trackbook は実行していません</string>
@ -25,7 +26,6 @@
<string name="fab_sub_menu_clear">クリア</string>
<string name="fab_sub_menu_save_and_clear">保存してクリア</string>
<string name="toast_message_permissions_granted">アクセス許可を付与しました。</string>
<string name="toast_message_unable_to_start_app">Trackbook を起動できません。</string>
<string name="toast_message_no_external_storage">外部ストレージにアクセスできません。</string>

View file

@ -8,6 +8,7 @@
<string name="tab_map">KAART</string>
<string name="tab_last_track">LAATSTE BAAN</string>
<string name="tab_last_tracks">LAST TRACKS</string>
<string name="notification_title_trackbook_running">Trackbook is actief</string>
<string name="notification_title_trackbook_not_running">Trackbook is niet actief</string>

View file

@ -14,6 +14,7 @@
<!-- tabs -->
<string name="tab_map">MAP</string>
<string name="tab_last_track">LAST TRACK</string>
<string name="tab_last_tracks">LAST TRACKS</string>
<!-- notification -->
<string name="notification_title_trackbook_running">Trackbook running</string>

View file

@ -16,7 +16,7 @@
<style name="TrackbookAppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="TrackbookAppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
<!-- <item name="colorBackground">@color/trackbook_red</item> -->
<item name="android:colorControlNormal">@color/trackbook_white</item>
</style>
</resources>