Update UI of announcement time

This commit is contained in:
cepprice 2021-01-14 18:11:02 +05:00
parent b9f1f69934
commit 3d925646f8
8 changed files with 538 additions and 53 deletions

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape android:shape="rectangle" >
<solid
android:color="#4d007eb3" />
<corners android:radius="30dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape android:shape="rectangle" >
<solid
android:color="@color/profile_icon_color_blue_light" />
<corners android:radius="30dp" />
</shape>
</clip>
</item>
</layer-list>

View file

@ -0,0 +1,12 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<item>
<shape android:shape="oval">
<size
android:height="12dp"
android:width="12dp" />
<solid android:color="@color/profile_icon_color_blue_light" />
</shape>
</item>
</layer-list>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="2dp"
android:height="2dp" />
<solid android:color="#17181A" />
</shape>

View file

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:osmand="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/bottom_sheet_exit_button_margin">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/announcement_time_title"
android:gravity="center_vertical"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
android:textStyle="bold"
osmand:typeface="@string/font_roboto_medium"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"/>
<net.osmand.plus.widgets.TextViewEx
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/announcement_time_descr"
android:textSize="@dimen/default_desc_text_size"
android:textColor="?android:textColorSecondary"
android:lineSpacingMultiplier="1.1"
osmand:typeface="@string/font_roboto_regular"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"/>
<ImageView
android:id="@+id/iv_illustration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
tools:srcCompat="@drawable/img_help_announcement_time_day"/>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/tv_seek_bar_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/default_list_text_size"
android:textColor="@color/active_color_primary_light"
osmand:typeface="@string/font_roboto_medium"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
tools:text="Normal" />
<SeekBar
android:id="@+id/seek_bar_arrival"
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="3"
android:maxHeight="2dp"
android:progressDrawable="@drawable/seekbar_progress_announcement_time"
android:thumb="@drawable/seekbar_thumb_announcement_time"
osmand:tickMark="@drawable/seekbar_tickmark_announcement_time"
android:paddingTop="11dp"
android:paddingBottom="11dp"
android:layout_marginTop="@dimen/pages_item_margin"
tools:progress="1" />
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/content_padding_small"
tools:background="@color/divider_color" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/announcement_time_intervals"
android:textSize="@dimen/default_list_text_size"
android:textColor="?android:textColorPrimary"
osmand:typeface="@string/font_roboto_regular" />
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|end"
app:srcCompat="@drawable/ic_action_arrow_down"
app:tint="@color/icon_color_default_dark" />
</FrameLayout>
<net.osmand.plus.widgets.TextViewEx
android:id="@+id/tv_interval_descr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textSize="@dimen/default_list_text_size"
android:lineSpacingMultiplier="1.2"
osmand:typeface="@string/font_roboto_regular"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
tools:visibility="visible"
tools:text="Turn
\n • Prepare: 315 - 320 m, 110 sec.
\n • Approach: 60 - 65 m, 20 sec.
\n • Passing: 5 - 10 m, 3 sec.
\nArrive at destination: 5 - 10 m, 2 sec.
\nOff-route: 25 - 30 m, 9 sec.
\nTraffic warnings
\n • Approach: 5 - 10 m, 3 sec.
\n • Passing: 15 - 20 m, 4 sec.
\nWaypoint / Favourite / POI
\n • Approach: 80 - 85 m, 25 sec
\n • Passing: 20 - 25 m, 7 sec. "/>
</LinearLayout>

View file

@ -11,7 +11,17 @@
Thx - Hardy
-->
<string name="announcement_time_title">Announcement time</string>
<string name="announcement_time_descr">Announcement time of different voice prompts depends on prompt type, current navigation speed and default navigation speed.</string>
<string name="announcement_time_intervals">Time and distance intervals</string>
<string name="announcement_time_turn">Turn</string>
<string name="announcement_time_arrive">Arrive at destination</string>
<string name="announcement_time_off_route">Off route</string>
<string name="announcement_time_prepare">Prepare</string>
<string name="announcement_time_prepare_long">Long Prepare</string>
<string name="announcement_time_approach">Approach</string>
<string name="announcement_time_passing">Passing</string>
<string name="shared_string_sec">sec</string>
<string name="shared_string_empty">Empty</string>
<string name="select_folder_descr">Select folder or add new one</string>
<string name="select_folder">Select folder</string>

View file

@ -1,7 +1,13 @@
package net.osmand.plus.routing.data;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.StyleSpan;
import net.osmand.Location;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.voice.AbstractPrologCommandPlayer;
@ -42,6 +48,10 @@ public class AnnounceTimeDistances {
private int LONG_ALARM_ANNOUNCE_RADIUS;
private int SHORT_ALARM_ANNOUNCE_RADIUS;
private String format;
private String meter;
private String second;
public AnnounceTimeDistances(ApplicationMode appMode, OsmandSettings settings) {
if (appMode.isDerivedRoutingFrom(ApplicationMode.CAR)) {
// keep it as minimum 30 km/h for voice announcement
@ -51,6 +61,7 @@ public class AnnounceTimeDistances {
DEFAULT_SPEED = (float) Math.max(0.3, appMode.getDefaultSpeed());
}
// 300 s: car 3750 m (113 s @ 120 km/h)
PREPARE_LONG_DISTANCE = (int) (DEFAULT_SPEED * 300);
// 250 s: car 3125 m (94 s @ 120 km/h)
@ -79,28 +90,7 @@ public class AnnounceTimeDistances {
}
float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f);
// Turn now: 3.5 s normal speed, 7 s for half speed (default)
// float TURN_NOW_TIME = 7;
// ** #8749 to keep 1m / 1 sec precision (POSITIONING_TOLERANCE = 12 m)
// car 50 km/h - 7 s, bicycle 10 km/h - 3 s, pedestrian 4 km/h - 2 s, 1 km/h - 1 s
float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8);
// 3.6 s: car 45 m, bicycle 10 m -> 12 m, pedestrian 4 m -> 12 m (capped by POSITIONING_TOLERANCE)
TURN_NOW_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 3.6) * ARRIVAL_DISTANCE_FACTOR);
TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME;
// 5 s: car 63 m, bicycle 14 m, pedestrian 6 m -> 12 m (capped by POSITIONING_TOLERANCE)
ARRIVAL_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 5.) * ARRIVAL_DISTANCE_FACTOR);
// 20 s: car 250 m, bicycle 56 m, pedestrian 22 m
OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * ARRIVAL_DISTANCE_FACTOR; // 20 seconds
// assume for backward compatibility speed - 10 m/s
SHORT_ALARM_ANNOUNCE_RADIUS = (int) (7 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 70 m
LONG_ALARM_ANNOUNCE_RADIUS = (int) (12 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 120 m
SHORT_PNT_ANNOUNCE_RADIUS = (int) (15 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 150 m
LONG_PNT_ANNOUNCE_RADIUS = (int) (60 * DEFAULT_SPEED * ARRIVAL_DISTANCE_FACTOR); // 600 m
setArrivalDistances(ARRIVAL_DISTANCE_FACTOR);
// Trigger close prompts earlier to allow BT SCO link being established, or when VOICE_PROMPT_DELAY is set >0 for the other stream types
int ams = settings.AUDIO_MANAGER_STREAM.getModeValue(appMode);
@ -111,6 +101,31 @@ public class AnnounceTimeDistances {
}
}
public void setArrivalDistances(float arrivalDistanceFactor) {
arrivalDistanceFactor = Math.max(arrivalDistanceFactor, 0.1f);
// Turn now: 3.5 s normal speed, 7 s for half speed (default)
// float TURN_NOW_TIME = 7;
// ** #8749 to keep 1m / 1 sec precision (POSITIONING_TOLERANCE = 12 m)
// car 50 km/h - 7 s, bicycle 10 km/h - 3 s, pedestrian 4 km/h - 2 s, 1 km/h - 1 s
float TURN_NOW_TIME = (float) Math.min(Math.sqrt(DEFAULT_SPEED * 3.6), 8);
// 3.6 s: car 45 m, bicycle 10 m -> 12 m, pedestrian 4 m -> 12 m (capped by POSITIONING_TOLERANCE)
TURN_NOW_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 3.6) * arrivalDistanceFactor);
TURN_NOW_SPEED = TURN_NOW_DISTANCE / TURN_NOW_TIME;
// 5 s: car 63 m, bicycle 14 m, pedestrian 6 m -> 12 m (capped by POSITIONING_TOLERANCE)
ARRIVAL_DISTANCE = (int) (Math.max(POSITIONING_TOLERANCE, DEFAULT_SPEED * 5.) * arrivalDistanceFactor);
// 20 s: car 250 m, bicycle 56 m, pedestrian 22 m
OFF_ROUTE_DISTANCE = DEFAULT_SPEED * 20 * arrivalDistanceFactor; // 20 seconds
// assume for backward compatibility speed - 10 m/s
SHORT_ALARM_ANNOUNCE_RADIUS = (int) (7 * DEFAULT_SPEED * arrivalDistanceFactor); // 70 m
LONG_ALARM_ANNOUNCE_RADIUS = (int) (12 * DEFAULT_SPEED * arrivalDistanceFactor); // 120 m
SHORT_PNT_ANNOUNCE_RADIUS = (int) (15 * DEFAULT_SPEED * arrivalDistanceFactor); // 150 m
LONG_PNT_ANNOUNCE_RADIUS = (int) (60 * DEFAULT_SPEED * arrivalDistanceFactor); // 600 m
}
public int getImminentTurnStatus(float dist, Location loc) {
float speed = getSpeed(loc);
if (isTurnStateActive(speed, dist, STATE_TURN_NOW)) {
@ -199,38 +214,90 @@ public class AnnounceTimeDistances {
return (int) (dist - voicePromptDelayTimeSec * speed);
}
private void appendTurnDesc(StringBuilder s, String name, int dist) {
appendTurnDesc(s, name, dist, DEFAULT_SPEED);
public Spannable getIntervalsDescription(OsmandApplication app) {
format = "\n%s: %d - %d %s, %d %s.";
meter = app.getString(R.string.m);
second = app.getString(R.string.shared_string_sec);
String turn = app.getString(R.string.announcement_time_turn);
String arrive = app.getString(R.string.announcement_time_arrive);
String offRoute = app.getString(R.string.announcement_time_off_route);
String traffic = "\n" + app.getString(R.string.way_alarms);
String point = "\n" + String.format(
"%s / %s / %s", app.getString(R.string.shared_string_waypoint),
app.getString(R.string.favorite), app.getString(R.string.poi)
);
String prepare = "" + app.getString(R.string.announcement_time_prepare);
String longPrepare = "" + app.getString(R.string.announcement_time_prepare_long);
String approach = "" + app.getString(R.string.announcement_time_approach);
String passing = "" + app.getString(R.string.announcement_time_passing);
SpannableStringBuilder builder = new SpannableStringBuilder();
// Turn
builder.append(turn);
makeBold(builder, turn);
if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) {
appendDescr(builder, prepare, PREPARE_DISTANCE);;
}
if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) {
appendDescr(builder, longPrepare, PREPARE_LONG_DISTANCE);
}
appendDescr(builder, approach, TURN_IN_DISTANCE);
appendDescr(builder, passing, TURN_NOW_DISTANCE, TURN_NOW_SPEED);
// Arrive at destination
appendDescr(builder, arrive, (int) (getArrivalDistance()));
makeBoldFormatted(builder, arrive);
// Off-route
if (getOffRouteDistance() > 0) {
appendDescr(builder, offRoute, (int) getOffRouteDistance());
makeBoldFormatted(builder, offRoute);
}
// Traffic warnings
builder.append(traffic);
makeBold(builder, traffic);
appendDescr(builder, approach, LONG_ALARM_ANNOUNCE_RADIUS);
appendDescr(builder, passing, SHORT_ALARM_ANNOUNCE_RADIUS);
// Waypoint / Favorite / POI
builder.append(point);
makeBold(builder, point);
appendDescr(builder, approach, LONG_PNT_ANNOUNCE_RADIUS);
appendDescr(builder, passing, SHORT_PNT_ANNOUNCE_RADIUS);
return builder;
}
private void appendTurnDesc(StringBuilder s, String name, int dist, float speed) {
private void appendDescr(SpannableStringBuilder b, String word, int dist) {
appendDescr(b, word, dist, DEFAULT_SPEED);
}
private void appendDescr(SpannableStringBuilder b, String word, int dist, float speed) {
int minDist = (dist / 5) * 5;
int time = (int) (dist / speed);
if(time > 15) {
// round to 5
time = (time / 5) * 5;
}
s.append(String.format("%s: %d - %d m, %d sec\n", name, minDist, minDist + 5, time));
b.append(String.format(format, word, minDist, minDist + 5, meter, time, second));
}
public String getTurnsDescription() {
StringBuilder turnDescriptions = new StringBuilder();
appendTurnDesc(turnDescriptions, "Turn (now)", TURN_NOW_DISTANCE, TURN_NOW_SPEED);
appendTurnDesc(turnDescriptions, "Turn (approach)", TURN_IN_DISTANCE);
if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) {
appendTurnDesc(turnDescriptions, "Turn (prepare)", PREPARE_DISTANCE);
}
if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) {
appendTurnDesc(turnDescriptions, "Turn (early prepare)", PREPARE_LONG_DISTANCE);
}
appendTurnDesc(turnDescriptions, "Arrival", (int) getArrivalDistance());
if (getOffRouteDistance() > 0) {
appendTurnDesc(turnDescriptions, "Off-route", (int) getOffRouteDistance());
}
appendTurnDesc(turnDescriptions, "Alarm (close)", SHORT_ALARM_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "Alarm (standard)", LONG_ALARM_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "Waypoint / fav / POI (passing)", SHORT_PNT_ANNOUNCE_RADIUS);
appendTurnDesc(turnDescriptions, "Waypoint / fav / POI (approaching)", LONG_PNT_ANNOUNCE_RADIUS);
return turnDescriptions.toString();
private void makeBold(SpannableStringBuilder b, String word) {
int end = b.length();
int start = end - word.length();
b.setSpan(new StyleSpan(Typeface.BOLD), start, end,
SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
}
private void makeBoldFormatted(SpannableStringBuilder b, String word) {
int start = b.toString().indexOf(word);
int end = start + word.length() + 1;
b.setSpan(new StyleSpan(Typeface.BOLD), start, end,
SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}

View file

@ -0,0 +1,209 @@
package net.osmand.plus.settings.bottomsheets;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import net.osmand.PlatformUtil;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R;
import net.osmand.plus.UiUtilities;
import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.fragments.OnPreferenceChanged;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import net.osmand.plus.widgets.TextViewEx;
import org.apache.commons.logging.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
public class AnnouncementTimeBottomSheet extends BasePreferenceBottomSheet
implements SeekBar.OnSeekBarChangeListener {
public static final String SELECTED_ENTRY_INDEX_KEY = "selected_entry_index_key";
public static final String TAG = AnnouncementTimeBottomSheet.class.getSimpleName();
private static final Log LOG = PlatformUtil.getLog(AnnouncementTimeBottomSheet.class);
private OsmandApplication app;
private AnnounceTimeDistances announceTimeDistances;
private ListPreferenceEx listPreference;
private int selectedEntryIndex = -1;
private View rootView;
private TextViewEx tvSeekBarLabel;
private SeekBar seekBarArrival;
private ImageView ivArrow;
private TextViewEx tvIntervalsDescr;
private boolean collapsed = false;
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = getMyApplication();
if (app == null) {
return;
}
announceTimeDistances = new AnnounceTimeDistances(getAppMode(), app.getSettings());
listPreference = getListPreference();
if (listPreference == null || listPreference.getEntries() == null ||
listPreference.getEntryValues() == null) {
return;
}
if (savedInstanceState != null) {
selectedEntryIndex = savedInstanceState.getInt(SELECTED_ENTRY_INDEX_KEY);
} else {
selectedEntryIndex = listPreference.findIndexOfValue(listPreference.getValue());
}
items.add(createBottomSheetItem());
}
@Override
public void onResume() {
super.onResume();
updateViews();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_ENTRY_INDEX_KEY, selectedEntryIndex);
}
@Override
protected int getDismissButtonTextId() {
return R.string.shared_string_cancel;
}
@Override
protected int getRightBottomButtonTextId() {
return R.string.shared_string_apply;
}
@Override
protected void onRightBottomButtonClick() {
Object[] entryValues = listPreference.getEntryValues();
if (entryValues != null && selectedEntryIndex >= 0) {
Object value = entryValues[selectedEntryIndex];
if (listPreference.callChangeListener(value)) {
listPreference.setValue(value);
}
Fragment target = getTargetFragment();
if (target instanceof OnPreferenceChanged) {
((OnPreferenceChanged) target).onPreferenceChanged(listPreference.getKey());
}
}
dismiss();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (progress != selectedEntryIndex) {
selectedEntryIndex = progress;
updateViews();
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
private ListPreferenceEx getListPreference() {
return (ListPreferenceEx) getPreference();
}
private BaseBottomSheetItem createBottomSheetItem() {
rootView = UiUtilities.getInflater(getContext(), nightMode)
.inflate(R.layout.bottom_sheet_announcement_time, null);
tvSeekBarLabel = rootView.findViewById(R.id.tv_seek_bar_label);
seekBarArrival = rootView.findViewById(R.id.seek_bar_arrival);
ivArrow = rootView.findViewById(R.id.iv_arrow);
tvIntervalsDescr = rootView.findViewById(R.id.tv_interval_descr);
seekBarArrival.setOnSeekBarChangeListener(this);
ivArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleViews();
}
});
setupIvIllustration();
setDividerColor();
return new BaseBottomSheetItem.Builder()
.setCustomView(rootView)
.create();
}
private void setupIvIllustration() {
int drawableId = nightMode ? R.drawable.img_help_announcement_time_night
: R.drawable.img_help_announcement_time_day;
ImageView ivIllustration = rootView.findViewById(R.id.iv_illustration);
ivIllustration.setImageResource(drawableId);
}
private void setDividerColor() {
int colorId = nightMode ? R.color.divider_color_dark : R.color.divider_color_light;
View divider = rootView.findViewById(R.id.divider);
divider.setBackgroundColor(getResources().getColor(colorId));
}
private void updateViews() {
seekBarArrival.setProgress(selectedEntryIndex);
tvSeekBarLabel.setText(listPreference.getEntries()[selectedEntryIndex]);
float value = (float) listPreference.getEntryValues()[selectedEntryIndex];
announceTimeDistances.setArrivalDistances(value);
tvIntervalsDescr.setText(announceTimeDistances.getIntervalsDescription(app));
}
private void toggleViews() {
int drawableId = collapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up;
collapsed = !collapsed;
ivArrow.setImageResource(drawableId);
if (tvIntervalsDescr.getVisibility() == View.VISIBLE) {
tvIntervalsDescr.setVisibility(View.GONE);
} else {
tvIntervalsDescr.setVisibility(View.VISIBLE);
}
}
public static void showInstance(@NonNull FragmentManager fm, String prefKey, Fragment target,
@Nullable ApplicationMode appMode) {
try {
if (!fm.isStateSaved()) {
Bundle args = new Bundle();
args.putString(PREFERENCE_ID, prefKey);
AnnouncementTimeBottomSheet fragment = new AnnouncementTimeBottomSheet();
fragment.setArguments(args);
fragment.setAppMode(appMode);
fragment.setTargetFragment(target, 0);
fragment.show(fm, TAG);
}
} catch (RuntimeException e) {
LOG.error("showInstance", e);
}
}
}

View file

@ -12,6 +12,7 @@ import android.widget.TextView;
import androidx.appcompat.widget.SwitchCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreferenceCompat;
@ -30,6 +31,7 @@ import net.osmand.plus.helpers.enums.MetricsConstants;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.settings.bottomsheets.AnnouncementTimeBottomSheet;
import net.osmand.plus.settings.preferences.ListPreferenceEx;
import java.util.Set;
@ -42,8 +44,25 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
public static final String TAG = VoiceAnnouncesFragment.class.getSimpleName();
private static final String MORE_VALUE = "MORE_VALUE";
private static final String ARRIVAL_DISTANCE_FACTOR = "arrival_distance_factor";
private static final String VOICE_PROMPTS_TIMETABLE = "voice_prompts_timetable";
@Override
public void onDisplayPreferenceDialog(Preference preference) {
String prefId = preference.getKey();
if (prefId.equals(ARRIVAL_DISTANCE_FACTOR)) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
AnnouncementTimeBottomSheet.showInstance(
fragmentManager, preference.getKey(), this, getSelectedAppMode()
);
}
} else {
super.onDisplayPreferenceDialog(preference);
}
}
@Override
protected void createToolbar(LayoutInflater inflater, View view) {
super.createToolbar(inflater, view);
@ -110,13 +129,14 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
private void updateVoicePromptsTimes() {
Preference pref = findPreference(VOICE_PROMPTS_TIMETABLE);
if (OsmandPlugin.isDevelopment()) {
AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings);
pref.setSummary(atd.getTurnsDescription().trim());
pref.setVisible(true);
} else {
pref.setVisible(false);
}
// if (OsmandPlugin.isDevelopment()) {
// AnnounceTimeDistances atd = new AnnounceTimeDistances(getSelectedAppMode(), settings);
// pref.setSummary(atd.getTurnsDescription().trim());
// pref.setVisible(true);
// } else {
// pref.setVisible(false);
// }
pref.setVisible(false);
}
private void setupSpeedLimitExceedPref() {