This commit is contained in:
Dennis Guse
2019-07-17 23:05:03 +02:00
parent ff611795a0
commit 01b4bc0e76
39 changed files with 239 additions and 283 deletions
@@ -16,19 +16,10 @@
package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.fragments.ConfirmDeleteDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDeleteDialogFragment.ConfirmDeleteCaller;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Menu;
@@ -38,6 +29,14 @@ import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.SearchView;
import com.google.android.apps.mytracks.fragments.ConfirmDeleteDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDeleteDialogFragment.ConfirmDeleteCaller;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils;
import com.google.android.maps.mytracks.R;
import java.util.ArrayList;
/**
@@ -64,8 +63,7 @@ public abstract class AbstractTrackActivity extends AbstractActivity implements
}
}
public static void configureListViewContextualMenu(final Activity activity, final ListView listView,
final ContextualActionModeCallback contextualActionModeCallback) {
public static void configureListViewContextualMenu(final ListView listView, final ContextualActionModeCallback contextualActionModeCallback) {
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@@ -33,8 +33,6 @@ import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Scroller;
import androidx.annotation.VisibleForTesting;
import com.google.android.apps.mytracks.content.Waypoint;
import com.google.android.apps.mytracks.stats.ExtremityMonitor;
import com.google.android.apps.mytracks.util.IntentUtils;
@@ -649,18 +647,15 @@ public class ChartView extends View {
/**
* Draws a x axis marker.
*
* @param canvas
* @param canvas canvas
* @param value value
* @param numberFormat the number format
* @param spacing the spacing between x axis and marker
*/
private void drawXAxisMarker(
Canvas canvas, double value, NumberFormat numberFormat, int spacing) {
String marker = chartByDistance ? numberFormat.format(value)
: StringUtils.formatElapsedTime((long) value);
private void drawXAxisMarker(Canvas canvas, double value, NumberFormat numberFormat, int spacing) {
String marker = chartByDistance ? numberFormat.format(value) : StringUtils.formatElapsedTime((long) value);
Rect rect = getRect(xAxisMarkerPaint, marker);
canvas.drawText(marker, getX(value), topBorder + effectiveHeight + spacing + rect.height(),
xAxisMarkerPaint);
canvas.drawText(marker, getX(value), topBorder + effectiveHeight + spacing + rect.height(), xAxisMarkerPaint);
}
/**
@@ -981,14 +976,4 @@ public class ChartView extends View {
return false;
}
}
/**
* Returns the status of metricUnits.
*
* @return the status of metricUnits
*/
@VisibleForTesting
public boolean isMetricUnits() {
return metricUnits;
}
}
@@ -20,7 +20,6 @@ import android.content.Context;
import android.os.AsyncTask;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
/**
* Async Task to delete tracks.
@@ -16,27 +16,12 @@
package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import com.google.android.apps.mytracks.content.WaypointsColumns;
import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.ListItemUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.os.Bundle;
import androidx.loader.app.LoaderManager.LoaderCallbacks;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import androidx.cursoradapter.widget.ResourceCursorAdapter;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@@ -49,6 +34,24 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.cursoradapter.widget.ResourceCursorAdapter;
import androidx.loader.app.LoaderManager;
import androidx.loader.app.LoaderManager.LoaderCallbacks;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import com.google.android.apps.mytracks.content.WaypointsColumns;
import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.ListItemUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
/**
* Activity to show a list of markers in a track.
*
@@ -177,10 +180,11 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
}
};
listView.setAdapter(resourceCursorAdapter);
AbstractTrackActivity.configureListViewContextualMenu(this, listView, contextualActionModeCallback);
AbstractTrackActivity.configureListViewContextualMenu(listView, contextualActionModeCallback);
final long firstWaypointId = myTracksProviderUtils.getFirstWaypointId(trackId);
getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks<Cursor>() {
LoaderManager.getInstance(this).initLoader(0, null, new LoaderCallbacks<Cursor>() {
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(MarkerListActivity.this, WaypointsColumns.CONTENT_URI, PROJECTION,
@@ -189,12 +193,12 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
resourceCursorAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
resourceCursorAdapter.swapCursor(null);
}
});
@@ -244,15 +248,13 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.marker_list_insert_marker:
Intent intent = IntentUtils.newIntent(this, MarkerEditActivity.class)
.putExtra(MarkerEditActivity.EXTRA_TRACK_ID, track.getId());
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
if (item.getItemId() == R.id.marker_list_insert_marker) {
Intent intent = IntentUtils.newIntent(this, MarkerEditActivity.class)
.putExtra(MarkerEditActivity.EXTRA_TRACK_ID, track.getId());
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
@@ -36,6 +36,8 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.NonNull;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.SearchEngine;
import com.google.android.apps.mytracks.content.SearchEngine.ScoredResult;
@@ -179,8 +181,9 @@ public class SearchListActivity extends AbstractTrackActivity implements DeleteM
searchRecentSuggestions = SearchEngineProvider.newHelper(this);
arrayAdapter = new ArrayAdapter<Map<String, Object>>(this, R.layout.list_item, R.id.list_item_name) {
@NonNull
@Override
public View getView(int position, View convertView, android.view.ViewGroup parent) {
public View getView(int position, View convertView, @NonNull android.view.ViewGroup parent) {
View view;
if (convertView == null) {
view = getLayoutInflater().inflate(R.layout.list_item, parent, false);
@@ -228,7 +231,7 @@ public class SearchListActivity extends AbstractTrackActivity implements DeleteM
startActivity(intent);
}
});
AbstractTrackActivity.configureListViewContextualMenu(this, listView, contextualActionModeCallback);
AbstractTrackActivity.configureListViewContextualMenu(listView, contextualActionModeCallback);
handleIntent(getIntent());
}
@@ -16,6 +16,12 @@
package com.google.android.apps.mytracks;
import android.os.Bundle;
import android.os.Handler;
import android.text.format.DateFormat;
import android.util.Log;
import android.widget.TextView;
import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.services.ITrackRecordingService;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
@@ -27,13 +33,6 @@ import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import com.google.protobuf.InvalidProtocolBufferException;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.text.format.DateFormat;
import android.util.Log;
import android.widget.TextView;
/**
* An activity that displays information about sensors.
*
@@ -16,21 +16,19 @@
package com.google.android.apps.mytracks;
import android.app.Activity;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import com.google.android.apps.mytracks.services.ITrackRecordingService;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
/**
* Track controller for record, pause, resume, and stop.
*
@@ -48,6 +48,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.cursoradapter.widget.ResourceCursorAdapter;
import androidx.loader.app.LoaderManager;
import androidx.loader.app.LoaderManager.LoaderCallbacks;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
@@ -161,7 +162,7 @@ public class TrackListActivity extends AbstractTrackActivity implements FileType
@Override
public void run() {
TrackListActivity.this.invalidateOptionsMenu();
getSupportLoaderManager().restartLoader(0, null, loaderCallbacks);
LoaderManager.getInstance(TrackListActivity.this).restartLoader(0, null, loaderCallbacks);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
trackController.update(isRecording, recordingTrackPaused);
}
@@ -230,12 +231,12 @@ public class TrackListActivity extends AbstractTrackActivity implements FileType
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
resourceCursorAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
resourceCursorAdapter.swapCursor(null);
}
};
@@ -339,9 +340,9 @@ public class TrackListActivity extends AbstractTrackActivity implements FileType
}
};
listView.setAdapter(resourceCursorAdapter);
AbstractTrackActivity.configureListViewContextualMenu(this, listView, contextualActionModeCallback);
AbstractTrackActivity.configureListViewContextualMenu(listView, contextualActionModeCallback);
getSupportLoaderManager().initLoader(0, null, loaderCallbacks);
LoaderManager.getInstance(this).initLoader(0, null, loaderCallbacks);
showStartupDialogs();
}
@@ -365,7 +366,7 @@ public class TrackListActivity extends AbstractTrackActivity implements FileType
// Update UI
this.invalidateOptionsMenu();
getSupportLoaderManager().restartLoader(0, null, loaderCallbacks);
LoaderManager.getInstance(this).restartLoader(0, null, loaderCallbacks);
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
trackController.onResume(isRecording, recordingTrackPaused);
}
@@ -432,7 +433,7 @@ public class TrackListActivity extends AbstractTrackActivity implements FileType
updateMenuItems(isGpsStarted, isRecording);
View searchView = searchMenuItem.getActionView();
if (searchView != null && searchView instanceof SearchView) {
if (searchView instanceof SearchView) {
((SearchView) searchView).setQuery("", false);
}
return super.onPrepareOptionsMenu(menu);
@@ -33,6 +33,7 @@ import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.google.android.apps.mytracks.util.FileUtils;
@@ -129,7 +130,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public int delete(Uri url, String where, String[] selectionArgs) {
public int delete(@NonNull Uri url, String where, String[] selectionArgs) {
String table;
boolean shouldVacuum = false;
switch (getUrlType(url)) {
@@ -167,7 +168,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public String getType(Uri url) {
public String getType(@NonNull Uri url) {
switch (getUrlType(url)) {
case TRACKPOINTS:
return TrackPointsColumns.CONTENT_TYPE;
@@ -187,7 +188,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public Uri insert(Uri url, ContentValues initialValues) {
public Uri insert(@NonNull Uri url, ContentValues initialValues) {
if (initialValues == null) {
initialValues = new ContentValues();
}
@@ -204,7 +205,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public int bulkInsert(Uri url, ContentValues[] valuesBulk) {
public int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] valuesBulk) {
int numInserted;
try {
// Use a transaction in order to make the insertions run as a single batch
@@ -227,7 +228,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sort) {
public Cursor query(@NonNull Uri url, String[] projection, String selection, String[] selectionArgs, String sort) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
String sortOrder = null;
switch (getUrlType(url)) {
@@ -264,7 +265,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public int update(Uri url, ContentValues values, String where, String[] selectionArgs) {
public int update(@NonNull Uri url, ContentValues values, String where, String[] selectionArgs) {
String table;
String whereClause;
switch (getUrlType(url)) {
@@ -317,7 +318,7 @@ public class MyTracksProvider extends ContentProvider {
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode) throws FileNotFoundException {
try {
File file = new File(uri.getPath());
if (file.exists()) {
@@ -16,12 +16,6 @@
package com.google.android.apps.mytracks.content;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.apps.mytracks.util.FileUtils;
import com.google.protobuf.InvalidProtocolBufferException;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -30,6 +24,12 @@ import android.location.Location;
import android.net.Uri;
import android.util.Log;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.apps.mytracks.util.FileUtils;
import com.google.protobuf.InvalidProtocolBufferException;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -312,10 +312,8 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
* @param selectionArgs the selection arguments
* @param sortOrder the sort oder
*/
private Cursor getTrackCursor(
String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return contentResolver.query(
TracksColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
private Cursor getTrackCursor(String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return contentResolver.query(TracksColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
}
@Override
@@ -15,13 +15,15 @@
*/
package com.google.android.apps.mytracks.content;
import android.database.Cursor;
import android.location.Location;
import androidx.annotation.NonNull;
import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.apps.mytracks.util.LocationUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import android.database.Cursor;
import android.location.Location;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
@@ -113,6 +115,7 @@ public class SearchEngine {
public final Waypoint waypoint;
public final double score;
@NonNull
@Override
public String toString() {
return "ScoredResult ["
@@ -23,8 +23,6 @@ import android.os.Parcelable;
import com.google.android.apps.mytracks.stats.TripStatistics;
import java.net.URI;
/**
* A waypoint.
*
@@ -16,11 +16,6 @@
package com.google.android.apps.mytracks.content;
import static com.google.android.apps.mytracks.content.ContentTypeIds.FLOAT_TYPE_ID;
import static com.google.android.apps.mytracks.content.ContentTypeIds.INT_TYPE_ID;
import static com.google.android.apps.mytracks.content.ContentTypeIds.LONG_TYPE_ID;
import static com.google.android.apps.mytracks.content.ContentTypeIds.STRING_TYPE_ID;
import android.net.Uri;
import android.provider.BaseColumns;
@@ -18,15 +18,17 @@ package com.google.android.apps.mytracks.fragments;
import android.location.Location;
import android.os.Bundle;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ZoomControls;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.google.android.apps.mytracks.ChartView;
import com.google.android.apps.mytracks.TrackDetailActivity;
import com.google.android.apps.mytracks.content.MyTracksLocation;
@@ -108,7 +110,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.chart, container, false);
zoomControls = view.findViewById(R.id.chart_zoom_controls);
zoomControls.setOnZoomInClickListener(new View.OnClickListener() {
@@ -507,11 +509,6 @@ public class ChartFragment extends Fragment implements TrackDataListener {
}
}
@VisibleForTesting
ChartView getChartView() {
return chartView;
}
@VisibleForTesting
void setTripStatisticsUpdater(long time) {
tripStatisticsUpdater = new TripStatisticsUpdater(time);
@@ -16,27 +16,28 @@
package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentActivity;
import androidx.core.app.ShareCompat;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.app.ShareCompat;
import androidx.fragment.app.FragmentActivity;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.maps.mytracks.R;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -68,19 +69,16 @@ public class ChooseActivityDialogFragment extends AbstractMyTracksDialogFragment
ImageView icon;
}
public static final String CHOOSE_ACTIVITY_DIALOG_TAG = "chooseActivityDialog";
private ChooseActivityCaller caller;
private PackageManager packageManager;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);
try {
caller = (ChooseActivityCaller) activity;
caller = (ChooseActivityCaller) context;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implement " + ChooseActivityCaller.class.getSimpleName());
throw new ClassCastException(context + " must implement " + ChooseActivityCaller.class.getSimpleName());
}
}
@@ -16,25 +16,25 @@
package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.maps.mytracks.R;
import java.util.ArrayList;
import java.util.List;
@@ -75,16 +75,16 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);
try {
caller = (ChooseActivityTypeCaller) activity;
caller = (ChooseActivityTypeCaller) context;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement "
+ ChooseActivityTypeCaller.class.getSimpleName());
throw new ClassCastException(context + " must implement " + ChooseActivityTypeCaller.class.getSimpleName());
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return getDialog(getActivity(), getArguments().getString(KEY_CATEGORY), caller);
@@ -16,14 +16,14 @@
package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.maps.mytracks.R;
/**
* A DialogFragment to confirm delete.
*
@@ -68,13 +68,12 @@ public class ConfirmDeleteDialogFragment extends AbstractMyTracksDialogFragment
private ConfirmDeleteCaller caller;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);
try {
caller = (ConfirmDeleteCaller) activity;
caller = (ConfirmDeleteCaller) context;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implement " + ConfirmDeleteCaller.class.getSimpleName());
throw new ClassCastException(context + " must implement " + ConfirmDeleteCaller.class.getSimpleName());
}
}
@@ -16,17 +16,18 @@
package com.google.android.apps.mytracks.fragments;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.fragment.app.FragmentActivity;
import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.fragment.app.FragmentActivity;
/**
* A DialogFragment to delete marker.
*
@@ -62,13 +63,12 @@ public class DeleteMarkerDialogFragment extends AbstractMyTracksDialogFragment {
private DeleteMarkerCaller caller;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);
try {
caller = (DeleteMarkerCaller) activity;
caller = (DeleteMarkerCaller) context;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implement " + DeleteMarkerCaller.class.getSimpleName());
throw new ClassCastException(context + " must implement " + DeleteMarkerCaller.class.getSimpleName());
}
}
@@ -16,17 +16,17 @@
package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.io.file.TrackFileFormat;
import com.google.android.apps.mytracks.util.FileUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import com.google.android.apps.mytracks.io.file.TrackFileFormat;
import com.google.android.apps.mytracks.util.FileUtils;
import com.google.android.maps.mytracks.R;
/**
* A DialogFragment to select a file type, gpx, kml, etc.
*
@@ -70,13 +70,12 @@ public class FileTypeDialogFragment extends AbstractMyTracksDialogFragment {
private FileTypeCaller caller;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
public void onAttach(Context context) {
super.onAttach(context);
try {
caller = (FileTypeCaller) activity;
caller = (FileTypeCaller) context;
} catch (ClassCastException e) {
throw new ClassCastException(
activity.toString() + " must implement " + FileTypeCaller.class.getSimpleName());
throw new ClassCastException(context + " must implement " + FileTypeCaller.class.getSimpleName());
}
}
@@ -34,6 +34,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
@@ -118,7 +119,7 @@ public class MarkerDetailFragment extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.marker_detail_fragment, container, false);
getActivity().setTitle(getArguments().getString(KEY_TITLE));
@@ -19,7 +19,6 @@ package com.google.android.apps.mytracks.fragments;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -27,12 +26,11 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import com.google.android.apps.mytracks.TrackDetailActivity;
import com.google.android.apps.mytracks.content.MyTracksLocation;
import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TrackDataHub;
import com.google.android.apps.mytracks.content.TrackDataListener;
@@ -79,7 +77,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.stats, container, false);
}
@@ -16,6 +16,12 @@
package com.google.android.apps.mytracks.io.file.importer;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.util.Log;
import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.LocationIterator;
@@ -33,11 +39,9 @@ import com.google.android.apps.mytracks.util.TrackIconUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.util.Log;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.File;
import java.io.IOException;
@@ -50,10 +54,6 @@ import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Abstract class for various file track importers like {@link GpxFileTrackImporter} and
* {@link KmlFileTrackImporter}.
@@ -403,8 +403,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
Location location = createLocation();
// Calculate derived attributes from the previous point
if (trackData.lastLocationInCurrentSegment != null
&& trackData.lastLocationInCurrentSegment.getTime() != 0) {
if (trackData.lastLocationInCurrentSegment != null && trackData.lastLocationInCurrentSegment.getTime() != 0) {
long timeDifference = location.getTime() - trackData.lastLocationInCurrentSegment.getTime();
// Check for negative time change
@@ -16,22 +16,23 @@
package com.google.android.apps.mytracks.io.file.importer;
import android.content.Context;
import android.location.Location;
import android.net.Uri;
import androidx.annotation.VisibleForTesting;
import com.google.android.apps.mytracks.content.MyTracksLocation;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
import android.content.Context;
import android.location.Location;
import android.net.Uri;
import androidx.annotation.VisibleForTesting;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import java.util.ArrayList;
/**
* Imports a KML file.
*
@@ -288,8 +289,6 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
/**
* On sensor data start. gx:SimpleArrayData start tag.
*
* @param attributes
*/
private void onSensorDataStart(Attributes attributes) {
sensorName = attributes.getValue(ATTRIBUTE_NAME);
@@ -21,9 +21,8 @@ import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import androidx.annotation.VisibleForTesting;
import android.util.Log;
import com.google.android.apps.mytracks.widgets.TrackWidgetProvider;
import com.google.android.maps.mytracks.R;
@@ -17,16 +17,11 @@
package com.google.android.apps.mytracks.services;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.Nullable;
/**
* My Tracks Location Manager. Applies Google location settings before allowing
@@ -30,13 +30,11 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager.WakeLock;
import android.os.Process;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -16,6 +16,15 @@
package com.google.android.apps.mytracks.services.sensors;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
import com.google.android.apps.mytracks.content.Sensor.SensorState;
@@ -23,16 +32,6 @@ import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
/**
@@ -57,8 +57,6 @@ public class SensorManagerFactory {
/**
* Gets the temp sensor manager.
*
* @param context
*/
public static SensorManager getSensorManagerTemporary(Context context) {
releaseSensorManagerTemporary();
@@ -20,12 +20,13 @@ import android.content.Context;
import android.media.AudioManager;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
import androidx.annotation.VisibleForTesting;
import android.speech.tts.UtteranceProgressListener;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.google.android.apps.mytracks.services.TrackRecordingService;
import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.apps.mytracks.util.PreferencesUtils;
@@ -33,7 +34,6 @@ import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import java.util.HashMap;
import java.util.Locale;
/**
@@ -51,22 +51,23 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
private static final String TAG = AnnouncementPeriodicTask.class.getSimpleName();
@VisibleForTesting
static final HashMap<String, String> SPEECH_PARAMS = new HashMap<>();
static {
SPEECH_PARAMS.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "not_used");
}
private final UtteranceProgressListener utteranceListener = new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
}
private final OnUtteranceCompletedListener
utteranceListener = new OnUtteranceCompletedListener() {
@Override
public void onUtteranceCompleted(String utteranceId) {
int result = audioManager.abandonAudioFocus(null);
if (result == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
Log.w(TAG, "Failed to relinquish audio focus.");
}
}
};
@Override
public void onDone(String utteranceId) {
int result = audioManager.abandonAudioFocus(null);
if (result == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
Log.w(TAG, "Failed to relinquish audio focus.");
}
}
@Override
public void onError(String utteranceId) {
}
};
private final Context context;
private TextToSpeech tts;
@@ -186,7 +187,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
// Slow down the speed just a bit as it is hard to hear when exercising.
tts.setSpeechRate(TTS_SPEECH_RATE);
tts.setOnUtteranceCompletedListener(utteranceListener);
tts.setOnUtteranceProgressListener(utteranceListener);
}
/**
@@ -205,7 +206,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
* We don't care about the utterance id. It is supplied here to force
* onUtteranceCompleted to be called.
*/
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, SPEECH_PARAMS);
tts.speak(announcement, TextToSpeech.QUEUE_FLUSH, null, "not used");
}
/**
@@ -16,9 +16,6 @@
package com.google.android.apps.mytracks.settings;
import com.google.android.apps.mytracks.Constants;
import com.google.android.maps.mytracks.R;
import android.app.ActionBar;
import android.content.Context;
import android.os.Bundle;
@@ -30,6 +27,9 @@ import android.preference.PreferenceManager;
import android.speech.tts.TextToSpeech;
import android.view.MenuItem;
import com.google.android.apps.mytracks.Constants;
import com.google.android.maps.mytracks.R;
/**
* An abstract activity for all the settings activities.
*
@@ -101,8 +101,7 @@ public class AbstractSettingsActivity extends PreferenceActivity {
* @param values the values array
* @param value the value
*/
private void updatePreferenceSummary(
Preference preference, String[] summary, String[] values, String value) {
private void updatePreferenceSummary(Preference preference, String[] summary, String[] values, String value) {
int index = getIndex(values, value);
if (index == -1) {
preference.setSummary(R.string.value_unknown);
@@ -16,6 +16,11 @@
package com.google.android.apps.mytracks.settings;
import android.app.Dialog;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller;
import com.google.android.apps.mytracks.util.PreferencesUtils;
@@ -23,11 +28,6 @@ import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.apps.mytracks.util.UnitConversions;
import com.google.android.maps.mytracks.R;
import android.app.Dialog;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
/**
* An activity for accessing recording settings.
*
@@ -81,8 +81,7 @@ public class RecordingSettingsActivity extends AbstractSettingsActivity
return ChooseActivityTypeDialogFragment.getDialog(this, category, this);
}
private void configFrequencyPreference(
int key, int defaultValue, int valueArray, boolean metricUnits) {
private void configFrequencyPreference(int key, int defaultValue, int valueArray, boolean metricUnits) {
ListPreference preference = (ListPreference) findPreference(getString(key));
int value = PreferencesUtils.getInt(this, key, defaultValue);
String[] values = getResources().getStringArray(valueArray);
@@ -16,19 +16,18 @@
package com.google.android.apps.mytracks.settings;
import com.google.android.apps.mytracks.util.BluetoothDeviceUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.provider.Settings;
import com.google.android.apps.mytracks.util.BluetoothDeviceUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import java.util.ArrayList;
import java.util.List;
@@ -16,6 +16,8 @@
package com.google.android.apps.mytracks.stats;
import androidx.annotation.NonNull;
/**
* This class maintains a buffer of doubles. This buffer is a convenient class
* for storing a series of doubles and calculating information about them. This
@@ -118,6 +120,7 @@ public class DoubleBuffer {
}
}
@NonNull
@Override
public String toString() {
StringBuilder builder = new StringBuilder("Full: ");
@@ -16,6 +16,8 @@
package com.google.android.apps.mytracks.stats;
import androidx.annotation.NonNull;
/**
* A helper class that tracks a minimum and a maximum of a variable.
*
@@ -110,6 +112,7 @@ public class ExtremityMonitor {
return min != Double.POSITIVE_INFINITY && max != Double.NEGATIVE_INFINITY;
}
@NonNull
@Override
public String toString() {
return "Min: " + min + " Max: " + max;
@@ -19,6 +19,8 @@ package com.google.android.apps.mytracks.stats;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
/**
* Statistical data about a trip. The data in this class should be filled out by
* TripStatisticsBuilder.
@@ -477,6 +479,7 @@ public class TripStatistics implements Parcelable {
gradeExtremities.update(grade);
}
@NonNull
@Override
public String toString() {
return "TripStatistics { Start Time: " + getStartTime() + "; Stop Time: " + getStopTime()
@@ -21,7 +21,6 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.net.Uri;
import android.text.format.DateUtils;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
@@ -75,8 +74,7 @@ public class ListItemUtils {
textGradient.setVisibility(hasPhoto ? View.VISIBLE : View.GONE);
if (hasPhoto) {
int photoHeight = getPhotoHeight(activity);
photo.getLayoutParams().height = photoHeight;
photo.getLayoutParams().height = getPhotoHeight(activity);
photo.setImageResource(android.R.color.transparent);
photo.setImageURI(Uri.parse(photoUrl));
}
@@ -15,8 +15,6 @@
*/
package com.google.android.apps.mytracks.util;
import com.google.android.maps.mytracks.R;
import android.content.Context;
import android.location.Location;
import android.text.Html;
@@ -24,6 +22,8 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.text.format.DateUtils;
import com.google.android.maps.mytracks.R;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -152,11 +152,7 @@ public class StringUtils {
}
public static String formatDecimal(double value) {
return formatDecimal(value, 2);
}
private static String formatDecimal(double value, int precision) {
String result = String.format(Locale.getDefault(), "%1$,." + precision + "f", value);
String result = String.format(Locale.getDefault(), "%1$,.2f", value);
return result.replaceAll("[0]*$", "").replaceAll("\\.$", "");
}
@@ -16,6 +16,7 @@
package com.google.android.apps.mytracks.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -51,17 +52,13 @@ public class SystemUtils {
}
}
/**
* Tries to acquire a partial wake lock if not already acquired. Logs errors
* and gives up trying in case the wake lock cannot be acquired.
*/
/**
* Acquire a wake lock if not already acquired.
*
* @param context the context
* @param wakeLock wake lock or null
*/
@SuppressLint("WakelockTimeout")
public static WakeLock acquireWakeLock(Context context, WakeLock wakeLock) {
Log.i(TAG, "Acquiring wake lock.");
try {
@@ -16,6 +16,14 @@
package com.google.android.apps.mytracks.util;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
import com.google.android.apps.mytracks.TrackEditActivity;
import com.google.android.apps.mytracks.content.WaypointCreationRequest;
import com.google.android.apps.mytracks.services.ITrackRecordingService;
@@ -23,15 +31,6 @@ import com.google.android.apps.mytracks.services.TrackRecordingService;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.maps.mytracks.R;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
import java.util.List;
/**