Maps: Make track color configurable

This commit is contained in:
José Rebelo
2025-04-04 22:02:46 +00:00
committed by José Rebelo
parent 49fb88ed9d
commit cfdee2b1f9
8 changed files with 132 additions and 5 deletions
@@ -16,7 +16,10 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.activities;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
@@ -26,6 +29,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.mapsforge.core.graphics.Paint;
import org.mapsforge.core.graphics.Style;
@@ -50,7 +54,9 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.Objects;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.maps.MapsSettingsFragment;
import nodomain.freeyourgadget.gadgetbridge.activities.maps.MapsTrackActivity;
import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint;
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate;
@@ -71,6 +77,17 @@ public class ActivitySummariesGpsFragment extends AbstractGBFragment {
private File inputFile;
private MapsManager mapsManager;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
if (MapsSettingsFragment.ACTION_SETTING_CHANGE.equals(intent.getAction())) {
// FIXME: Map reloading is not working properly
//LOG.debug("Reloading map view");
//mapsManager.loadMaps(mapView);
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -82,6 +99,10 @@ public class ActivitySummariesGpsFragment extends AbstractGBFragment {
mapsManager = new MapsManager(requireContext());
mapsManager.loadMaps(mapView);
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MapsSettingsFragment.ACTION_SETTING_CHANGE);
LocalBroadcastManager.getInstance(requireActivity()).registerReceiver(mReceiver, intentFilter);
if (mapsManager.isMapLoaded()) {
gpsWarning.setVisibility(View.GONE);
}
@@ -92,6 +113,12 @@ public class ActivitySummariesGpsFragment extends AbstractGBFragment {
return rootView;
}
@Override
public void onDestroyView() {
LocalBroadcastManager.getInstance(requireActivity()).unregisterReceiver(mReceiver);
super.onDestroyView();
}
public void set_data(File inputFile) {
this.inputFile = inputFile;
if (mapView != null) { //first fragment inflate is AFTER this is called
@@ -156,7 +183,8 @@ public class ActivitySummariesGpsFragment extends AbstractGBFragment {
.collect(Collectors.toList());
Paint paint = AndroidGraphicFactory.INSTANCE.createPaint();
paint.setColor(getResources().getColor(R.color.hrv_status_low));
final int trackColor = GBApplication.getPrefs().getInt(MapsManager.PREF_TRACK_COLOR, getResources().getColor(R.color.hrv_status_low));
paint.setColor(trackColor);
paint.setStrokeWidth(8);
paint.setStyle(Style.STROKE);
Polyline polyline = new Polyline(paint, AndroidGraphicFactory.INSTANCE);
@@ -23,11 +23,14 @@ import android.os.Bundle;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.Preference;
import java.util.Objects;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractPreferenceFragment;
import nodomain.freeyourgadget.gadgetbridge.util.maps.MapsManager;
@@ -35,6 +38,8 @@ import nodomain.freeyourgadget.gadgetbridge.util.maps.MapsManager;
public class MapsSettingsFragment extends AbstractPreferenceFragment {
static final String FRAGMENT_TAG = "MAP_SETTINGS_FRAGMENT";
public static final String ACTION_SETTING_CHANGE = "nodomain.freeyourgadget.gadgetbridge.maps.setting_change";
@Override
public void onCreatePreferences(@Nullable final Bundle savedInstanceState, @Nullable final String rootKey) {
setPreferencesFromResource(R.xml.map_settings, rootKey);
@@ -65,6 +70,7 @@ public class MapsSettingsFragment extends AbstractPreferenceFragment {
.putString(MapsManager.PREF_MAPS_FOLDER, localUri.toString())
.apply();
prefFolder.setSummary(localUri.toString());
broadcastPreferenceChange();
}
}
);
@@ -74,5 +80,17 @@ public class MapsSettingsFragment extends AbstractPreferenceFragment {
mapsFolderChooser.launch(null);
return true;
});
final Preference prefTrackColor = Objects.requireNonNull(findPreference(MapsManager.PREF_TRACK_COLOR));
prefTrackColor.setOnPreferenceChangeListener((preference, newValue) -> {
broadcastPreferenceChange();
return true;
});
}
private void broadcastPreferenceChange() {
final Intent intent = new Intent();
intent.setAction(ACTION_SETTING_CHANGE);
LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent);
}
}
@@ -16,10 +16,18 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.activities.maps;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.core.view.MenuProvider;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.mapsforge.core.graphics.Paint;
import org.mapsforge.core.graphics.Style;
@@ -30,6 +38,8 @@ import org.mapsforge.core.util.LatLongUtils;
import org.mapsforge.map.android.graphics.AndroidGraphicFactory;
import org.mapsforge.map.android.view.MapView;
import org.mapsforge.map.layer.overlay.Polyline;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.Collections;
@@ -37,6 +47,7 @@ import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.ActivitySummariesGpsFragment;
@@ -44,11 +55,26 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityPoint;
import nodomain.freeyourgadget.gadgetbridge.model.GPSCoordinate;
import nodomain.freeyourgadget.gadgetbridge.util.maps.MapsManager;
public class MapsTrackActivity extends AbstractGBActivity {
public class MapsTrackActivity extends AbstractGBActivity implements MenuProvider {
private static final Logger LOG = LoggerFactory.getLogger(MapsTrackActivity.class);
private MapView mapView;
private File file;
public static boolean isActivityOpen = false;
private MapsManager mapsManager;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
if (MapsSettingsFragment.ACTION_SETTING_CHANGE.equals(intent.getAction())) {
// FIXME: Map reloading is not working properly
//LOG.debug("Reloading map view");
//mapsManager.loadMaps(mapView);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -60,10 +86,17 @@ public class MapsTrackActivity extends AbstractGBActivity {
}
isActivityOpen = true;
// FIXME: This is disabled since map reloading is not working properly
//addMenuProvider(this);
mapView = findViewById(R.id.activitygpsview);
MapsManager mapsManager = new MapsManager(this);
mapsManager = new MapsManager(this);
mapsManager.loadMaps(mapView);
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(MapsSettingsFragment.ACTION_SETTING_CHANGE);
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, intentFilter);
file = (File) getIntent().getExtras().get("file");
final List<GPSCoordinate> trackPoints = ActivitySummariesGpsFragment.getActivityPoints(file)
.stream()
@@ -83,7 +116,8 @@ public class MapsTrackActivity extends AbstractGBActivity {
.collect(Collectors.toList());
Paint paint = AndroidGraphicFactory.INSTANCE.createPaint();
paint.setColor(getResources().getColor(R.color.hrv_status_low));
final int trackColor = GBApplication.getPrefs().getInt(MapsManager.PREF_TRACK_COLOR, getResources().getColor(R.color.hrv_status_low));
paint.setColor(trackColor);
paint.setStrokeWidth(8);
paint.setStyle(Style.STROKE);
Polyline polyline = new Polyline(paint, AndroidGraphicFactory.INSTANCE);
@@ -123,6 +157,23 @@ public class MapsTrackActivity extends AbstractGBActivity {
synchronized (MapsTrackActivity.class) {
isActivityOpen = false;
}
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
@Override
public void onCreateMenu(@NonNull final Menu menu, @NonNull final MenuInflater menuInflater) {
menuInflater.inflate(R.menu.maps_track_menu, menu);
}
@Override
public boolean onMenuItemSelected(@NonNull final MenuItem menuItem) {
final int itemId = menuItem.getItemId();
if (itemId == R.id.maps_settings) {
final Intent enableIntent = new Intent(this, MapsSettingsActivity.class);
startActivity(enableIntent);
return true;
}
return false;
}
}
@@ -45,6 +45,7 @@ public final class MapsManager {
private static final Logger LOG = LoggerFactory.getLogger(MapsManager.class);
public static final String PREF_MAPS_FOLDER = "maps_folder";
public static final String PREF_TRACK_COLOR = "maps_track_color";
private final Context mContext;
+11
View File
@@ -0,0 +1,11 @@
<menu 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"
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.maps.MapsTrackActivity">
<item
android:id="@+id/maps_settings"
android:icon="@drawable/ic_settings"
android:title="@string/maps_settings"
app:iconTint="?attr/actionmenu_icon_color"
app:showAsAction="ifRoom" />
</menu>
+2
View File
@@ -86,6 +86,8 @@
<color name="alternate_row_background_light">#FFEDEDED</color>
<color name="alternate_row_background_dark">#545254</color>
<color name="map_track_default" type="color">#fc5203</color>
<color name="transparent">#00000000</color>
<drawable name="selected">@color/accent</drawable>
+1
View File
@@ -3809,4 +3809,5 @@
<string name="maps_settings">Maps settings</string>
<string name="maps_download_title">Download Maps</string>
<string name="maps_download_summary">Click here to download map files. They should be saved to the folder selected in the preference below.</string>
<string name="maps_track_color_title">Track color</string>
</resources>
+16 -1
View File
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:icon="@drawable/ic_download"
android:key="maps_download"
@@ -11,4 +12,18 @@
android:icon="@drawable/ic_folder"
android:key="maps_folder"
android:title="@string/folder" />
<PreferenceCategory
android:key="pref_header_theme"
android:title="@string/pref_title_theme"
app:iconSpaceReserved="false">
<com.jaredrummler.android.colorpicker.ColorPreferenceCompat
android:defaultValue="@color/map_track_default"
android:icon="@drawable/ic_paint"
android:key="maps_track_color"
android:title="@string/maps_track_color_title"
app:cpv_dialogTitle="@string/maps_track_color_title" />
</PreferenceCategory>
</PreferenceScreen>