Trackbook now asks for confirmation before clearing the map & max. limit of .trackbook files is now enforced

master
y20k 2017-02-21 13:29:04 +01:00
parent f471ee4a80
commit 0eaaf55f75
7 changed files with 99 additions and 37 deletions

View File

@ -20,6 +20,7 @@ import android.Manifest;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
@ -38,6 +39,7 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.SparseArray;
@ -354,12 +356,28 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys {
mFloatingActionButtonSubMenu2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
handleButtonClearClick();
// 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();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
} else {
// point to the on main onboarding layout
setContentView(R.layout.activity_main_onboarding);

View File

@ -19,6 +19,7 @@ package org.y20k.trackbook;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
@ -29,10 +30,12 @@ import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetBehavior;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Spinner;
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);
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
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);
mStepsView = (TextView) mRootView.findViewById(R.id.statistics_data_steps);
mWaypointsView = (TextView) mRootView.findViewById(R.id.statistics_data_waypoints);
mDurationView = (TextView) mRootView.findViewById(R.id.statistics_data_duration);
mRecordingStartView = (TextView) mRootView.findViewById(R.id.statistics_data_recording_start);
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) {
// get track from saved instance and display map and statistics
mTrack = savedInstanceState.getParcelable(INSTANCE_TRACK_TRACK_MAP);
@ -195,36 +203,10 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
displayTrack();
}
// show statistics sheet
mStatisticsSheetBehavior = BottomSheetBehavior.from(mStatisticsSheet);
// set up and show statistics sheet
mStatisticsSheetBehavior = BottomSheetBehavior.from(statisticsSheet);
mStatisticsSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
mStatisticsSheetBehavior.setBottomSheetCallback(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
}
});
// react to tap on sheet heading
mStatisticsSheetBehavior.setBottomSheetCallback(getStatisticsSheetCallback());
statisticsView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -236,7 +218,6 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O
}
});
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
*/

View File

@ -75,6 +75,9 @@ public class StorageHelper implements TrackbookKeys {
// create temp file object
mTempFile = new File(mFolder.toString() + "/" + FILE_NAME_TEMP + FILE_TYPE_EXTENSION);
// delete old track - exclude temp file
deleteOldTracks(false);
}

View File

@ -38,7 +38,7 @@
<string name="dialog_clear_content">Aufzeichnung 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_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>
<!-- toast messages -->

View File

@ -30,7 +30,7 @@
<string name="dialog_clear_content">Clear Recording?</string>
<string name="dialog_clear_action_clear">Clear</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="toast_message_permissions_granted">アクセス許可を付与しました。</string>

View File

@ -28,7 +28,7 @@
<string name="dialog_clear_content">Clear Recording?</string>
<string name="dialog_clear_action_clear">Clear</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="toast_message_permissions_granted">Rechten verleend.</string>

View File

@ -38,7 +38,7 @@
<string name="dialog_clear_content">Clear Recording?</string>
<string name="dialog_clear_action_clear">Clear</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>
<!-- toast messages -->