Minor fixes

This commit is contained in:
Vitaliy 2021-01-17 01:25:22 +02:00
parent f18ff499a4
commit 56d869389f
7 changed files with 299 additions and 332 deletions

View file

@ -3,63 +3,62 @@
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:orientation="vertical"
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_marginStart="@dimen/content_padding"
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginTop="@dimen/content_padding_small"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:layout_marginStart="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"/>
android:gravity="center_vertical"
android:text="@string/announcement_time_title"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium" />
<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"/>
android:layout_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
android:layout_marginRight="@dimen/content_padding"
android:lineSpacingMultiplier="1.1"
android:text="@string/announcement_time_descr"
android:textColor="?android:textColorSecondary"
android:textSize="@dimen/default_desc_text_size"
osmand:typeface="@string/font_roboto_regular" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_illustration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_marginStart="@dimen/content_padding"
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"/>
android:layout_marginRight="@dimen/content_padding"
android:adjustViewBounds="true"
osmand:srcCompat="?attr/image_help_announcement_time" />
<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_marginStart="@dimen/content_padding"
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"
android:layout_marginRight="@dimen/content_padding"
android:textColor="?attr/active_color_basic"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_medium"
tools:text="Normal" />
<SeekBar
@ -67,14 +66,14 @@
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="3"
android:layout_marginTop="@dimen/pages_item_margin"
android:maxHeight="2dp"
android:paddingTop="11dp"
android:paddingBottom="11dp"
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:max="3"
tools:progress="1" />
<View
@ -82,48 +81,51 @@
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/content_padding_small"
tools:background="@color/divider_color" />
android:background="?attr/divider_color_basic" />
<FrameLayout
<LinearLayout
android:id="@+id/description_container"
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">
android:background="?attr/selectableItemBackground"
android:orientation="horizontal"
android:paddingStart="@dimen/content_padding"
android:paddingLeft="@dimen/content_padding"
android:paddingTop="@dimen/content_padding_small"
android:paddingEnd="@dimen/content_padding"
android:paddingRight="@dimen/content_padding"
android:paddingBottom="@dimen/content_padding_small">
<net.osmand.plus.widgets.TextViewEx
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/announcement_time_intervals"
android:textSize="@dimen/default_list_text_size"
android:textColor="?android:textColorPrimary"
android:textSize="@dimen/default_list_text_size"
osmand:typeface="@string/font_roboto_regular" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
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>
android:tint="?attr/default_icon_color"
app:srcCompat="@drawable/ic_action_arrow_down" />
</LinearLayout>
<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_marginLeft="@dimen/content_padding"
android:layout_marginEnd="@dimen/content_padding"
tools:visibility="visible"
android:layout_marginRight="@dimen/content_padding"
android:lineSpacingMultiplier="@dimen/line_spacing_multiplier_description"
android:textSize="@dimen/default_list_text_size"
android:visibility="gone"
osmand:typeface="@string/font_roboto_regular"
tools:text="Turn
\n • Prepare: 315 - 320 m, 110 sec.
\n • Approach: 60 - 65 m, 20 sec.
@ -135,6 +137,7 @@
\n • Passing: 15 - 20 m, 4 sec.
\nWaypoint / Favourite / POI
\n • Approach: 80 - 85 m, 25 sec
\n • Passing: 20 - 25 m, 7 sec. "/>
\n • Passing: 20 - 25 m, 7 sec. "
tools:visibility="visible" />
</LinearLayout>

View file

@ -140,6 +140,7 @@
<attr name="btn_radio_button_center" format="reference"/>
<attr name="bg_dash_line" format="reference"/>
<attr name="text_input_background" format="reference"/>
<attr name="image_help_announcement_time" format="reference"/>
</declare-styleable>
<declare-styleable name="PagerSlidingTabStrip">

View file

@ -15,11 +15,11 @@
<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="shared_string_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_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>

View file

@ -247,6 +247,7 @@
<item name="checkboxStyle">@style/CheckboxStyle</item>
<item name="radioButtonStyle">@style/RadioButtonStyle</item>
<item name="text_input_background">@color/text_input_background_light</item>
<item name="image_help_announcement_time">@drawable/img_help_announcement_time_day</item>
</style>
<style name="ToolbarStyle" parent="@style/Widget.AppCompat.Toolbar">
@ -543,6 +544,7 @@
<item name="checkboxStyle">@style/CheckboxStyle</item>
<item name="radioButtonStyle">@style/RadioButtonStyle</item>
<item name="text_input_background">@color/text_input_background_dark</item>
<item name="image_help_announcement_time">@drawable/img_help_announcement_time_night</item>
</style>
<style name="FreeVersionBanner" parent="OsmandDarkTheme">

View file

@ -48,10 +48,6 @@ 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
@ -61,7 +57,6 @@ 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)
@ -89,8 +84,7 @@ public class AnnounceTimeDistances {
PREPARE_DISTANCE_END = PREPARE_DISTANCE * 2;
}
float ARRIVAL_DISTANCE_FACTOR = Math.max(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode), 0.1f);
setArrivalDistances(ARRIVAL_DISTANCE_FACTOR);
setArrivalDistances(settings.ARRIVAL_DISTANCE_FACTOR.getModeValue(appMode));
// 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);
@ -214,12 +208,24 @@ public class AnnounceTimeDistances {
return (int) (dist - voicePromptDelayTimeSec * 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);
private void appendTurnDesc(SpannableStringBuilder builder, String name, int dist, String meter, String second) {
appendTurnDesc(builder, name, dist, DEFAULT_SPEED, meter, second);
}
String turn = app.getString(R.string.announcement_time_turn);
private void appendTurnDesc(SpannableStringBuilder builder, String name, int dist, float speed, String meter, String second) {
int minDist = (dist / 5) * 5;
int time = (int) (dist / speed);
if (time > 15) {
// round to 5
time = (time / 5) * 5;
}
builder.append(String.format("\n%s: %d - %d %s, %d %s.", name, minDist, minDist + 5, meter, time, second));
}
public Spannable getIntervalsDescription(OsmandApplication app) {
String meter = app.getString(R.string.m);
String second = app.getString(R.string.shared_string_sec);
String turn = app.getString(R.string.shared_string_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);
@ -239,53 +245,39 @@ public class AnnounceTimeDistances {
builder.append(turn);
makeBold(builder, turn);
if (PREPARE_DISTANCE_END <= PREPARE_DISTANCE) {
appendDescr(builder, prepare, PREPARE_DISTANCE);;
appendTurnDesc(builder, prepare, PREPARE_DISTANCE, meter, second);
}
if (PREPARE_LONG_DISTANCE_END <= PREPARE_LONG_DISTANCE) {
appendDescr(builder, longPrepare, PREPARE_LONG_DISTANCE);
appendTurnDesc(builder, longPrepare, PREPARE_LONG_DISTANCE, meter, second);
}
appendDescr(builder, approach, TURN_IN_DISTANCE);
appendDescr(builder, passing, TURN_NOW_DISTANCE, TURN_NOW_SPEED);
appendTurnDesc(builder, approach, TURN_IN_DISTANCE, meter, second);
appendTurnDesc(builder, passing, TURN_NOW_DISTANCE, TURN_NOW_SPEED, meter, second);
// Arrive at destination
appendDescr(builder, arrive, (int) (getArrivalDistance()));
appendTurnDesc(builder, arrive, (int) (getArrivalDistance()), meter, second);
makeBoldFormatted(builder, arrive);
// Off-route
if (getOffRouteDistance() > 0) {
appendDescr(builder, offRoute, (int) getOffRouteDistance());
appendTurnDesc(builder, offRoute, (int) getOffRouteDistance(), meter, second);
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);
appendTurnDesc(builder, approach, LONG_ALARM_ANNOUNCE_RADIUS, meter, second);
appendTurnDesc(builder, passing, SHORT_ALARM_ANNOUNCE_RADIUS, meter, second);
// Waypoint / Favorite / POI
builder.append(point);
makeBold(builder, point);
appendDescr(builder, approach, LONG_PNT_ANNOUNCE_RADIUS);
appendDescr(builder, passing, SHORT_PNT_ANNOUNCE_RADIUS);
appendTurnDesc(builder, approach, LONG_PNT_ANNOUNCE_RADIUS, meter, second);
appendTurnDesc(builder, passing, SHORT_PNT_ANNOUNCE_RADIUS, meter, second);
return builder;
}
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;
}
b.append(String.format(format, word, minDist, minDist + 5, meter, time, second));
}
private void makeBold(SpannableStringBuilder b, String word) {
int end = b.length();
int start = end - word.length();
@ -299,5 +291,4 @@ public class AnnounceTimeDistances {
b.setSpan(new StyleSpan(Typeface.BOLD), start, end,
SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}

View file

@ -5,11 +5,17 @@ import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
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.helpers.AndroidUiHelper;
import net.osmand.plus.routing.data.AnnounceTimeDistances;
import net.osmand.plus.settings.backend.ApplicationMode;
import net.osmand.plus.settings.fragments.OnPreferenceChanged;
@ -18,50 +24,38 @@ 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;
import static net.osmand.plus.settings.bottomsheets.SingleSelectPreferenceBottomSheet.SELECTED_ENTRY_INDEX_KEY;
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;
private boolean collapsed = true;
@Override
public void createMenuItems(Bundle savedInstanceState) {
app = getMyApplication();
if (app == null) {
return;
}
app = requiredMyApplication();
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 {
@ -131,7 +125,7 @@ public class AnnouncementTimeBottomSheet extends BasePreferenceBottomSheet
}
private BaseBottomSheetItem createBottomSheetItem() {
rootView = UiUtilities.getInflater(getContext(), nightMode)
View rootView = UiUtilities.getInflater(getContext(), nightMode)
.inflate(R.layout.bottom_sheet_announcement_time, null);
tvSeekBarLabel = rootView.findViewById(R.id.tv_seek_bar_label);
@ -140,35 +134,19 @@ public class AnnouncementTimeBottomSheet extends BasePreferenceBottomSheet
tvIntervalsDescr = rootView.findViewById(R.id.tv_interval_descr);
seekBarArrival.setOnSeekBarChangeListener(this);
ivArrow.setOnClickListener(new View.OnClickListener() {
seekBarArrival.setMax(listPreference.getEntries().length - 1);
rootView.findViewById(R.id.description_container).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleViews();
toggleDescriptionVisibility();
}
});
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]);
@ -178,20 +156,14 @@ public class AnnouncementTimeBottomSheet extends BasePreferenceBottomSheet
tvIntervalsDescr.setText(announceTimeDistances.getIntervalsDescription(app));
}
private void toggleViews() {
int drawableId = collapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up;
private void toggleDescriptionVisibility() {
collapsed = !collapsed;
ivArrow.setImageResource(drawableId);
if (tvIntervalsDescr.getVisibility() == View.VISIBLE) {
tvIntervalsDescr.setVisibility(View.GONE);
} else {
tvIntervalsDescr.setVisibility(View.VISIBLE);
}
ivArrow.setImageResource(collapsed ? R.drawable.ic_action_arrow_down : R.drawable.ic_action_arrow_up);
AndroidUiHelper.updateVisibility(tvIntervalsDescr, !collapsed);
}
public static void showInstance(@NonNull FragmentManager fm, String prefKey, Fragment target,
@Nullable ApplicationMode appMode) {
@Nullable ApplicationMode appMode, boolean usedOnMap) {
try {
if (!fm.isStateSaved()) {
Bundle args = new Bundle();
@ -199,6 +171,7 @@ public class AnnouncementTimeBottomSheet extends BasePreferenceBottomSheet
AnnouncementTimeBottomSheet fragment = new AnnouncementTimeBottomSheet();
fragment.setArguments(args);
fragment.setAppMode(appMode);
fragment.setUsedOnMap(usedOnMap);
fragment.setTargetFragment(target, 0);
fragment.show(fm, TAG);
}

View file

@ -42,23 +42,6 @@ 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";
@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) {
@ -319,6 +302,20 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnPr
return super.onPreferenceClick(preference);
}
@Override
public void onDisplayPreferenceDialog(Preference preference) {
String prefId = preference.getKey();
if (settings.ARRIVAL_DISTANCE_FACTOR.getId().equals(prefId)) {
FragmentManager fragmentManager = getFragmentManager();
if (fragmentManager != null) {
AnnouncementTimeBottomSheet.showInstance(fragmentManager, preference.getKey(), this, getSelectedAppMode(), false);
}
} else {
super.onDisplayPreferenceDialog(preference);
}
}
@Override
public void onPreferenceChanged(String prefId) {
if (prefId.equals(settings.SPEED_CAMERAS_UNINSTALLED.getId())) {