diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index 5eb04ad4c..f36a5686f 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -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; @@ -35,6 +36,7 @@ import androidx.annotation.StyleRes; import androidx.annotation.UiThread; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; @@ -99,6 +101,9 @@ import app.organicmaps.settings.DrivingOptionsActivity; import app.organicmaps.settings.RoadType; import app.organicmaps.settings.SettingsActivity; import app.organicmaps.settings.UnitLocale; +import app.organicmaps.leftbutton.LeftButton; +import app.organicmaps.leftbutton.LeftButtonsHolder; +import app.organicmaps.leftbutton.LeftToggleButton; import app.organicmaps.util.Config; import app.organicmaps.util.LocationUtils; import app.organicmaps.util.PowerManagment; @@ -116,6 +121,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 +133,10 @@ 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.leftbutton.LeftButtonsHolder.BUTTON_ADD_PLACE_CODE; +import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE; +import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_RECORD_TRACK_CODE; +import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_SETTINGS_CODE; import static app.organicmaps.util.PowerManagment.POWER_MANAGEMENT_TAG; public class MwmActivity extends BaseMwmFragmentActivity @@ -200,6 +210,8 @@ public class MwmActivity extends BaseMwmFragmentActivity private int mNavBarHeight; + private LeftButtonsHolder buttonsHolder; + private PlacePageViewModel mPlacePageViewModel; private MapButtonsViewModel mMapButtonsViewModel; private MapButtonsController.LayoutMode mPreviousMapLayoutMode; @@ -232,6 +244,8 @@ public class MwmActivity extends BaseMwmFragmentActivity @NonNull private ActivityResultLauncher mPowerSaveSettings; @NonNull + private ActivityResultLauncher mSettingsLauncher; + @NonNull private boolean mPowerSaveDisclaimerShown = false; @SuppressWarnings("NotNullFieldNotInitialized") @@ -415,6 +429,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 +574,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 +608,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(MwmActivity.this.getString(R.string.pref_left_button))) + { + MapButtonsController mMapButtonsController = (MapButtonsController) getSupportFragmentManager().findFragmentById(R.id.map_buttons); + if (mMapButtonsController != null) + { + mMapButtonsController.reloadLeftButton(buttonsHolder.getActiveButton()); + } + } + } + } + private void refreshLightStatusBar() { UiUtils.setLightStatusBar(this, !( @@ -781,16 +819,147 @@ public class MwmActivity extends BaseMwmFragmentActivity private void initNavigationButtons() { + prepareNavigationButtons(); initNavigationButtons(mMapButtonsViewModel.getLayoutMode().getValue()); } + private void prepareNavigationButtons() + { + buttonsHolder = LeftButtonsHolder.getInstance(this); + buttonsHolder.registerButton(new LeftButton() + { + @Override + public String getCode() + { + return BUTTON_HELP_CODE; + } + + @Override + public String getPrefsName() + { + return getString(R.string.help); + } + + @Override + public void drawIcon(FloatingActionButton imageView) + { + imageView.setImageResource(R.drawable.ic_question_mark); + } + + @Override + public void onClick(FloatingActionButton left) + { + Intent intent = new Intent(MwmActivity.this, HelpActivity.class); + MwmActivity.this.startActivity(intent); + } + }); + buttonsHolder.registerButton(new LeftButton() + { + @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 left) + { + onAddPlace(); + } + }); + buttonsHolder.registerButton(new LeftButton() + { + @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 left) + { + onOpenSettings(); + } + }); + + buttonsHolder.registerButton(new LeftToggleButton() + { + 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 + ? ContextCompat.getColor(MwmActivity.this, R.color.active_track_recording) + : ThemeUtils.getColor(MwmActivity.this, R.attr.iconTint); + + ColorStateList colorStateList = ColorStateList.valueOf(color); + imageView.setImageTintList(colorStateList); + } + + @Override + public void onClick(FloatingActionButton left) + { + onTrackRecordingOptionSelected(); + drawIcon(left); + } + }); + } + 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.setLeftButton(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 +2456,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onAddPlaceOptionSelected() { closeFloatingPanels(); - showPositionChooserForEditor(false, false); + onAddPlace(); } public void onDownloadMapsOptionSelected() @@ -2304,9 +2473,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() diff --git a/android/app/src/main/java/app/organicmaps/leftbutton/LeftButton.java b/android/app/src/main/java/app/organicmaps/leftbutton/LeftButton.java new file mode 100644 index 000000000..2c64c61f3 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/leftbutton/LeftButton.java @@ -0,0 +1,14 @@ +package app.organicmaps.leftbutton; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +public interface LeftButton +{ + String getCode(); + + String getPrefsName(); + + default void drawIcon(FloatingActionButton imageView) {} + + default void onClick(FloatingActionButton leftButtonView) {} +} diff --git a/android/app/src/main/java/app/organicmaps/leftbutton/LeftButtonsHolder.java b/android/app/src/main/java/app/organicmaps/leftbutton/LeftButtonsHolder.java new file mode 100644 index 000000000..95029c4e1 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/leftbutton/LeftButtonsHolder.java @@ -0,0 +1,96 @@ +package app.organicmaps.leftbutton; + +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; + +import androidx.annotation.Nullable; +import androidx.preference.PreferenceManager; + +import app.organicmaps.R; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class LeftButtonsHolder +{ + private static volatile LeftButtonsHolder instance; + + public static final String DISABLE_BUTTON_CODE = "disable"; + public 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 String leftButtonPreferenceKey; + + private final SharedPreferences prefs; + private final Map availableButtons = new LinkedHashMap<>(); + + private LeftButtonsHolder(Context context) + { + this.prefs = PreferenceManager.getDefaultSharedPreferences(context); + this.leftButtonPreferenceKey = context.getString(R.string.pref_left_button); + initDisableButton(context); + } + + public void registerButton(LeftButton button) + { + availableButtons.put(button.getCode(), button); + } + + @Nullable + public LeftButton getActiveButton() + { + String activeButtonCode = prefs.getString(leftButtonPreferenceKey, DEFAULT_BUTTON_CODE); + if (!TextUtils.isEmpty(activeButtonCode)) + return availableButtons.get(activeButtonCode); + else + return null; + } + + public Collection getAllButtons() + { + return availableButtons.values(); + } + + public static LeftButtonsHolder getInstance(Context context) + { + LeftButtonsHolder localInstance = instance; + if (localInstance == null) + { + synchronized (LeftButtonsHolder.class) + { + localInstance = instance; + if (localInstance == null) + { + instance = localInstance = new LeftButtonsHolder(context); + } + } + } + return localInstance; + } + + private void initDisableButton(Context context) + { + availableButtons.put(DISABLE_BUTTON_CODE, new LeftButton() + { + @Override + public String getCode() + { + return DISABLE_BUTTON_CODE; + } + + @Override + public String getPrefsName() + { + return context.getString(R.string.pref_left_button_disable); + } + } + ); + } +} + diff --git a/android/app/src/main/java/app/organicmaps/leftbutton/LeftToggleButton.java b/android/app/src/main/java/app/organicmaps/leftbutton/LeftToggleButton.java new file mode 100644 index 000000000..897fa9043 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/leftbutton/LeftToggleButton.java @@ -0,0 +1,6 @@ +package app.organicmaps.leftbutton; + +public interface LeftToggleButton extends LeftButton +{ + void setChecked(boolean checked); +} diff --git a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java index 03127fc80..31e4018c4 100644 --- a/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java +++ b/android/app/src/main/java/app/organicmaps/maplayer/MapButtonsController.java @@ -1,8 +1,12 @@ package app.organicmaps.maplayer; +import static app.organicmaps.leftbutton.LeftButtonsHolder.BUTTON_HELP_CODE; +import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE; + 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 +25,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 +36,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.leftbutton.LeftButton; +import app.organicmaps.leftbutton.LeftToggleButton; 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 +84,12 @@ public class MapButtonsController extends Fragment private final Observer mTrackRecorderObserver = (enable) -> { updateMenuBadge(enable); showButton(enable, MapButtons.trackRecordingStatus); + updateLeftButtonToggleState(enable); }; private final Observer mTopButtonMarginObserver = this::updateTopButtonsMargin; + private LeftButton mLeftButton; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) @@ -98,27 +110,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 +133,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 + applyLeftButton(); + + // 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 +189,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 applyLeftButton() + { + FloatingActionButton leftButtonView = mFrame.findViewById(R.id.left_button); + if (leftButtonView != null && mLeftButton != null && !mLeftButton.getCode().equals(DISABLE_BUTTON_CODE)) + { + UiUtils.show(leftButtonView); + + Context context = getContext(); + if (context == null) + return; + + leftButtonView.setImageTintList(ColorStateList.valueOf(ThemeUtils.getColor(context, R.attr.iconTint))); + + // Christmas tree with help button + if (Config.isNY() && + mLeftButton.getCode().equals(BUTTON_HELP_CODE) && + !TextUtils.isEmpty(Config.getDonateUrl(requireContext())) + ) + { + leftButtonView.setImageResource(R.drawable.ic_christmas_tree); + leftButtonView.setOnClickListener((v) -> mMapButtonClickListener.onMapButtonClick(MapButtons.help)); + } + else + { + mLeftButton.drawIcon(leftButtonView); + leftButtonView.setOnClickListener((v) -> mLeftButton.onClick(leftButtonView)); + } + // else + // { + // helpButton.setImageResource(R.drawable.ic_launcher); + // } + // // Keep this button colorful in normal theme. + // if (!ThemeUtils.isNightTheme(requireContext())) + // helpButton.getDrawable().setTintList(null); + } + else if (leftButtonView != null) + { + UiUtils.hide(leftButtonView); + } } public void showButton(boolean show, MapButtonsController.MapButtons button) @@ -251,7 +308,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 +507,27 @@ public class MapButtonsController extends Fragment mSearchWheel.reset(); } + public void setLeftButton(LeftButton leftButton) + { + this.mLeftButton = leftButton; + } + + public void reloadLeftButton(LeftButton leftButton) + { + setLeftButton(leftButton); + applyLeftButton(); + } + + private void updateLeftButtonToggleState(boolean isEnabled) + { + if (mLeftButton instanceof LeftToggleButton) + { + ((LeftToggleButton) mLeftButton).setChecked(isEnabled); + + reloadLeftButton(mLeftButton); + } + } + public enum LayoutMode { regular, diff --git a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java index f9694bbbe..9167a2e48 100644 --- a/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java +++ b/android/app/src/main/java/app/organicmaps/settings/SettingsPrefsFragment.java @@ -1,5 +1,7 @@ package app.organicmaps.settings; +import static app.organicmaps.leftbutton.LeftButtonsHolder.DISABLE_BUTTON_CODE; + import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; @@ -25,6 +27,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.leftbutton.LeftButton; +import app.organicmaps.leftbutton.LeftButtonsHolder; import app.organicmaps.util.Config; import app.organicmaps.util.NetworkPolicy; import app.organicmaps.util.PowerManagment; @@ -35,6 +39,11 @@ 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.Collections; +import java.util.Comparator; +import java.util.List; import java.util.Locale; public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements LanguagesFragment.Listener @@ -68,6 +77,55 @@ public class SettingsPrefsFragment extends BaseXmlSettingsFragment implements La initSearchPrivacyPrefsCallbacks(); initScreenSleepEnabledPrefsCallbacks(); initShowOnLockScreenPrefsCallbacks(); + initLeftButtonPrefs(); + } + + private void initLeftButtonPrefs() + { + final String leftButtonPreferenceKey = getString(R.string.pref_left_button); + final ListPreference pref = getPreference(leftButtonPreferenceKey); + LeftButtonsHolder holder = LeftButtonsHolder.getInstance(requireContext()); + + LeftButton currentButton = holder.getActiveButton(); + Collection buttons = holder.getAllButtons(); + + List entryList = new ArrayList<>(buttons.size()); + List valueList = new ArrayList<>(buttons.size()); + + for (LeftButton 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_left_button_disable); + pref.setValue(DISABLE_BUTTON_CODE); + } + + pref.setOnPreferenceChangeListener((preference, newValue) -> { + int index = pref.findIndexOfValue(newValue.toString()); + if (index >= 0) + { + pref.setSummary(pref.getEntries()[index]); + } + + Intent intent = new Intent(); + intent.putExtra(leftButtonPreferenceKey, newValue.toString()); + + requireActivity().setResult(-1, intent); + + return true; + }); } private void updateVoiceInstructionsPrefsSummary() diff --git a/android/app/src/main/res/drawable/ic_track_recording_on.xml b/android/app/src/main/res/drawable/ic_track_recording_on.xml index e10041999..536bf11c5 100644 --- a/android/app/src/main/res/drawable/ic_track_recording_on.xml +++ b/android/app/src/main/res/drawable/ic_track_recording_on.xml @@ -6,7 +6,7 @@ android:viewportHeight="80"> - + \ No newline at end of file diff --git a/android/app/src/main/res/layout-land/map_buttons_bottom.xml b/android/app/src/main/res/layout-land/map_buttons_bottom.xml index 59762d69a..2aaba0ffb 100644 --- a/android/app/src/main/res/layout-land/map_buttons_bottom.xml +++ b/android/app/src/main/res/layout-land/map_buttons_bottom.xml @@ -9,29 +9,37 @@ android:clipChildren="false" android:clipToPadding="false"> + app:layout_goneMarginStart="@dimen/margin_half_plus" + app:layout_constraintStart_toEndOf="@+id/left_button" /> + app:layout_constraintStart_toEndOf="@+id/btn_bookmarks" /> \ No newline at end of file diff --git a/android/app/src/main/res/layout/map_buttons_bottom.xml b/android/app/src/main/res/layout/map_buttons_bottom.xml index 39420003b..8d9a79bed 100644 --- a/android/app/src/main/res/layout/map_buttons_bottom.xml +++ b/android/app/src/main/res/layout/map_buttons_bottom.xml @@ -7,38 +7,51 @@ android:layout_height="wrap_content"> + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toEndOf="@+id/left_button" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toEndOf="@+id/btn_bookmarks" /> \ No newline at end of file diff --git a/android/app/src/main/res/layout/map_buttons_help.xml b/android/app/src/main/res/layout/map_buttons_help.xml index 563961dd5..e9c135a55 100644 --- a/android/app/src/main/res/layout/map_buttons_help.xml +++ b/android/app/src/main/res/layout/map_buttons_help.xml @@ -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" /> \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index 7da5411df..f4847e566 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -138,6 +138,8 @@ #1E96F0 #4BB9E6 + #0057ff + #929292 #FFC22219 diff --git a/android/app/src/main/res/values/donottranslate.xml b/android/app/src/main/res/values/donottranslate.xml index e6fbd5468..1f5a97f5b 100644 --- a/android/app/src/main/res/values/donottranslate.xml +++ b/android/app/src/main/res/values/donottranslate.xml @@ -41,6 +41,7 @@ KeepScreenOn ShowOnLockScreen MapLanguage + LeftButton %1$s: %2$s %2$s :%1$s diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index fac3c28d8..05b87cf99 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -930,4 +930,6 @@ Auto in navigation Codeberg + Left button setup + Disable diff --git a/android/app/src/main/res/xml/prefs_main.xml b/android/app/src/main/res/xml/prefs_main.xml index 34d629a26..7e4bb9757 100644 --- a/android/app/src/main/res/xml/prefs_main.xml +++ b/android/app/src/main/res/xml/prefs_main.xml @@ -28,16 +28,22 @@ app:singleLineTitle="false" android:summary="@string/pref_zoom_summary" android:order="2"/> + + android:order="4"/> + android:order="5"/>