saving the last track: implemented a floating action button sub menu instead of a user dialog (#2)
This commit is contained in:
parent
c19cf469d3
commit
f3909ec3a5
19 changed files with 451 additions and 208 deletions
|
@ -25,6 +25,7 @@ dependencies {
|
|||
testCompile 'junit:junit:4.12'
|
||||
compile 'com.android.support:appcompat-v7:25.0.1'
|
||||
compile 'com.android.support:design:25.0.1'
|
||||
compile 'com.android.support:cardview-v7:25.0.1'
|
||||
compile 'org.osmdroid:osmdroid-android:5.5:release@aar'
|
||||
compile 'com.google.code.gson:gson:2.8.0'
|
||||
}
|
||||
|
|
|
@ -23,10 +23,12 @@ import android.content.BroadcastReceiver;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.location.Location;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.design.widget.FloatingActionButton;
|
||||
import android.support.design.widget.Snackbar;
|
||||
|
@ -44,9 +46,9 @@ import android.view.MenuItem;
|
|||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.y20k.trackbook.helpers.DialogClearFragment;
|
||||
import org.y20k.trackbook.helpers.LogHelper;
|
||||
import org.y20k.trackbook.helpers.NotificationHelper;
|
||||
import org.y20k.trackbook.helpers.TrackbookKeys;
|
||||
|
@ -60,7 +62,7 @@ import java.util.Map;
|
|||
/**
|
||||
* MainActivity class
|
||||
*/
|
||||
public class MainActivity extends AppCompatActivity implements TrackbookKeys, DialogClearFragment.DialogClearListener {
|
||||
public class MainActivity extends AppCompatActivity implements TrackbookKeys {
|
||||
|
||||
/* Define log tag */
|
||||
private static final String LOG_TAG = MainActivity.class.getSimpleName();
|
||||
|
@ -68,9 +70,14 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
|
||||
/* Main class variables */
|
||||
private boolean mTrackerServiceRunning;
|
||||
private boolean mCurrentTrackVisible;
|
||||
private boolean mPermissionsGranted;
|
||||
private boolean mFloatingActionButtonSubMenuVisible;
|
||||
private List<String> mMissingPermissions;
|
||||
private LinearLayout mFloatingActionButtonLayout;
|
||||
private FloatingActionButton mFloatingActionButton;
|
||||
private LinearLayout mFloatingActionButtonSubMenu1;
|
||||
private LinearLayout mFloatingActionButtonSubMenu2;
|
||||
private MainActivityMapFragment mMainActivityMapFragment;
|
||||
private MainActivityTrackFragment mMainActivityTrackFragment;
|
||||
private BroadcastReceiver mTrackingStoppedReceiver;
|
||||
|
@ -81,12 +88,8 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// get state of tracking and get selected tab
|
||||
mTrackerServiceRunning = false;
|
||||
if (savedInstanceState != null) {
|
||||
mTrackerServiceRunning = savedInstanceState.getBoolean(INSTANCE_TRACKING_STATE, false);
|
||||
mSelectedTab = savedInstanceState.getInt(INSTANCE_SELECTED_TAB, 0);
|
||||
}
|
||||
// load saved state of app
|
||||
loadAppState(this);
|
||||
|
||||
// check permissions on Android 6 and higher
|
||||
mPermissionsGranted = false;
|
||||
|
@ -104,7 +107,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
// set up main layout
|
||||
setupLayout();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -112,27 +114,28 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
// add listeners to button
|
||||
// add listeners to button and submenu
|
||||
if (mFloatingActionButton != null) {
|
||||
mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
// onClick: start / stop tracking
|
||||
handleFloatingActionButtonClick(view);
|
||||
}
|
||||
});
|
||||
mFloatingActionButton.setOnLongClickListener(new View.OnLongClickListener() {
|
||||
}
|
||||
if (mFloatingActionButtonSubMenu1 != null) {
|
||||
mFloatingActionButtonSubMenu1.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
// onLongClick: clear map
|
||||
if (mTrackerServiceRunning || mMainActivityMapFragment == null) {
|
||||
return false;
|
||||
} else {
|
||||
// show clear dialog
|
||||
DialogFragment dialog = new DialogClearFragment();
|
||||
dialog.show(getFragmentManager(), "DialogClearFragment");
|
||||
return true;
|
||||
}
|
||||
public void onClick(View view) {
|
||||
handleButtonSaveAndClearClick();
|
||||
}
|
||||
});
|
||||
}
|
||||
if (mFloatingActionButtonSubMenu2 != null) {
|
||||
mFloatingActionButtonSubMenu2.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
handleButtonClearClick();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -177,14 +180,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
outState.putBoolean(INSTANCE_TRACKING_STATE, mTrackerServiceRunning);
|
||||
outState.putInt(INSTANCE_SELECTED_TAB, mSelectedTab);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
@ -243,25 +238,48 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
|
||||
|
||||
@Override
|
||||
public void onDialogClearPositiveClick(DialogFragment dialog) {
|
||||
// DialogClear: User chose CLEAR.
|
||||
LogHelper.v(LOG_TAG, "User chose CLEAR");
|
||||
|
||||
// clear the map
|
||||
mMainActivityMapFragment.clearMap();
|
||||
|
||||
// reset current track
|
||||
mMainActivityTrackFragment.refreshTrackView();
|
||||
|
||||
// dismiss notification
|
||||
NotificationHelper.stop();
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
LogHelper.v(LOG_TAG, "onSaveInstanceState called.");
|
||||
outState.putBoolean(INSTANCE_TRACKING_STATE, mTrackerServiceRunning);
|
||||
outState.putBoolean(INSTANCE_TRACK_VISIBLE, mCurrentTrackVisible);
|
||||
outState.putBoolean(INSTANCE_FAB_SUB_MENU_VISIBLE, mFloatingActionButtonSubMenuVisible);
|
||||
outState.putInt(INSTANCE_SELECTED_TAB, mSelectedTab);
|
||||
super.onSaveInstanceState(outState);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDialogClearNegativeClick(DialogFragment dialog) {
|
||||
// DialogClear: User chose CANCEL.
|
||||
LogHelper.v(LOG_TAG, "User chose CANCEL.");
|
||||
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
LogHelper.v(LOG_TAG, "onRestoreInstanceState called.");
|
||||
mTrackerServiceRunning = savedInstanceState.getBoolean(INSTANCE_TRACKING_STATE, false);
|
||||
mCurrentTrackVisible = savedInstanceState.getBoolean(INSTANCE_TRACK_VISIBLE, false);
|
||||
mFloatingActionButtonSubMenuVisible = savedInstanceState.getBoolean(INSTANCE_FAB_SUB_MENU_VISIBLE, false);
|
||||
mSelectedTab = savedInstanceState.getInt(INSTANCE_SELECTED_TAB, 0);
|
||||
}
|
||||
|
||||
|
||||
/* Saves app state to SharedPreferences */
|
||||
private void saveAppState(Context context) {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences.Editor editor = settings.edit();
|
||||
editor.putBoolean(INSTANCE_TRACKING_STATE, mTrackerServiceRunning);
|
||||
editor.putBoolean(INSTANCE_TRACK_VISIBLE, mCurrentTrackVisible);
|
||||
editor.putBoolean(INSTANCE_FAB_SUB_MENU_VISIBLE, mFloatingActionButtonSubMenuVisible);
|
||||
editor.putInt(INSTANCE_SELECTED_TAB, mSelectedTab);
|
||||
editor.apply();
|
||||
LogHelper.v(LOG_TAG, "Saving state.");
|
||||
}
|
||||
|
||||
|
||||
/* Loads app state from preferences */
|
||||
private void loadAppState(Context context) {
|
||||
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
mTrackerServiceRunning = settings.getBoolean(INSTANCE_TRACKING_STATE, false);
|
||||
mCurrentTrackVisible = settings.getBoolean(INSTANCE_TRACK_VISIBLE, false);
|
||||
mFloatingActionButtonSubMenuVisible = settings.getBoolean(INSTANCE_FAB_SUB_MENU_VISIBLE, false);
|
||||
mSelectedTab = settings.getInt(INSTANCE_SELECTED_TAB, 0);
|
||||
LogHelper.v(LOG_TAG, "Loading state.");
|
||||
}
|
||||
|
||||
|
||||
|
@ -269,7 +287,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
private void setupLayout() {
|
||||
if (mPermissionsGranted) {
|
||||
// point to the main map layout
|
||||
setContentView(R.layout.activity_main_test);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
// show action bar
|
||||
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
|
@ -312,8 +330,16 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
}
|
||||
});
|
||||
|
||||
// show the record button and attach listener
|
||||
mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
|
||||
// get references to the record button and show/hide its sub menu
|
||||
mFloatingActionButtonLayout = (LinearLayout) findViewById(R.id.fabFrameLayout);
|
||||
mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fabMainButton);
|
||||
mFloatingActionButtonSubMenu1 = (LinearLayout) findViewById(R.id.fabSubMenu1);
|
||||
mFloatingActionButtonSubMenu2 = (LinearLayout) findViewById(R.id.fabSubMenu2);
|
||||
if (mFloatingActionButtonSubMenuVisible) {
|
||||
showFloatingActionButtonMenu(true);
|
||||
} else {
|
||||
showFloatingActionButtonMenu(false);
|
||||
}
|
||||
|
||||
} else {
|
||||
// point to the on main onboarding layout
|
||||
|
@ -338,6 +364,15 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
// save current state
|
||||
saveAppState(this);
|
||||
}
|
||||
|
||||
|
||||
/* Handles tap on the record button */
|
||||
private void handleFloatingActionButtonClick(View view) {
|
||||
if (mTrackerServiceRunning) {
|
||||
|
@ -352,14 +387,21 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
intent.setAction(ACTION_STOP);
|
||||
startService(intent);
|
||||
|
||||
} else if (mCurrentTrackVisible) {
|
||||
// toggle floating action button sub menu
|
||||
if (!mFloatingActionButtonSubMenuVisible) {
|
||||
showFloatingActionButtonMenu(true);
|
||||
} else {
|
||||
showFloatingActionButtonMenu(false);
|
||||
}
|
||||
|
||||
} else {
|
||||
// TODO ask if user wants to save the last track before starting a new recording
|
||||
// TODO alternatively only ask if last track was very short
|
||||
// show snackbar
|
||||
Snackbar.make(view, R.string.snackbar_message_tracking_started, Snackbar.LENGTH_SHORT).setAction("Action", null).show();
|
||||
|
||||
// change state
|
||||
mTrackerServiceRunning = true;
|
||||
mCurrentTrackVisible = true;
|
||||
setFloatingActionButtonState();
|
||||
|
||||
// get last location from MainActivity Fragment
|
||||
|
@ -385,16 +427,76 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
}
|
||||
|
||||
|
||||
/* Handles tap on the save and clear button */
|
||||
public void handleButtonSaveAndClearClick() {
|
||||
LogHelper.v(LOG_TAG, "User chose SAVE and CLEAR");
|
||||
|
||||
// clear map and save track
|
||||
mMainActivityMapFragment.clearMap(true); // TODO change to true
|
||||
mCurrentTrackVisible = false;
|
||||
|
||||
// // reset current track // TODO ist this still necessary
|
||||
// mMainActivityTrackFragment.refreshTrackView();
|
||||
|
||||
// TODO change to track tab
|
||||
|
||||
// dismiss notification
|
||||
NotificationHelper.stop();
|
||||
|
||||
// hide Floating Action Button sub menu
|
||||
showFloatingActionButtonMenu(false);
|
||||
|
||||
// update Floating Action Button icon
|
||||
setFloatingActionButtonState();
|
||||
}
|
||||
|
||||
|
||||
/* Handles tap on the clear button */
|
||||
public void handleButtonClearClick() {
|
||||
LogHelper.v(LOG_TAG, "User chose CLEAR");
|
||||
|
||||
// clear map, do not save track
|
||||
mMainActivityMapFragment.clearMap(false);
|
||||
mCurrentTrackVisible = false;
|
||||
|
||||
// dismiss notification
|
||||
NotificationHelper.stop();
|
||||
|
||||
// hide Floating Action Button sub menu
|
||||
showFloatingActionButtonMenu(false);
|
||||
|
||||
// update Floating Action Button icon
|
||||
setFloatingActionButtonState();
|
||||
}
|
||||
|
||||
|
||||
/* Set state of FloatingActionButton */
|
||||
private void setFloatingActionButtonState() {
|
||||
if (mTrackerServiceRunning) {
|
||||
mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_red_24dp);
|
||||
} else if (mCurrentTrackVisible) {
|
||||
mFloatingActionButton.setImageResource(R.drawable.ic_save_white_24dp);
|
||||
} else {
|
||||
mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Shows (and hides) the sub menu of the floating action button */
|
||||
private void showFloatingActionButtonMenu(boolean visible) {
|
||||
if (visible) {
|
||||
mFloatingActionButtonSubMenu1.setVisibility(View.VISIBLE);
|
||||
mFloatingActionButtonSubMenu2.setVisibility(View.VISIBLE);
|
||||
mFloatingActionButtonSubMenuVisible = true;
|
||||
} else {
|
||||
mFloatingActionButtonSubMenu1.setVisibility(View.INVISIBLE);
|
||||
mFloatingActionButtonSubMenu2.setVisibility(View.INVISIBLE);
|
||||
mFloatingActionButtonSubMenuVisible = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Handles new incoming intents */
|
||||
private void handleIncomingIntent() {
|
||||
Intent intent = getIntent();
|
||||
|
@ -407,12 +509,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys, Di
|
|||
mMainActivityMapFragment.setTrackingState(mTrackerServiceRunning);
|
||||
// prevent multiple reactions to intent
|
||||
intent.setAction(ACTION_DEFAULT);
|
||||
} else if (intent.hasExtra(EXTRA_CLEAR_MAP) && mMainActivityMapFragment != null) {
|
||||
// show clear dialog
|
||||
DialogFragment dialog = new DialogClearFragment();
|
||||
dialog.show(getFragmentManager(), "DialogClearFragment");
|
||||
// prevent multiple reactions to intent
|
||||
intent.setAction(ACTION_DEFAULT);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys {
|
|||
mFirstStart = savedInstanceState.getBoolean(INSTANCE_FIRST_START, true);
|
||||
}
|
||||
|
||||
// restore tracking state
|
||||
// restore tracking and map state
|
||||
mTrackerServiceRunning = false;
|
||||
if (savedInstanceState != null) {
|
||||
mTrackerServiceRunning = savedInstanceState.getBoolean(INSTANCE_TRACKING_STATE, false);
|
||||
|
@ -235,7 +235,7 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys {
|
|||
// show/hide the location off notification bar
|
||||
toggleLocationOffBar();
|
||||
|
||||
// start preliminary tracking - if no TrackerService is running
|
||||
// start preliminary tracking - if no TrackerService is running // TODO check if this still works in tabbed ui
|
||||
if (!mTrackerServiceRunning && mFragmentVisible) {
|
||||
startPreliminaryTracking();
|
||||
}
|
||||
|
@ -388,20 +388,26 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys {
|
|||
|
||||
|
||||
/* Removes track crumbs from map */
|
||||
public void clearMap() {
|
||||
|
||||
LogHelper.v(LOG_TAG, "!!! Ding clear.");
|
||||
public void clearMap(boolean saveTrack) {
|
||||
|
||||
// clear map
|
||||
if (mTrackOverlay != null) {
|
||||
Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_clear_map), Toast.LENGTH_LONG).show();
|
||||
mMapView.getOverlays().remove(mTrackOverlay);
|
||||
}
|
||||
|
||||
// save track object
|
||||
SaveTrackAsyncHelper saveTrackAsyncHelper = new SaveTrackAsyncHelper();
|
||||
saveTrackAsyncHelper.execute();
|
||||
// TODO add toast indicating track save
|
||||
// save track object if requested
|
||||
if (saveTrack) {
|
||||
SaveTrackAsyncHelper saveTrackAsyncHelper = new SaveTrackAsyncHelper();
|
||||
saveTrackAsyncHelper.execute();
|
||||
Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_save_track), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Getter for length of current track */
|
||||
public String getCurrentTrackLength() {
|
||||
return mTrack.getTrackDistance();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
/**
|
||||
* DialogClearFragment.java
|
||||
* Implements the DialogClearFragment class
|
||||
* A DialogClearFragment appears when the user wants to clear the map
|
||||
*
|
||||
* 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.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.app.DialogFragment;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.y20k.trackbook.R;
|
||||
|
||||
|
||||
/**
|
||||
* DialogClearFragment class
|
||||
*/
|
||||
public class DialogClearFragment extends DialogFragment {
|
||||
|
||||
/* Define log tag */
|
||||
private static final String LOG_TAG = DialogClearFragment.class.getSimpleName();
|
||||
|
||||
|
||||
/* Interface that the context that creates an instance of this fragment must implement */
|
||||
public interface DialogClearListener {
|
||||
public void onDialogClearPositiveClick(DialogFragment dialog);
|
||||
public void onDialogClearNegativeClick(DialogFragment dialog);
|
||||
}
|
||||
|
||||
|
||||
/* Main class variables */
|
||||
private DialogClearListener mListener;
|
||||
|
||||
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
// verify that the host context implements the callback interface
|
||||
try {
|
||||
// instantiate the NoticeDialogListener so we can send events to the host
|
||||
mListener = (DialogClearListener) context;
|
||||
} catch (ClassCastException e) {
|
||||
LogHelper.e(LOG_TAG, "Context does not implement the DialogClearListener interface.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
// construct dialog
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setTitle(R.string.dialog_clear_map_title)
|
||||
.setMessage(R.string.dialog_clear_map_message)
|
||||
.setPositiveButton(R.string.dialog_clear_map_okay, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
// user clicked CLEAR - inform initiating fragment / context
|
||||
mListener.onDialogClearPositiveClick(DialogClearFragment.this);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.dialog_clear_map_cancel, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
// user clicked CANCEL - inform initiating fragment / context
|
||||
mListener.onDialogClearNegativeClick(DialogClearFragment.this);
|
||||
}
|
||||
});
|
||||
// create the AlertDialog object and return it
|
||||
return builder.create();
|
||||
}
|
||||
}
|
|
@ -114,8 +114,6 @@ public class NotificationHelper implements TrackbookKeys {
|
|||
TaskStackBuilder swipeActionIntentBuilder = TaskStackBuilder.create(mService);
|
||||
swipeActionIntentBuilder.addParentStack(MainActivity.class);
|
||||
swipeActionIntentBuilder.addNextIntent(swipeActionIntent);
|
||||
// pending intent wrapper for notification tap
|
||||
PendingIntent swipeActionPendingIntent = swipeActionIntentBuilder.getPendingIntent(11, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
// ACTION: NOTIFICATION BUTTON STOP
|
||||
Intent stopActionIntent = new Intent(mService, TrackerService.class);
|
||||
|
@ -136,10 +134,8 @@ public class NotificationHelper implements TrackbookKeys {
|
|||
builder.setContentTitle(mService.getString(R.string.notification_title_trackbook_running));
|
||||
builder.setContentText(contentText);
|
||||
} else {
|
||||
builder.setDeleteIntent(swipeActionPendingIntent);
|
||||
builder.setContentTitle(mService.getString(R.string.notification_title_trackbook_not_running));
|
||||
builder.setContentText(contentText);
|
||||
builder.setSubText(mService.getString(R.string.notification_swipe_to_clear_map));
|
||||
}
|
||||
|
||||
return builder;
|
||||
|
|
|
@ -42,6 +42,8 @@ public interface TrackbookKeys {
|
|||
String ARG_PERMISSIONS_GRANTED = "ArgPermissionsGranted";
|
||||
String ARG_TRACKING_STATE = "ArgTrackingState";
|
||||
String ARG_TRACK = "ArgTrack";
|
||||
String ARG_TRACK_VISIBLE = "ArgTrackVisible";
|
||||
String ARG_TRACK_DISTANCE = "ArgTrackDistance";
|
||||
|
||||
/* TAGS */
|
||||
String TAG_MAIN_ACTIVITY_FRAGMENT = "TagMainActivityFragment";
|
||||
|
@ -58,7 +60,9 @@ public interface TrackbookKeys {
|
|||
/* INSTANCE STATE */
|
||||
String INSTANCE_FIRST_START = "firstStart";
|
||||
String INSTANCE_TRACKING_STATE = "trackingState";
|
||||
String INSTANCE_TRACK_VISIBLE = "trackVisible";
|
||||
String INSTANCE_SELECTED_TAB = "selectedTab";
|
||||
String INSTANCE_FAB_SUB_MENU_VISIBLE = "fabSubMenuVisible";
|
||||
String INSTANCE_TRACK_MAIN_MAP = "trackMainMap";
|
||||
String INSTANCE_LATITUDE_MAIN_MAP = "latitudeMainMap";
|
||||
String INSTANCE_LONGITUDE_MAIN_MAP = "longitudeMainMap";
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/**
|
||||
* DodgeAbleLayoutBehavior.java
|
||||
* Implements the DodgeAbleLayoutBehavior class
|
||||
* A DodgeAbleLayoutBehavior enables any element to be dodged up by a snackbar
|
||||
*
|
||||
* 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.layout;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.support.design.widget.CoordinatorLayout;
|
||||
import android.support.design.widget.Snackbar;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
|
||||
/**
|
||||
* DodgeAbleLayoutBehavior class
|
||||
* adapted from: http://stackoverflow.com/a/35904421
|
||||
*/
|
||||
public class DodgeAbleLayoutBehavior extends CoordinatorLayout.Behavior<View> {
|
||||
|
||||
/* Main class variables */
|
||||
private static final boolean SNACKBAR_BEHAVIOR_ENABLED;
|
||||
|
||||
|
||||
/* Constructor (default) */
|
||||
public DodgeAbleLayoutBehavior() {
|
||||
super();
|
||||
}
|
||||
|
||||
|
||||
/* Constructor for context and attributes */
|
||||
public DodgeAbleLayoutBehavior(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
|
||||
return SNACKBAR_BEHAVIOR_ENABLED && dependency instanceof Snackbar.SnackbarLayout;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
|
||||
float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
|
||||
child.setTranslationY(translationY);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static {
|
||||
SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11;
|
||||
}
|
||||
|
||||
}
|
9
app/src/main/res/drawable/ic_clear_white_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_clear_white_24dp.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"
|
||||
android:fillColor="@color/trackbook_white" />
|
||||
</vector>
|
|
@ -5,5 +5,5 @@
|
|||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:pathData="M12,12m-8,0a8,8 0,1 1,16 0a8,8 0,1 1,-16 0"
|
||||
android:fillColor="#FFFFFF"/>
|
||||
android:fillColor="@color/trackbook_white" />
|
||||
</vector>
|
||||
|
|
9
app/src/main/res/drawable/ic_save_white_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_save_white_24dp.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="@color/trackbook_white"
|
||||
android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z"/>
|
||||
</vector>
|
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="@color/trackbook_white"
|
||||
android:pathData="M9,11L7,11v2h2v-2zM13,11h-2v2h2v-2zM17,11h-2v2h2v-2zM19,4h-1L18,2h-2v2L8,4L8,2L6,2v2L5,4c-1.11,0 -1.99,0.9 -1.99,2L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM19,20L5,20L5,9h14v11z"/>
|
||||
</vector>
|
|
@ -1,15 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="org.y20k.trackbook.MainActivity">
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:id="@+id/appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/appbar_padding_top"
|
||||
android:theme="@style/TrackbookAppTheme.AppBarOverlay">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
|
@ -17,31 +21,39 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:popupTheme="@style/TrackbookAppTheme.PopupOverlay" />
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
app:popupTheme="@style/TrackbookAppTheme.PopupOverlay">
|
||||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
||||
<android.support.design.widget.TabLayout
|
||||
android:id="@+id/tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:tabMaxWidth="0dp"
|
||||
app:tabGravity="fill"
|
||||
app:tabMode="fixed" />
|
||||
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
|
||||
|
||||
<!-- include MainActivityMapFragment -->
|
||||
<fragment
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/content_main"
|
||||
android:name="org.y20k.trackbook.MainActivityMapFragment"
|
||||
<android.support.v4.view.ViewPager
|
||||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
tools:layout="@layout/fragment_main_map" />
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||
<!-- MainActivityMapFragment and MainActivityTrackFragment are included at runtime -->
|
||||
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
<include layout="@layout/floating_action_button" />
|
||||
|
||||
<!-- <android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
app:srcCompat="@drawable/ic_fiber_manual_record_white_24dp"
|
||||
app:fabSize="auto"/>
|
||||
app:fabSize="auto"/> -->
|
||||
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
|
@ -1,19 +1,15 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context="org.y20k.trackbook.MainActivity">
|
||||
|
||||
<android.support.design.widget.AppBarLayout
|
||||
android:id="@+id/appbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/appbar_padding_top"
|
||||
android:theme="@style/TrackbookAppTheme.AppBarOverlay">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
|
@ -21,37 +17,33 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:background="?attr/colorPrimary"
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
app:popupTheme="@style/TrackbookAppTheme.PopupOverlay">
|
||||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
||||
<android.support.design.widget.TabLayout
|
||||
android:id="@+id/tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:tabMaxWidth="0dp"
|
||||
app:tabGravity="fill"
|
||||
app:tabMode="fixed" />
|
||||
app:popupTheme="@style/TrackbookAppTheme.PopupOverlay" />
|
||||
|
||||
</android.support.design.widget.AppBarLayout>
|
||||
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:id="@+id/container"
|
||||
<!-- include MainActivityMapFragment -->
|
||||
<fragment
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/content_main"
|
||||
android:name="org.y20k.trackbook.MainActivityMapFragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||
<!-- MainActivityMapFragment and MainActivityTrackFragment are included at runtime -->
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
tools:layout="@layout/fragment_main_map" />
|
||||
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
<include layout="@layout/floating_action_button" />
|
||||
|
||||
<!-- <android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
app:srcCompat="@drawable/ic_fiber_manual_record_white_24dp"
|
||||
app:fabSize="auto"/>
|
||||
app:fabSize="auto"/> -->
|
||||
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
129
app/src/main/res/layout/floating_action_button.xml
Normal file
129
app/src/main/res/layout/floating_action_button.xml
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!-- TODO add missing descriptions and color definitions -->
|
||||
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/fabFrameLayout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
app:layout_behavior="org.y20k.trackbook.layout.DodgeAbleLayoutBehavior">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/fabSubMenu1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0dp"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="@dimen/fab_margin"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="visible">
|
||||
|
||||
<android.support.v7.widget.CardView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
app:cardBackgroundColor="@color/trackbook_white"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardElevation="4dp"
|
||||
app:cardUseCompatPadding="true" >
|
||||
<TextView
|
||||
android:id="@+id/fabSubMenuLabel1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/fab_sub_menu_save_and_clear"
|
||||
android:textStyle="bold"
|
||||
android:paddingRight="6dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingBottom="2dp"
|
||||
android:paddingTop="2dp" />
|
||||
</android.support.v7.widget.CardView>
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fabSubMenuButton1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
app:srcCompat="@drawable/ic_save_white_24dp"
|
||||
app:backgroundTint="#4CAF50"
|
||||
app:fabSize="mini" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/fabSubMenu2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="@dimen/fab_margin"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="visible">
|
||||
|
||||
<android.support.v7.widget.CardView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:cardBackgroundColor="@color/trackbook_white"
|
||||
app:cardCornerRadius="4dp"
|
||||
app:cardElevation="4dp"
|
||||
app:cardUseCompatPadding="true">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/fabSubMenuLabel2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:text="@string/fab_sub_menu_clear"
|
||||
android:textStyle="bold"
|
||||
android:paddingRight="6dp"
|
||||
android:paddingLeft="6dp"
|
||||
android:paddingBottom="2dp"
|
||||
android:paddingTop="2dp" />
|
||||
|
||||
</android.support.v7.widget.CardView>
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fabSubMenuButton2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/ic_clear_white_24dp"
|
||||
app:backgroundTint="#2196F3"
|
||||
app:fabSize="mini" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/fabMain"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fabMainButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:srcCompat="@drawable/ic_fiber_manual_record_white_24dp"
|
||||
app:fabSize="normal" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- <android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
app:srcCompat="@drawable/ic_fiber_manual_record_white_24dp"
|
||||
app:fabSize="auto"/> -->
|
||||
|
||||
|
||||
</LinearLayout>
|
|
@ -7,7 +7,7 @@
|
|||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
tools:context=".MainActivityMapFragment"
|
||||
tools:showIn="@layout/activity_main">
|
||||
tools:showIn="@layout/activity_main_old">
|
||||
|
||||
<org.osmdroid.views.MapView android:id="@+id/map"
|
||||
android:layout_width="fill_parent"
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
android:layout_height="fill_parent"
|
||||
android:contentDescription="@string/descr_map_last_track" />
|
||||
|
||||
<!-- TODO ADD android:contentDescription="@string/descr_xyz" -->
|
||||
|
||||
<!-- BOTTOM SHEET -->
|
||||
<android.support.v4.widget.NestedScrollView
|
||||
android:id="@+id/statistics_sheet"
|
||||
|
|
|
@ -28,11 +28,9 @@
|
|||
<string name="snackbar_message_tracking_started">Tracking aktiviert</string>
|
||||
<string name="snackbar_message_location_offline">Standortdienste sind deaktiviert. Trackbook kann nicht aufzeichnen.</string>
|
||||
|
||||
<!-- dialogs -->
|
||||
<string name="dialog_clear_map_title">Zurücksetzen</string>
|
||||
<string name="dialog_clear_map_message">Möchten Sie die Karte zurücksetzen?</string>
|
||||
<string name="dialog_clear_map_okay">Zurücksetzen</string>
|
||||
<string name="dialog_clear_map_cancel">Abbrechen</string>
|
||||
<!-- fab sub menu -->
|
||||
<string name="fab_sub_menu_clear">Zurücksetzen</string>
|
||||
<string name="fab_sub_menu_save_and_clear">Speichern und Zurücksetzen</string>
|
||||
|
||||
<!-- toast messages -->
|
||||
<string name="toast_message_permissions_granted">Berechtigungen erteilt.</string>
|
||||
|
@ -42,7 +40,7 @@
|
|||
<string name="toast_message_acquiring_location">Suche aktuellen Standort.</string>
|
||||
<string name="toast_message_location_services_not_ready">Standortdienste noch nicht bereit. Bitte erneut versuchen.</string>
|
||||
<string name="toast_message_last_location">Letzte Position:</string>
|
||||
<string name="toast_message_clear_map">Kartenansicht wird zurückgesetzt</string>
|
||||
<string name="toast_message_save_track">Aufzeichnung wird gespeichert.</string>
|
||||
<string name="toast_message_last_location_age_one_hour">über eine Stunde</string>
|
||||
|
||||
<!-- map markers -->
|
||||
|
|
|
@ -28,11 +28,10 @@
|
|||
<string name="snackbar_message_tracking_started">Tracking started</string>
|
||||
<string name="snackbar_message_location_offline">Location is turned off. Trackbook will not work.</string>
|
||||
|
||||
<!-- dialogs -->
|
||||
<string name="dialog_clear_map_title">Clear</string>
|
||||
<string name="dialog_clear_map_message">Do you want to clear the map?</string>
|
||||
<string name="dialog_clear_map_okay">Clear</string>
|
||||
<string name="dialog_clear_map_cancel">Cancel</string>
|
||||
<!-- fab sub menu -->
|
||||
<string name="fab_sub_menu_clear">Clear</string>
|
||||
<string name="fab_sub_menu_save_and_clear">Save and Clear</string>
|
||||
|
||||
|
||||
<!-- toast messages -->
|
||||
<string name="toast_message_permissions_granted">Permissions granted.</string>
|
||||
|
@ -42,7 +41,7 @@
|
|||
<string name="toast_message_acquiring_location">Acquiring current location.</string>
|
||||
<string name="toast_message_location_services_not_ready">Location services not ready. Please retry.</string>
|
||||
<string name="toast_message_last_location">Last location:</string>
|
||||
<string name="toast_message_clear_map">Clearing map.</string>
|
||||
<string name="toast_message_save_track">Saving current track.</string>
|
||||
<string name="toast_message_last_location_age_one_hour">over one hour</string>
|
||||
|
||||
<!-- map markers -->
|
||||
|
|
|
@ -5,7 +5,7 @@ buildscript {
|
|||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:2.2.2'
|
||||
classpath 'com.android.tools.build:gradle:2.2.3'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
|
Loading…
Reference in a new issue