Trackbook now asks for confirmation before clearing the map & max. limit of .trackbook files is now enforced
This commit is contained in:
parent
f471ee4a80
commit
0eaaf55f75
7 changed files with 99 additions and 37 deletions
|
@ -20,6 +20,7 @@ import android.Manifest;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
@ -38,6 +39,7 @@ import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.app.FragmentPagerAdapter;
|
import android.support.v4.app.FragmentPagerAdapter;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
@ -354,11 +356,27 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
||||||
mFloatingActionButtonSubMenu2.setOnClickListener(new View.OnClickListener() {
|
mFloatingActionButtonSubMenu2.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
// ask user to confirm the clear action
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
|
||||||
|
builder.setMessage(R.string.dialog_clear_content);
|
||||||
|
builder.setNegativeButton(R.string.dialog_default_action_cancel, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setPositiveButton(R.string.dialog_clear_action_clear, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
// clear current track
|
||||||
handleButtonClearClick();
|
handleButtonClearClick();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// point to the on main onboarding layout
|
// point to the on main onboarding layout
|
||||||
|
|
|
@ -19,6 +19,7 @@ package org.y20k.trackbook;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
|
@ -29,10 +30,12 @@ import android.support.annotation.Nullable;
|
||||||
import android.support.design.widget.BottomSheetBehavior;
|
import android.support.design.widget.BottomSheetBehavior;
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ImageButton;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -172,16 +175,21 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
|
||||||
mTrackManagementLayout = (LinearLayout) mRootView.findViewById(R.id.track_management_layout);
|
mTrackManagementLayout = (LinearLayout) mRootView.findViewById(R.id.track_management_layout);
|
||||||
mDropdown = (Spinner) mRootView.findViewById(R.id.track_selector);
|
mDropdown = (Spinner) mRootView.findViewById(R.id.track_selector);
|
||||||
|
|
||||||
|
//
|
||||||
|
ImageButton deleteButton = (ImageButton) mRootView.findViewById(R.id.delete_button);
|
||||||
|
deleteButton.setOnClickListener(getDeleteButtonListener());
|
||||||
|
|
||||||
// get views for statistics sheet
|
// get views for statistics sheet
|
||||||
View statisticsView = mRootView.findViewById(R.id.statistics_view);
|
View statisticsView = mRootView.findViewById(R.id.statistics_view);
|
||||||
|
View statisticsSheet = mRootView.findViewById(R.id.statistics_sheet);
|
||||||
mDistanceView = (TextView) mRootView.findViewById(R.id.statistics_data_distance);
|
mDistanceView = (TextView) mRootView.findViewById(R.id.statistics_data_distance);
|
||||||
mStepsView = (TextView) mRootView.findViewById(R.id.statistics_data_steps);
|
mStepsView = (TextView) mRootView.findViewById(R.id.statistics_data_steps);
|
||||||
mWaypointsView = (TextView) mRootView.findViewById(R.id.statistics_data_waypoints);
|
mWaypointsView = (TextView) mRootView.findViewById(R.id.statistics_data_waypoints);
|
||||||
mDurationView = (TextView) mRootView.findViewById(R.id.statistics_data_duration);
|
mDurationView = (TextView) mRootView.findViewById(R.id.statistics_data_duration);
|
||||||
mRecordingStartView = (TextView) mRootView.findViewById(R.id.statistics_data_recording_start);
|
mRecordingStartView = (TextView) mRootView.findViewById(R.id.statistics_data_recording_start);
|
||||||
mRecordingStopView = (TextView) mRootView.findViewById(R.id.statistics_data_recording_stop);
|
mRecordingStopView = (TextView) mRootView.findViewById(R.id.statistics_data_recording_stop);
|
||||||
View mStatisticsSheet = mRootView.findViewById(R.id.statistics_sheet);
|
|
||||||
|
|
||||||
|
// display map and statistics
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
// get track from saved instance and display map and statistics
|
// get track from saved instance and display map and statistics
|
||||||
mTrack = savedInstanceState.getParcelable(INSTANCE_TRACK_TRACK_MAP);
|
mTrack = savedInstanceState.getParcelable(INSTANCE_TRACK_TRACK_MAP);
|
||||||
|
@ -195,36 +203,10 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
|
||||||
displayTrack();
|
displayTrack();
|
||||||
}
|
}
|
||||||
|
|
||||||
// show statistics sheet
|
// set up and show statistics sheet
|
||||||
mStatisticsSheetBehavior = BottomSheetBehavior.from(mStatisticsSheet);
|
mStatisticsSheetBehavior = BottomSheetBehavior.from(statisticsSheet);
|
||||||
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||||
mStatisticsSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
|
mStatisticsSheetBehavior.setBottomSheetCallback(getStatisticsSheetCallback());
|
||||||
@Override
|
|
||||||
public void onStateChanged(@NonNull View bottomSheet, int newState) {
|
|
||||||
// react to state change
|
|
||||||
switch (newState) {
|
|
||||||
case BottomSheetBehavior.STATE_EXPANDED:
|
|
||||||
// statistics sheet expanded
|
|
||||||
break;
|
|
||||||
case BottomSheetBehavior.STATE_COLLAPSED:
|
|
||||||
// statistics sheet collapsed
|
|
||||||
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
|
||||||
break;
|
|
||||||
case BottomSheetBehavior.STATE_HIDDEN:
|
|
||||||
// statistics sheet hidden
|
|
||||||
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
|
|
||||||
// react to dragging events
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// react to tap on sheet heading
|
|
||||||
statisticsView.setOnClickListener(new View.OnClickListener() {
|
statisticsView.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
|
@ -236,7 +218,6 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return mRootView;
|
return mRootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,6 +351,66 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Creates BottomSheetCallback for the statistics sheet - needed in onCreateView */
|
||||||
|
private BottomSheetBehavior.BottomSheetCallback getStatisticsSheetCallback() {
|
||||||
|
return new BottomSheetBehavior.BottomSheetCallback() {
|
||||||
|
@Override
|
||||||
|
public void onStateChanged(@NonNull View bottomSheet, int newState) {
|
||||||
|
// react to state change
|
||||||
|
switch (newState) {
|
||||||
|
case BottomSheetBehavior.STATE_EXPANDED:
|
||||||
|
// statistics sheet expanded
|
||||||
|
break;
|
||||||
|
case BottomSheetBehavior.STATE_COLLAPSED:
|
||||||
|
// statistics sheet collapsed
|
||||||
|
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||||
|
break;
|
||||||
|
case BottomSheetBehavior.STATE_HIDDEN:
|
||||||
|
// statistics sheet hidden
|
||||||
|
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
|
||||||
|
// react to dragging events
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Creates OnClickListener for the delete button - needed in onCreateView */
|
||||||
|
private View.OnClickListener getDeleteButtonListener() {
|
||||||
|
return new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
// ask user to confirm the delete action
|
||||||
|
String dialogMessage = getString(R.string.dialog_delete_content) + " " + mTrack.getTrackDuration() + " | " + mTrack.getTrackDistance();
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
|
||||||
|
builder.setTitle(R.string.dialog_delete_title);
|
||||||
|
builder.setMessage(dialogMessage);
|
||||||
|
builder.setNegativeButton(R.string.dialog_default_action_cancel, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setPositiveButton(R.string.dialog_delete_action_delete, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
// delete current track
|
||||||
|
// TODO implement
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inner class: Loads track from external storage using AsyncTask
|
* Inner class: Loads track from external storage using AsyncTask
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -75,6 +75,9 @@ public class StorageHelper implements TrackbookKeys {
|
||||||
|
|
||||||
// create temp file object
|
// create temp file object
|
||||||
mTempFile = new File(mFolder.toString() + "/" + FILE_NAME_TEMP + FILE_TYPE_EXTENSION);
|
mTempFile = new File(mFolder.toString() + "/" + FILE_NAME_TEMP + FILE_TYPE_EXTENSION);
|
||||||
|
|
||||||
|
// delete old track - exclude temp file
|
||||||
|
deleteOldTracks(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
<string name="dialog_clear_content">Aufzeichnung zurücksetzen?</string>
|
<string name="dialog_clear_content">Aufzeichnung zurücksetzen?</string>
|
||||||
<string name="dialog_clear_action_clear">Zurücksetzen</string>
|
<string name="dialog_clear_action_clear">Zurücksetzen</string>
|
||||||
<string name="dialog_delete_title">Aufzeichnung löschen?</string>
|
<string name="dialog_delete_title">Aufzeichnung löschen?</string>
|
||||||
<string name="dialog_delete_content">Möchten Sie diese Aufzeichnung wirklich löschen?</string>
|
<string name="dialog_delete_content">Diese Aufzeichnung löschen:</string>
|
||||||
<string name="dialog_delete_action_delete">Löschen</string>
|
<string name="dialog_delete_action_delete">Löschen</string>
|
||||||
|
|
||||||
<!-- toast messages -->
|
<!-- toast messages -->
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
<string name="dialog_clear_content">Clear Recording?</string>
|
<string name="dialog_clear_content">Clear Recording?</string>
|
||||||
<string name="dialog_clear_action_clear">Clear</string>
|
<string name="dialog_clear_action_clear">Clear</string>
|
||||||
<string name="dialog_delete_title">Delete Recording?</string>
|
<string name="dialog_delete_title">Delete Recording?</string>
|
||||||
<string name="dialog_delete_content">Do you really want to delete this recording?</string>
|
<string name="dialog_delete_content">Delete the following recording:</string>
|
||||||
<string name="dialog_delete_action_delete">Delete</string>
|
<string name="dialog_delete_action_delete">Delete</string>
|
||||||
|
|
||||||
<string name="toast_message_permissions_granted">アクセス許可を付与しました。</string>
|
<string name="toast_message_permissions_granted">アクセス許可を付与しました。</string>
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
<string name="dialog_clear_content">Clear Recording?</string>
|
<string name="dialog_clear_content">Clear Recording?</string>
|
||||||
<string name="dialog_clear_action_clear">Clear</string>
|
<string name="dialog_clear_action_clear">Clear</string>
|
||||||
<string name="dialog_delete_title">Delete Recording?</string>
|
<string name="dialog_delete_title">Delete Recording?</string>
|
||||||
<string name="dialog_delete_content">Do you really want to delete this recording?</string>
|
<string name="dialog_delete_content">Delete the following recording:</string>
|
||||||
<string name="dialog_delete_action_delete">Delete</string>
|
<string name="dialog_delete_action_delete">Delete</string>
|
||||||
|
|
||||||
<string name="toast_message_permissions_granted">Rechten verleend.</string>
|
<string name="toast_message_permissions_granted">Rechten verleend.</string>
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
<string name="dialog_clear_content">Clear Recording?</string>
|
<string name="dialog_clear_content">Clear Recording?</string>
|
||||||
<string name="dialog_clear_action_clear">Clear</string>
|
<string name="dialog_clear_action_clear">Clear</string>
|
||||||
<string name="dialog_delete_title">Delete Recording?</string>
|
<string name="dialog_delete_title">Delete Recording?</string>
|
||||||
<string name="dialog_delete_content">Do you really want to delete this recording?</string>
|
<string name="dialog_delete_content">Delete the following recording:</string>
|
||||||
<string name="dialog_delete_action_delete">Delete</string>
|
<string name="dialog_delete_action_delete">Delete</string>
|
||||||
|
|
||||||
<!-- toast messages -->
|
<!-- toast messages -->
|
||||||
|
|
Loading…
Reference in a new issue