mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-19 13:03:36 +00:00
Compare commits
1 Commits
v2025.10.0
...
test/2025.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8462351aba |
@@ -7,6 +7,7 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Color;
|
||||
import android.location.Location;
|
||||
@@ -99,6 +100,9 @@ import app.organicmaps.settings.DrivingOptionsActivity;
|
||||
import app.organicmaps.settings.RoadType;
|
||||
import app.organicmaps.settings.SettingsActivity;
|
||||
import app.organicmaps.settings.UnitLocale;
|
||||
import app.organicmaps.universalbuttons.UniversalButton;
|
||||
import app.organicmaps.universalbuttons.UniversalButtonsHolder;
|
||||
import app.organicmaps.universalbuttons.UniversalToggleButton;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.LocationUtils;
|
||||
import app.organicmaps.util.PowerManagment;
|
||||
@@ -116,6 +120,7 @@ import app.organicmaps.widget.placepage.PlacePageController;
|
||||
import app.organicmaps.widget.placepage.PlacePageData;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
@@ -127,6 +132,9 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static app.organicmaps.location.LocationState.FOLLOW;
|
||||
import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE;
|
||||
import static app.organicmaps.location.LocationState.LOCATION_TAG;
|
||||
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_ADD_PLACE_CODE;
|
||||
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_RECORD_TRACK_CODE;
|
||||
import static app.organicmaps.universalbuttons.UniversalButtonsHolder.BUTTON_SETTINGS_CODE;
|
||||
import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG;
|
||||
|
||||
public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@@ -200,6 +208,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private int mNavBarHeight;
|
||||
|
||||
private UniversalButtonsHolder buttonsHolder;
|
||||
|
||||
private PlacePageViewModel mPlacePageViewModel;
|
||||
private MapButtonsViewModel mMapButtonsViewModel;
|
||||
private MapButtonsController.LayoutMode mPreviousMapLayoutMode;
|
||||
@@ -232,6 +242,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
@NonNull
|
||||
private ActivityResultLauncher<Intent> mPowerSaveSettings;
|
||||
@NonNull
|
||||
private ActivityResultLauncher<Intent> mSettingsLauncher;
|
||||
@NonNull
|
||||
private boolean mPowerSaveDisclaimerShown = false;
|
||||
|
||||
@SuppressWarnings("NotNullFieldNotInitialized")
|
||||
@@ -415,6 +427,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
BookmarkCategoriesActivity.start(this);
|
||||
}
|
||||
|
||||
private void onAddPlace()
|
||||
{
|
||||
showPositionChooserForEditor(false, false);
|
||||
}
|
||||
|
||||
private void showHelp()
|
||||
{
|
||||
Intent intent = new Intent(this, HelpActivity.class);
|
||||
@@ -555,6 +572,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
mPowerSaveSettings = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
this::onPowerSaveResult);
|
||||
|
||||
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
this::onSettingsResult);
|
||||
|
||||
mShareLauncher = SharingUtils.RegisterLauncher(this);
|
||||
|
||||
mDisplayManager = DisplayManager.from(this);
|
||||
@@ -586,6 +606,22 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
onRenderingInitializationFinished();
|
||||
}
|
||||
|
||||
private void onSettingsResult(ActivityResult activityResult)
|
||||
{
|
||||
if (activityResult.getResultCode() == Activity.RESULT_OK)
|
||||
{
|
||||
Intent data = activityResult.getData();
|
||||
if (data != null && data.hasExtra(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON))
|
||||
{
|
||||
MapButtonsController mMapButtonsController = (MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons);
|
||||
if (mMapButtonsController != null)
|
||||
{
|
||||
mMapButtonsController.reloadUniversalButton(buttonsHolder.getActiveButton());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshLightStatusBar()
|
||||
{
|
||||
UiUtils.setLightStatusBar(this, !(
|
||||
@@ -781,16 +817,121 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
private void initNavigationButtons()
|
||||
{
|
||||
prepareNavigationButtons();
|
||||
initNavigationButtons(mMapButtonsViewModel.getLayoutMode().getValue());
|
||||
}
|
||||
|
||||
private void prepareNavigationButtons()
|
||||
{
|
||||
buttonsHolder = UniversalButtonsHolder.getInstance(this);
|
||||
buttonsHolder.registerDefaultUniversalButtons(this);
|
||||
buttonsHolder.registerButton(new UniversalButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_ADD_PLACE_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.placepage_add_place_button);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_plus);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton universalButtonView)
|
||||
{
|
||||
onAddPlace();
|
||||
}
|
||||
});
|
||||
buttonsHolder.registerButton(new UniversalButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_SETTINGS_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_settings);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton universalButtonView)
|
||||
{
|
||||
onOpenSettings();
|
||||
}
|
||||
});
|
||||
|
||||
buttonsHolder.registerButton(new UniversalToggleButton()
|
||||
{
|
||||
private boolean isRecording = TrackRecorder.nativeIsTrackRecordingEnabled();
|
||||
|
||||
@Override
|
||||
public void setChecked(boolean checked)
|
||||
{
|
||||
isRecording = checked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_RECORD_TRACK_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return getString(R.string.start_track_recording);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_track_recording_off);
|
||||
|
||||
int color = isRecording
|
||||
? Color.parseColor("#0057ff")
|
||||
: ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint);
|
||||
|
||||
ColorStateList colorStateList = ColorStateList.valueOf(color);
|
||||
imageView.setImageTintList(colorStateList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton universalButtonView)
|
||||
{
|
||||
onTrackRecordingOptionSelected();
|
||||
drawIcon(universalButtonView);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initNavigationButtons(MapButtonsController.LayoutMode layoutMode)
|
||||
{
|
||||
// Recreate the navigation buttons with the correct layout when it changes
|
||||
if (mPreviousMapLayoutMode != layoutMode)
|
||||
{
|
||||
MapButtonsController mapButtonsController = new MapButtonsController();
|
||||
mapButtonsController.setUniversalButton(buttonsHolder.getActiveButton());
|
||||
|
||||
FragmentTransaction transaction = getSupportFragmentManager()
|
||||
.beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
|
||||
.beginTransaction().replace(R.id.map_buttons, mapButtonsController);
|
||||
transaction.commit();
|
||||
mPreviousMapLayoutMode = layoutMode;
|
||||
}
|
||||
@@ -2287,7 +2428,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
public void onAddPlaceOptionSelected()
|
||||
{
|
||||
closeFloatingPanels();
|
||||
showPositionChooserForEditor(false, false);
|
||||
onAddPlace();
|
||||
}
|
||||
|
||||
public void onDownloadMapsOptionSelected()
|
||||
@@ -2304,9 +2445,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
|
||||
|
||||
public void onSettingsOptionSelected()
|
||||
{
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
closeFloatingPanels();
|
||||
startActivity(intent);
|
||||
onOpenSettings();
|
||||
}
|
||||
|
||||
private void onOpenSettings()
|
||||
{
|
||||
Intent intent = new Intent(this, SettingsActivity.class);
|
||||
mSettingsLauncher.launch(intent);
|
||||
}
|
||||
|
||||
private boolean startTrackRecording()
|
||||
|
||||
@@ -3,6 +3,7 @@ package app.organicmaps.maplayer;
|
||||
import android.animation.ArgbEvaluator;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
@@ -21,6 +22,7 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.Observer;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.MwmActivity;
|
||||
import app.organicmaps.R;
|
||||
@@ -31,11 +33,15 @@ import app.organicmaps.maplayer.isolines.IsolinesManager;
|
||||
import app.organicmaps.maplayer.subway.SubwayManager;
|
||||
import app.organicmaps.maplayer.traffic.TrafficManager;
|
||||
import app.organicmaps.routing.RoutingController;
|
||||
import app.organicmaps.universalbuttons.UniversalButton;
|
||||
import app.organicmaps.universalbuttons.UniversalToggleButton;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.ThemeUtils;
|
||||
import app.organicmaps.util.UiUtils;
|
||||
import app.organicmaps.util.WindowInsetUtils;
|
||||
import app.organicmaps.widget.menu.MyPositionButton;
|
||||
import app.organicmaps.widget.placepage.PlacePageViewModel;
|
||||
|
||||
import com.google.android.material.badge.BadgeDrawable;
|
||||
import com.google.android.material.badge.BadgeUtils;
|
||||
import com.google.android.material.badge.ExperimentalBadgeUtils;
|
||||
@@ -75,9 +81,12 @@ public class MapButtonsController extends Fragment
|
||||
private final Observer<Boolean> mTrackRecorderObserver = (enable) -> {
|
||||
updateMenuBadge(enable);
|
||||
showButton(enable, MapButtons.trackRecordingStatus);
|
||||
updateUniversalButtonState(enable);
|
||||
};
|
||||
private final Observer<Integer> mTopButtonMarginObserver = this::updateTopButtonsMargin;
|
||||
|
||||
private UniversalButton mUniversalButton;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
|
||||
@@ -98,27 +107,15 @@ public class MapButtonsController extends Fragment
|
||||
mInnerRightButtonsFrame = mFrame.findViewById(R.id.map_buttons_inner_right);
|
||||
mBottomButtonsFrame = mFrame.findViewById(R.id.map_buttons_bottom);
|
||||
|
||||
final FloatingActionButton helpButton = mFrame.findViewById(R.id.help_button);
|
||||
if (helpButton != null)
|
||||
{
|
||||
if (Config.isNY() && !TextUtils.isEmpty(Config.getDonateUrl(requireContext())))
|
||||
helpButton.setImageResource(R.drawable.ic_christmas_tree);
|
||||
// else
|
||||
// {
|
||||
// helpButton.setImageResource(R.drawable.ic_launcher);
|
||||
// }
|
||||
// // Keep this button colorful in normal theme.
|
||||
// if (!ThemeUtils.isNightTheme(requireContext()))
|
||||
// helpButton.getDrawable().setTintList(null);
|
||||
}
|
||||
mButtonsMap = new HashMap<>();
|
||||
|
||||
initBottomButtons();
|
||||
|
||||
final View zoomFrame = mFrame.findViewById(R.id.zoom_buttons_container);
|
||||
mFrame.findViewById(R.id.nav_zoom_in)
|
||||
.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomIn));
|
||||
mFrame.findViewById(R.id.nav_zoom_out)
|
||||
.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.zoomOut));
|
||||
final View bookmarksButton = mFrame.findViewById(R.id.btn_bookmarks);
|
||||
bookmarksButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.bookmarks));
|
||||
final View myPosition = mFrame.findViewById(R.id.my_position);
|
||||
mNavMyPosition = new MyPositionButton(myPosition, (v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.myPosition));
|
||||
|
||||
@@ -133,12 +130,55 @@ public class MapButtonsController extends Fragment
|
||||
mTrackRecordingStatusButton = mFrame.findViewById(R.id.track_recording_status);
|
||||
if (mTrackRecordingStatusButton != null)
|
||||
mTrackRecordingStatusButton.setOnClickListener(view -> mMapButtonClickListener.onMapButtonClick(MapButtons.trackRecordingStatus));
|
||||
final View menuButton = mFrame.findViewById(R.id.menu_button);
|
||||
|
||||
mSearchWheel = new SearchWheel(mFrame,
|
||||
(v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.search),
|
||||
(v) -> mMapButtonClickListener.onSearchCanceled(),
|
||||
mMapButtonsViewModel);
|
||||
|
||||
// Used to get the maximum height the buttons will evolve in
|
||||
mFrame.addOnLayoutChangeListener(new MapButtonsController.ContentViewLayoutChangeListener(mFrame));
|
||||
|
||||
mButtonsMap.put(MapButtons.zoom, zoomFrame);
|
||||
mButtonsMap.put(MapButtons.myPosition, myPosition);
|
||||
|
||||
if (mToggleMapLayerButton != null)
|
||||
mButtonsMap.put(MapButtons.toggleMapLayer, mToggleMapLayerButton);
|
||||
if (mTrackRecordingStatusButton != null)
|
||||
mButtonsMap.put(MapButtons.trackRecordingStatus, mTrackRecordingStatusButton);
|
||||
showButton(false, MapButtons.trackRecordingStatus);
|
||||
return mFrame;
|
||||
}
|
||||
|
||||
private void initBottomButtons()
|
||||
{
|
||||
// universal button
|
||||
applyUniversalButton();
|
||||
|
||||
// bookmarks button
|
||||
View bookmarksButton = mFrame.findViewById(R.id.btn_bookmarks);
|
||||
if (bookmarksButton != null)
|
||||
{
|
||||
bookmarksButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.bookmarks));
|
||||
mButtonsMap.put(MapButtons.bookmarks, bookmarksButton);
|
||||
}
|
||||
|
||||
// search button
|
||||
View searchButton = mFrame.findViewById(R.id.btn_search);
|
||||
if (searchButton != null)
|
||||
{
|
||||
searchButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.bookmarks));
|
||||
mButtonsMap.put(MapButtons.search, searchButton);
|
||||
}
|
||||
|
||||
// menu button
|
||||
View menuButton = mFrame.findViewById(R.id.menu_button);
|
||||
if (menuButton != null)
|
||||
{
|
||||
menuButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.menu));
|
||||
// This hack is needed to show the badge on the initial startup. For some reason, updateMenuBadge does not work from onResume() there.
|
||||
menuButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
menuButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
|
||||
{
|
||||
@Override
|
||||
public void onGlobalLayout()
|
||||
{
|
||||
@@ -146,35 +186,49 @@ public class MapButtonsController extends Fragment
|
||||
menuButton.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (helpButton != null)
|
||||
helpButton.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
|
||||
|
||||
mSearchWheel = new SearchWheel(mFrame,
|
||||
(v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.search),
|
||||
(v) -> mMapButtonClickListener.onSearchCanceled(),
|
||||
mMapButtonsViewModel);
|
||||
final View searchButton = mFrame.findViewById(R.id.btn_search);
|
||||
|
||||
// Used to get the maximum height the buttons will evolve in
|
||||
mFrame.addOnLayoutChangeListener(new MapButtonsController.ContentViewLayoutChangeListener(mFrame));
|
||||
|
||||
mButtonsMap = new HashMap<>();
|
||||
mButtonsMap.put(MapButtons.zoom, zoomFrame);
|
||||
mButtonsMap.put(MapButtons.myPosition, myPosition);
|
||||
mButtonsMap.put(MapButtons.bookmarks, bookmarksButton);
|
||||
mButtonsMap.put(MapButtons.search, searchButton);
|
||||
|
||||
if (mToggleMapLayerButton != null)
|
||||
mButtonsMap.put(MapButtons.toggleMapLayer, mToggleMapLayerButton);
|
||||
if (menuButton != null)
|
||||
mButtonsMap.put(MapButtons.menu, menuButton);
|
||||
if (helpButton != null)
|
||||
mButtonsMap.put(MapButtons.help, helpButton);
|
||||
if (mTrackRecordingStatusButton != null)
|
||||
mButtonsMap.put(MapButtons.trackRecordingStatus, mTrackRecordingStatusButton);
|
||||
showButton(false, MapButtons.trackRecordingStatus);
|
||||
return mFrame;
|
||||
}
|
||||
}
|
||||
|
||||
private void applyUniversalButton()
|
||||
{
|
||||
FloatingActionButton universalButtonView = mFrame.findViewById(R.id.universal_button);
|
||||
if (universalButtonView != null && mUniversalButton != null)
|
||||
{
|
||||
UiUtils.show(universalButtonView);
|
||||
|
||||
Context context = getContext();
|
||||
if (context == null)
|
||||
return;
|
||||
|
||||
universalButtonView.setImageTintList(ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.iconTint)));
|
||||
|
||||
// Christmas tree with help button
|
||||
if (Config.isNY() &&
|
||||
mUniversalButton.getCode().equals("help") &&
|
||||
!TextUtils.isEmpty(Config.getDonateUrl(requireContext()))
|
||||
)
|
||||
{
|
||||
universalButtonView.setImageResource(R.drawable.ic_christmas_tree);
|
||||
universalButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help));
|
||||
}
|
||||
else
|
||||
{
|
||||
mUniversalButton.drawIcon(universalButtonView);
|
||||
universalButtonView.setOnClickListener((v) -> mUniversalButton.onClick(universalButtonView));
|
||||
}
|
||||
// else
|
||||
// {
|
||||
// helpButton.setImageResource(R.drawable.ic_launcher);
|
||||
// }
|
||||
// // Keep this button colorful in normal theme.
|
||||
// if (!ThemeUtils.isNightTheme(requireContext()))
|
||||
// helpButton.getDrawable().setTintList(null);
|
||||
}
|
||||
else if (universalButtonView != null)
|
||||
{
|
||||
UiUtils.hide(universalButtonView);
|
||||
}
|
||||
}
|
||||
|
||||
public void showButton(boolean show, MapButtonsController.MapButtons button)
|
||||
@@ -251,7 +305,7 @@ public class MapButtonsController extends Fragment
|
||||
final UpdateInfo info = MapManager.nativeGetUpdateInfo(null);
|
||||
final int count = (info == null ? 0 : info.filesCount);
|
||||
final int verticalOffset = dpToPx(8, context) + dpToPx(Integer.toString(0)
|
||||
.length() * 5, context);
|
||||
.length() * 5, context);
|
||||
|
||||
if (count == 0)
|
||||
{
|
||||
@@ -450,6 +504,27 @@ public class MapButtonsController extends Fragment
|
||||
mSearchWheel.reset();
|
||||
}
|
||||
|
||||
public void setUniversalButton(UniversalButton universalButton)
|
||||
{
|
||||
this.mUniversalButton = universalButton;
|
||||
}
|
||||
|
||||
public void reloadUniversalButton(UniversalButton universalButton)
|
||||
{
|
||||
setUniversalButton(universalButton);
|
||||
applyUniversalButton();
|
||||
}
|
||||
|
||||
private void updateUniversalButtonState(boolean isEnabled)
|
||||
{
|
||||
if (mUniversalButton instanceof UniversalToggleButton)
|
||||
{
|
||||
((UniversalToggleButton) mUniversalButton).setChecked(isEnabled);
|
||||
|
||||
reloadUniversalButton(mUniversalButton);
|
||||
}
|
||||
}
|
||||
|
||||
public enum LayoutMode
|
||||
{
|
||||
regular,
|
||||
|
||||
@@ -25,6 +25,8 @@ import app.organicmaps.help.HelpActivity;
|
||||
import app.organicmaps.location.LocationHelper;
|
||||
import app.organicmaps.location.LocationProviderFactory;
|
||||
import app.organicmaps.sdk.routing.RoutingOptions;
|
||||
import app.organicmaps.universalbuttons.UniversalButton;
|
||||
import app.organicmaps.universalbuttons.UniversalButtonsHolder;
|
||||
import app.organicmaps.util.Config;
|
||||
import app.organicmaps.util.NetworkPolicy;
|
||||
import app.organicmaps.util.PowerManagment;
|
||||
@@ -35,6 +37,9 @@ import app.organicmaps.util.log.LogsManager;
|
||||
import app.organicmaps.sdk.search.SearchRecents;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements LanguagesFragment.Listener
|
||||
@@ -68,6 +73,59 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La
|
||||
initSearchPrivacyPrefsCallbacks();
|
||||
initScreenSleepEnabledPrefsCallbacks();
|
||||
initShowOnLockScreenPrefsCallbacks();
|
||||
initUniversalButtonPrefs();
|
||||
}
|
||||
|
||||
private void initUniversalButtonPrefs()
|
||||
{
|
||||
final ListPreference pref = getPreference(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON);
|
||||
UniversalButtonsHolder holder = UniversalButtonsHolder.getInstance(requireContext());
|
||||
|
||||
UniversalButton currentButton = holder.getActiveButton();
|
||||
Collection<UniversalButton> buttons = holder.getAllButtons();
|
||||
|
||||
List<String> entryList = new ArrayList<>(buttons.size() + 1);
|
||||
List<String> valueList = new ArrayList<>(buttons.size() + 1);
|
||||
|
||||
String notDisplayId = "not_display";
|
||||
|
||||
entryList.add(requireContext().getString(R.string.pref_universal_button_not_display));
|
||||
valueList.add(notDisplayId);
|
||||
|
||||
for (UniversalButton button : buttons)
|
||||
{
|
||||
entryList.add(button.getPrefsName());
|
||||
valueList.add(button.getCode());
|
||||
}
|
||||
|
||||
pref.setEntries(entryList.toArray(new CharSequence[0]));
|
||||
pref.setEntryValues(valueList.toArray(new CharSequence[0]));
|
||||
|
||||
if (currentButton != null)
|
||||
{
|
||||
pref.setSummary(currentButton.getPrefsName());
|
||||
pref.setValue(currentButton.getCode());
|
||||
}
|
||||
else
|
||||
{
|
||||
pref.setSummary(R.string.pref_universal_button_not_display);
|
||||
pref.setValue(notDisplayId);
|
||||
}
|
||||
|
||||
pref.setOnPreferenceChangeListener((preference, newValue) -> {
|
||||
int index = pref.findIndexOfValue(newValue.toString());
|
||||
if (index >= 0)
|
||||
{
|
||||
pref.setSummary(pref.getEntries()[index]);
|
||||
}
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(UniversalButtonsHolder.KEY_PREF_UNIVERSAL_BUTTON, newValue.toString());
|
||||
|
||||
requireActivity().setResult(-1, intent);
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
private void updateVoiceInstructionsPrefsSummary()
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package app.organicmaps.universalbuttons;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
public interface UniversalButton
|
||||
{
|
||||
String getCode();
|
||||
|
||||
String getPrefsName();
|
||||
|
||||
void drawIcon(FloatingActionButton imageView);
|
||||
|
||||
void onClick(FloatingActionButton universalButtonView);
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
package app.organicmaps.universalbuttons;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import app.organicmaps.MwmApplication;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.help.HelpActivity;
|
||||
|
||||
public class UniversalButtonsHolder
|
||||
{
|
||||
private static volatile UniversalButtonsHolder instance;
|
||||
|
||||
public static final String KEY_PREF_UNIVERSAL_BUTTON = "universal_button";
|
||||
private static final String BUTTON_HELP_CODE = "help";
|
||||
public static final String BUTTON_SETTINGS_CODE = "settings";
|
||||
public static final String BUTTON_ADD_PLACE_CODE = "add-place";
|
||||
public static final String BUTTON_RECORD_TRACK_CODE = "record-track";
|
||||
private static final String DEFAULT_BUTTON_CODE = BUTTON_HELP_CODE;
|
||||
|
||||
private final Context context;
|
||||
private final SharedPreferences prefs;
|
||||
private final Map<String, UniversalButton> availableButtons = new HashMap<>();
|
||||
|
||||
private UniversalButtonsHolder(Context context)
|
||||
{
|
||||
this.context = context;
|
||||
this.prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
}
|
||||
|
||||
public void registerButton(UniversalButton button)
|
||||
{
|
||||
availableButtons.put(button.getCode(), button);
|
||||
}
|
||||
|
||||
public void registerDefaultUniversalButtons(Context context)
|
||||
{
|
||||
registerButton(new UniversalButton()
|
||||
{
|
||||
@Override
|
||||
public String getCode()
|
||||
{
|
||||
return BUTTON_HELP_CODE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrefsName()
|
||||
{
|
||||
return context.getString(R.string.help);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(FloatingActionButton imageView)
|
||||
{
|
||||
imageView.setImageResource(R.drawable.ic_question_mark);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(FloatingActionButton universalButtonView)
|
||||
{
|
||||
Intent intent = new Intent(context, HelpActivity.class);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public UniversalButton getActiveButton()
|
||||
{
|
||||
String activeButtonCode = prefs.getString(KEY_PREF_UNIVERSAL_BUTTON, DEFAULT_BUTTON_CODE);
|
||||
if (!TextUtils.isEmpty(activeButtonCode))
|
||||
return availableButtons.get(activeButtonCode);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public Collection<UniversalButton> getAllButtons()
|
||||
{
|
||||
return availableButtons.values();
|
||||
}
|
||||
|
||||
public static UniversalButtonsHolder getInstance(Context context)
|
||||
{
|
||||
UniversalButtonsHolder localInstance = instance;
|
||||
if (localInstance == null)
|
||||
{
|
||||
synchronized (UniversalButtonsHolder.class)
|
||||
{
|
||||
localInstance = instance;
|
||||
if (localInstance == null)
|
||||
{
|
||||
instance = localInstance = new UniversalButtonsHolder(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
return localInstance;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package app.organicmaps.universalbuttons;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
public interface UniversalToggleButton extends UniversalButton
|
||||
{
|
||||
void setChecked(boolean checked);
|
||||
}
|
||||
@@ -9,29 +9,37 @@
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false">
|
||||
<include
|
||||
android:id="@+id/universal_button"
|
||||
layout="@layout/map_buttons_help"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_half_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/btn_search"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
<include
|
||||
android:id="@+id/btn_search"
|
||||
layout="@layout/map_buttons_search_square"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_base_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/btn_bookmarks"
|
||||
app:layout_constraintStart_toEndOf="@+id/help_button" />
|
||||
app:layout_goneMarginStart="@dimen/margin_half_plus"
|
||||
app:layout_constraintStart_toEndOf="@+id/universal_button" />
|
||||
<include
|
||||
android:id="@+id/btn_bookmarks"
|
||||
layout="@layout/map_buttons_bookmarks_square"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_base_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/menu_button"
|
||||
app:layout_constraintStart_toEndOf="@+id/btn_search" />
|
||||
<include
|
||||
android:id="@+id/menu_button"
|
||||
layout="@layout/map_buttons_menu"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_base_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintStart_toEndOf="@+id/btn_bookmarks" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -7,38 +7,51 @@
|
||||
android:layout_height="wrap_content">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
style="@style/MwmWidget.MapButton.Bottom"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false">
|
||||
<include
|
||||
android:id="@+id/universal_button"
|
||||
layout="@layout/map_buttons_help"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/margin_half"
|
||||
android:layout_marginHorizontal="@dimen/margin_half_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/btn_search"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
<include
|
||||
android:id="@+id/btn_search"
|
||||
layout="@layout/map_buttons_search_square"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_half_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/btn_bookmarks"
|
||||
app:layout_constraintStart_toEndOf="@+id/help_button" />
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/universal_button" />
|
||||
<include
|
||||
android:id="@+id/btn_bookmarks"
|
||||
layout="@layout/map_buttons_bookmarks_square"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_half_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/menu_button"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/btn_search" />
|
||||
<include
|
||||
android:id="@+id/menu_button"
|
||||
layout="@layout/map_buttons_menu"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="@dimen/margin_half"
|
||||
android:layout_marginHorizontal="@dimen/margin_half_plus"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toEndOf="@+id/btn_bookmarks" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</RelativeLayout>
|
||||
@@ -5,5 +5,6 @@
|
||||
android:id="@+id/help_button"
|
||||
style="@style/MwmWidget.MapButton.Square"
|
||||
android:contentDescription="@string/help"
|
||||
android:tint="@null"
|
||||
app:shapeAppearanceOverlay="@style/MwmWidget.MapButton.Square"
|
||||
app:srcCompat="@drawable/ic_question_mark" />
|
||||
@@ -930,4 +930,6 @@
|
||||
<!-- preference string for using auto theme only in navigation mode -->
|
||||
<string name="nav_auto">Auto in navigation</string>
|
||||
<string name="codeberg">Codeberg</string>
|
||||
<string name="pref_universal_button">Universal button setup</string>
|
||||
<string name="pref_universal_button_not_display">Do not display</string>
|
||||
</resources>
|
||||
|
||||
@@ -106,6 +106,12 @@
|
||||
app:singleLineTitle="false"
|
||||
android:persistent="false"
|
||||
android:order="18"/>
|
||||
<ListPreference
|
||||
android:key="universal_button"
|
||||
android:title="@string/pref_universal_button"
|
||||
app:singleLineTitle="false"
|
||||
android:persistent="true"
|
||||
android:order="20"/>
|
||||
</androidx.preference.PreferenceCategory>
|
||||
|
||||
<androidx.preference.PreferenceCategory
|
||||
|
||||
Reference in New Issue
Block a user