diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 2fddc98cc6..6e80c3a83d 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -37,6 +37,7 @@ import net.osmand.data.PointDescription; import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.map.ITileSource; +import net.osmand.plus.dialogs.SpeedCamerasBottomSheet; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; @@ -569,6 +570,9 @@ public class MapActivityActions implements DialogProvider { if (targets.hasTooLongDistanceToNavigate()) { app.showToastMessage(R.string.route_is_too_long_v2); } + if (!settings.SPEED_CAMERAS_ALERT_SHOWED.get()) { + SpeedCamerasBottomSheet.showInstance(mapActivity.getSupportFragmentManager(), null); + } } public void recalculateRoute(boolean showDialog) { diff --git a/OsmAnd/src/net/osmand/plus/dialogs/SpeedCamerasBottomSheet.java b/OsmAnd/src/net/osmand/plus/dialogs/SpeedCamerasBottomSheet.java index ceb267385d..997bc98d8b 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/SpeedCamerasBottomSheet.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/SpeedCamerasBottomSheet.java @@ -7,6 +7,9 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import net.osmand.plus.OsmandApplication; @@ -20,9 +23,10 @@ public class SpeedCamerasBottomSheet extends MenuBottomSheetDialogFragment { public static final String TAG = SpeedCamerasBottomSheet.class.getName(); private OsmandApplication app; - public static void showInstance(@NonNull FragmentManager fm) { + public static void showInstance(@NonNull FragmentManager fm, @Nullable Fragment targetFragment) { if (!fm.isStateSaved()) { SpeedCamerasBottomSheet bottomSheet = new SpeedCamerasBottomSheet(); + bottomSheet.setTargetFragment(targetFragment, 0); bottomSheet.show(fm, TAG); } } @@ -36,19 +40,34 @@ public class SpeedCamerasBottomSheet extends MenuBottomSheetDialogFragment { @Override public void createMenuItems(Bundle savedInstanceState) { View root = UiUtilities.getInflater(app, nightMode).inflate(R.layout.bottom_sheet_speed_cameras, null); - ((ImageView) root.findViewById(R.id.icon)).setImageResource(R.drawable.img_speed_camera_warning); + ((ImageView) root.findViewById(R.id.icon)).setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.img_speed_camera_warning)); ((TextView) root.findViewById(R.id.description)).setText(getDescriptionText()); items.add(new BaseBottomSheetItem.Builder().setCustomView(root).create()); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + UiUtilities.setupDialogButton(nightMode, rightButton, getDismissButtonType(), R.string.keep_active); + } + @Override protected void onRightBottomButtonClick() { - super.onRightBottomButtonClick(); + setDialogShowed(); + dismiss(); } @Override protected void onDismissButtonClickAction() { - super.onDismissButtonClickAction(); + app.getSettings().SPEED_CAMERAS_UNINSTALLED.set(true); + app.getSettings().SPEAK_SPEED_CAMERA.set(false); + app.getSettings().SHOW_CAMERAS.set(false); + Fragment targetFragment = getTargetFragment(); + if (targetFragment instanceof OnSpeedCamerasUninstallListener) { + ((OnSpeedCamerasUninstallListener) targetFragment).onSpeedCamerasUninstalled(); + } + setDialogShowed(); + dismiss(); } @Override @@ -67,4 +86,12 @@ public class SpeedCamerasBottomSheet extends MenuBottomSheetDialogFragment { String text = getString(R.string.speed_cameras_legal_descr, keepActive, uninstall); return UiUtilities.setWordsMediumFont(app, text, keepActive, uninstall); } + + private void setDialogShowed() { + app.getSettings().SPEED_CAMERAS_ALERT_SHOWED.set(true); + } + + public interface OnSpeedCamerasUninstallListener { + void onSpeedCamerasUninstalled(); + } } diff --git a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java index 10037b6d0f..55d211417a 100644 --- a/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java +++ b/OsmAnd/src/net/osmand/plus/settings/backend/OsmandSettings.java @@ -2108,6 +2108,9 @@ public class OsmandSettings { public final OsmandPreference SPEAK_SPEED_CAMERA = new BooleanPreference("speak_cameras", false).makeProfile().cache(); public final OsmandPreference SPEAK_TUNNELS = new BooleanPreference("speak_tunnels", false).makeProfile().cache(); + public final OsmandPreference SPEED_CAMERAS_UNINSTALLED = new BooleanPreference("speed_cameras_uninstalled", false).makeGlobal().cache(); + public final OsmandPreference SPEED_CAMERAS_ALERT_SHOWED = new BooleanPreference("speed_cameras_alert_showed", false).makeGlobal().cache(); + public final OsmandPreference ANNOUNCE_WPT = new BooleanPreference("announce_wpt", true) { @Override protected boolean setValue(Object prefs, Boolean val) { diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/GlobalSettingsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/GlobalSettingsFragment.java index 0763b302a4..8896c159b9 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/GlobalSettingsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/GlobalSettingsFragment.java @@ -7,6 +7,7 @@ import android.widget.ImageView; import androidx.fragment.app.FragmentManager; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceViewHolder; import androidx.preference.SwitchPreferenceCompat; @@ -14,20 +15,28 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.SettingsGeneralActivity; import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment; +import net.osmand.plus.dialogs.SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate; import net.osmand.plus.dialogs.SpeedCamerasBottomSheet; +import net.osmand.plus.dialogs.SpeedCamerasBottomSheet.OnSpeedCamerasUninstallListener; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.preferences.ListPreferenceEx; import net.osmand.plus.settings.preferences.SwitchPreferenceEx; -public class GlobalSettingsFragment extends BaseSettingsFragment implements SendAnalyticsBottomSheetDialogFragment.OnSendAnalyticsPrefsUpdate, OnPreferenceChanged { +public class GlobalSettingsFragment extends BaseSettingsFragment + implements OnSendAnalyticsPrefsUpdate, OnPreferenceChanged, + OnSpeedCamerasUninstallListener { public static final String TAG = GlobalSettingsFragment.class.getSimpleName(); private static final String SEND_ANONYMOUS_DATA_PREF_ID = "send_anonymous_data"; private static final String DIALOGS_AND_NOTIFICATIONS_PREF_ID = "dialogs_and_notifications"; private static final String UNINSTALL_SPEED_CAMERAS_PREF_ID = "uninstall_speed_cameras"; + private static final String LEGAL_CATEGORY_ID = "legal"; + + private Preference uninstallSpeedCameras; + private PreferenceCategory legalCategory; @Override protected void setupPreferences() { @@ -38,7 +47,12 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send setupSendAnonymousDataPref(); setupDialogsAndNotificationsPref(); setupEnableProxyPref(); - setupUninstallSpeedCamerasPref(); + legalCategory = (PreferenceCategory) findPreference(LEGAL_CATEGORY_ID); + uninstallSpeedCameras = (Preference) findPreference(UNINSTALL_SPEED_CAMERAS_PREF_ID); + uninstallSpeedCameras.setIcon(getPersistentPrefIcon(R.drawable.ic_speed_camera_disabled)); + if (settings.SPEED_CAMERAS_UNINSTALLED.get()) { + onSpeedCamerasUninstalled(); + } } @Override @@ -117,7 +131,7 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send if (UNINSTALL_SPEED_CAMERAS_PREF_ID.equals(prefId)) { FragmentManager fm = getFragmentManager(); if (fm != null) { - SpeedCamerasBottomSheet.showInstance(fm); + SpeedCamerasBottomSheet.showInstance(fm, this); } } return super.onPreferenceClick(preference); @@ -207,8 +221,11 @@ public class GlobalSettingsFragment extends BaseSettingsFragment implements Send enableProxy.setIcon(getPersistentPrefIcon(R.drawable.ic_action_proxy)); } - private void setupUninstallSpeedCamerasPref() { - Preference uninstallSpeedCameras = (Preference) findPreference(UNINSTALL_SPEED_CAMERAS_PREF_ID); - uninstallSpeedCameras.setIcon(getPersistentPrefIcon(R.drawable.ic_speed_camera_disabled)); + @Override + public void onSpeedCamerasUninstalled() { + if (uninstallSpeedCameras != null && legalCategory != null) { + uninstallSpeedCameras.setVisible(false); + legalCategory.setVisible(false); + } } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/ScreenAlertsFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/ScreenAlertsFragment.java index 683aa15a49..4752a11590 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/ScreenAlertsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/ScreenAlertsFragment.java @@ -9,8 +9,11 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; @@ -19,6 +22,7 @@ import androidx.preference.SwitchPreferenceCompat; import net.osmand.AndroidUtils; import net.osmand.plus.OsmandApplication; import net.osmand.plus.dialogs.SpeedCamerasBottomSheet; +import net.osmand.plus.dialogs.SpeedCamerasBottomSheet.OnSpeedCamerasUninstallListener; import net.osmand.plus.helpers.FontCache; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.R; @@ -28,30 +32,34 @@ import java.lang.ref.WeakReference; import static net.osmand.plus.UiUtilities.CompoundButtonType.TOOLBAR; -public class ScreenAlertsFragment extends BaseSettingsFragment { +public class ScreenAlertsFragment extends BaseSettingsFragment implements OnSpeedCamerasUninstallListener { public static final String TAG = ScreenAlertsFragment.class.getSimpleName(); private static final String SHOW_ROUTING_ALARMS_INFO = "show_routing_alarms_info"; private static final String SCREEN_ALERTS_IMAGE = "screen_alerts_image"; private static final String SHOW_CAMERAS = "show_cameras"; + private SwitchPreferenceCompat showCameras; @Override protected void setupPreferences() { Preference showRoutingAlarmsInfo = findPreference(SHOW_ROUTING_ALARMS_INFO); SwitchPreferenceCompat showTrafficWarnings = (SwitchPreferenceCompat) findPreference(settings.SHOW_TRAFFIC_WARNINGS.getId()); SwitchPreferenceCompat showPedestrian = (SwitchPreferenceCompat) findPreference(settings.SHOW_PEDESTRIAN.getId()); - SwitchPreferenceCompat showCameras = (SwitchPreferenceCompat) findPreference(settings.SHOW_CAMERAS.getId()); SwitchPreferenceCompat showTunnels = (SwitchPreferenceCompat) findPreference(settings.SHOW_TUNNELS.getId()); + showCameras = (SwitchPreferenceCompat) findPreference(settings.SHOW_CAMERAS.getId()); showRoutingAlarmsInfo.setIcon(getContentIcon(R.drawable.ic_action_info_dark)); showTrafficWarnings.setIcon(getIcon(R.drawable.list_warnings_traffic_calming)); showPedestrian.setIcon(getIcon(R.drawable.list_warnings_pedestrian)); - showCameras.setIcon(getIcon(R.drawable.list_warnings_speed_camera)); showTunnels.setIcon(getIcon(R.drawable.list_warnings_tunnel)); + showCameras.setIcon(getIcon(R.drawable.list_warnings_speed_camera)); setupScreenAlertsImage(); enableDisablePreferences(settings.SHOW_ROUTING_ALARMS.getModeValue(getSelectedAppMode())); + if (settings.SPEED_CAMERAS_UNINSTALLED.get()) { + onSpeedCamerasUninstalled(); + } } @Override @@ -112,7 +120,7 @@ public class ScreenAlertsFragment extends BaseSettingsFragment { deviceImage.setImageDrawable(getDeviceImage()); warningIcon.setImageDrawable(getWarningIcon()); } else if (SHOW_CAMERAS.equals(key)) { - setupSpeedCamerasAlert(app, requireMyActivity(), holder, isNightMode()); + setupSpeedCamerasAlert(app, requireMyActivity(), holder, this, isNightMode()); } } } @@ -155,7 +163,11 @@ public class ScreenAlertsFragment extends BaseSettingsFragment { return null; } - public static void setupSpeedCamerasAlert(OsmandApplication app, FragmentActivity activity, PreferenceViewHolder holder, boolean nightMode) { + public static void setupSpeedCamerasAlert(@NonNull OsmandApplication app, + @NonNull FragmentActivity activity, + @NonNull PreferenceViewHolder holder, + @Nullable Fragment targetFragment, + boolean nightMode) { ImageView alertIcon = (ImageView) holder.itemView.findViewById(R.id.alert_icon); TextView alertTitle = (TextView) holder.itemView.findViewById(R.id.alert_title); TextView alertSubTitle = (TextView) holder.itemView.findViewById(R.id.alert_subtitle); @@ -176,14 +188,22 @@ public class ScreenAlertsFragment extends BaseSettingsFragment { ? app.getResources().getColor(R.color.active_color_primary_dark) : app.getResources().getColor(R.color.active_color_primary_light)); final WeakReference weakActivity = new WeakReference<>(activity); + final WeakReference weakFragment = new WeakReference<>(targetFragment); alertSubTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { FragmentActivity a = weakActivity.get(); if (a != null) { - SpeedCamerasBottomSheet.showInstance(a.getSupportFragmentManager()); + SpeedCamerasBottomSheet.showInstance(a.getSupportFragmentManager(), weakFragment.get()); } } }); } + + @Override + public void onSpeedCamerasUninstalled() { + if (showCameras != null) { + showCameras.setVisible(false); + } + } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java index 084a55ce64..11c1f6b72b 100644 --- a/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/fragments/VoiceAnnouncesFragment.java @@ -1,8 +1,6 @@ package net.osmand.plus.settings.fragments; import android.app.Activity; -import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -12,14 +10,13 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.SwitchCompat; import androidx.core.content.ContextCompat; import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; -import androidx.preference.SwitchPreferenceCompat; import net.osmand.AndroidUtils; +import net.osmand.plus.dialogs.SpeedCamerasBottomSheet.OnSpeedCamerasUninstallListener; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.R; @@ -37,9 +34,10 @@ import static net.osmand.plus.settings.backend.OsmandSettings.VOICE_PROVIDER_NOT import static net.osmand.plus.UiUtilities.CompoundButtonType.TOOLBAR; import static net.osmand.plus.activities.SettingsNavigationActivity.MORE_VALUE; -public class VoiceAnnouncesFragment extends BaseSettingsFragment { +public class VoiceAnnouncesFragment extends BaseSettingsFragment implements OnSpeedCamerasUninstallListener { public static final String TAG = VoiceAnnouncesFragment.class.getSimpleName(); + private Preference speakCamera; @Override protected void createToolbar(LayoutInflater inflater, View view) { @@ -100,6 +98,10 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment { setupInterruptMusicPref(); } enableDisablePreferences(!settings.VOICE_MUTE.getModeValue(getSelectedAppMode())); + speakCamera = findPreference(settings.SPEAK_SPEED_CAMERA.getId()); + if (settings.SPEED_CAMERAS_UNINSTALLED.get()) { + onSpeedCamerasUninstalled(); + } } private void setupSpeedLimitExceedPref() { @@ -209,29 +211,6 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment { getPreferenceScreen().addPreference(interruptMusicPref); } - public void confirmSpeedCamerasDlg() { - Context ctx = getContext(); - if (ctx == null) { - return; - } - AlertDialog.Builder bld = new AlertDialog.Builder(UiUtilities.getThemedContext(ctx, isNightMode())); - bld.setMessage(R.string.confirm_usage_speed_cameras); - bld.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - onConfirmPreferenceChange( - settings.SPEAK_SPEED_CAMERA.getId(), true, ApplyQueryType.SNACK_BAR); - SwitchPreferenceCompat speakSpeedCamera = (SwitchPreferenceCompat) findPreference(settings.SPEAK_SPEED_CAMERA.getId()); - if (speakSpeedCamera != null) { - speakSpeedCamera.setChecked(true); - } - } - }); - bld.setNegativeButton(R.string.shared_string_cancel, null); - bld.show(); - } - private void updateMenu() { MapActivity mapActivity = getMapActivity(); if (mapActivity != null) { @@ -253,7 +232,7 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment { imageView.setEnabled(preference.isEnabled() && !OsmandSettings.VOICE_PROVIDER_NOT_USE.equals(currentValue)); } } else if (settings.SPEAK_SPEED_CAMERA.getId().equals(preference.getKey())) { - ScreenAlertsFragment.setupSpeedCamerasAlert(app, requireMyActivity(), holder, isNightMode()); + ScreenAlertsFragment.setupSpeedCamerasAlert(app, requireMyActivity(), holder, this, isNightMode()); } } @@ -277,8 +256,8 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment { } if (prefId.equals(settings.SPEAK_SPEED_CAMERA.getId())) { if (!settings.SPEAK_SPEED_CAMERA.getModeValue(selectedMode)) { - confirmSpeedCamerasDlg(); - return false; + return onConfirmPreferenceChange( + settings.SPEAK_SPEED_CAMERA.getId(), true, ApplyQueryType.SNACK_BAR); } else { return onConfirmPreferenceChange( settings.SPEAK_SPEED_CAMERA.getId(), false, ApplyQueryType.SNACK_BAR); @@ -315,4 +294,11 @@ public class VoiceAnnouncesFragment extends BaseSettingsFragment { super.onApplyPreferenceChange(prefId, applyToAllProfiles, newValue); } } + + @Override + public void onSpeedCamerasUninstalled() { + if (speakCamera != null) { + speakCamera.setVisible(false); + } + } } \ No newline at end of file