From cc49d4e536bc826ebe33dca3829dde4deec5b85e Mon Sep 17 00:00:00 2001 From: konggdev Date: Sun, 24 May 2026 01:17:20 +0200 Subject: [PATCH] Implement main screen dropdown menu --- .../strikemaps/app/AppController.java | 3 - .../konggdev/strikemaps/ui/UIComponent.java | 7 +- .../ui/factory/AlertDialogFactory.java | 7 ++ .../fragment/layout/FragmentLayoutSearch.java | 62 ++++++++++++++---- .../konggdev/strikemaps/ui/screen/Screen.java | 9 ++- .../main/res/drawable/ic_hamburger_menu.png | Bin 214 -> 177 bytes app/src/main/res/layout/fragment_search.xml | 8 +-- app/src/main/res/layout/fragment_settings.xml | 11 ---- app/src/main/res/layout/item_preview.xml | 1 + app/src/main/res/layout/menu_dropdown.xml | 52 +++++++++++++++ app/src/main/res/values-night/themes.xml | 3 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/themes.xml | 5 +- 13 files changed, 127 insertions(+), 42 deletions(-) create mode 100644 app/src/main/res/layout/menu_dropdown.xml diff --git a/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java b/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java index d061956..6febed0 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java +++ b/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java @@ -34,9 +34,6 @@ public class AppController { } public AppCompatActivity getActivity() { return appActivity; } public void init() { - if (getActivity().getSupportActionBar() != null) - getActivity().getSupportActionBar().hide(); - if(map == null) map = new MapComponent(this); if(ui == null) { ui = new UIComponent(this, map); diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java b/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java index ccaf9a0..95d0acc 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java @@ -3,6 +3,7 @@ package eu.konggdev.strikemaps.ui; import android.app.AlertDialog; import android.view.View; import androidx.annotation.NonNull; +import androidx.appcompat.widget.Toolbar; import eu.konggdev.strikemaps.Component; import eu.konggdev.strikemaps.R; import eu.konggdev.strikemaps.app.AppController; @@ -41,7 +42,8 @@ public class UIComponent implements Component { R.id.mainContentView, new MainContentRegion(map.toFragment(), R.id.mainContentView), R.id.bottomUi, new UIRegion(new FragmentLayoutControls(app, R.id.bottomUi), R.id.bottomUi), R.id.topUi, new UIRegion(new FragmentLayoutSearch(app, R.id.topUi), R.id.topUi) - ) //TODO: Probably stop referencing layout 3(!) times everytime + ), //TODO: Probably stop referencing layout 3(!) times everytime + null ), //Settings screen DefinedScreen.SETTINGS, new Screen( @@ -49,7 +51,8 @@ public class UIComponent implements Component { //Just the settings content fragment Map.of( R.id.mainContentView, new MainContentRegion(new FragmentLayoutContentSettings(), R.id.mainContentView) - ) + ), + new Toolbar(app.getActivity()) ) ); } diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/factory/AlertDialogFactory.java b/app/src/main/java/eu/konggdev/strikemaps/ui/factory/AlertDialogFactory.java index f0f0169..cf325e0 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/factory/AlertDialogFactory.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/factory/AlertDialogFactory.java @@ -38,4 +38,11 @@ public final class AlertDialogFactory { return dialog; } + + public static AlertDialog searchSettings(AppController app) { + return new AlertDialog.Builder(app.getActivity()) + .setTitle("Configure Search") + .setPositiveButton("OK", null) + .create(); + } } diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java index 4525e80..4b9225a 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java @@ -1,29 +1,24 @@ package eu.konggdev.strikemaps.ui.fragment.layout; -import android.Manifest; import android.app.AlertDialog; -import android.content.pm.PackageManager; import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; +import android.widget.PopupWindow; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; -import android.widget.TextView; -import android.widget.Toast; +import android.widget.PopupMenu; import eu.konggdev.strikemaps.R; import eu.konggdev.strikemaps.app.AppController; -import eu.konggdev.strikemaps.data.helper.UserPrefsHelper; -import eu.konggdev.strikemaps.map.overlay.implementation.LocationOverlay; -import eu.konggdev.strikemaps.ui.fragment.popup.FragmentMapChangePopup; +import eu.konggdev.strikemaps.ui.factory.AlertDialogFactory; import eu.konggdev.strikemaps.ui.screen.definition.DefinedScreen; public class FragmentLayoutSearch extends Fragment implements Layout { AppController app; - View rootView; - private final Integer region; public FragmentLayoutSearch(AppController app, Integer region) { @@ -45,7 +40,50 @@ public class FragmentLayoutSearch extends Fragment implements Layout { @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - //TODO: Make a floating menu instead of going right in settings - setupButton(view, R.id.hamburgerButton, click(() -> app.getUi().swapScreen(DefinedScreen.SETTINGS))); + + setupButton(view, R.id.hamburgerButton, click(() -> { + + View menuView = getLayoutInflater().inflate(R.layout.menu_dropdown, null); + + PopupWindow popupWindow = new PopupWindow( + menuView, + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + true + ); + + popupWindow.setOutsideTouchable(true); + popupWindow.setFocusable(true); + popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + setupButton(menuView, R.id.menuSearchSettings, click(() -> { + app.getUi().alert(AlertDialogFactory.searchSettings(app)); + })); + + setupButton(menuView, R.id.menuSettings, click(() -> { + popupWindow.dismiss(); + app.getUi().swapScreen(DefinedScreen.SETTINGS); + })); + + menuView.findViewById(R.id.menuSearchSettings).setOnClickListener(v -> popupWindow.dismiss()); + menuView.findViewById(R.id.menuAbout).setOnClickListener(v -> popupWindow.dismiss()); + + View anchor = view.findViewById(R.id.searchContainer); + + anchor.post(() -> { + + menuView.measure( + View.MeasureSpec.UNSPECIFIED, + View.MeasureSpec.UNSPECIFIED + ); + + int popupWidth = menuView.getMeasuredWidth(); + int containerWidth = anchor.getWidth(); + + int xOffset = containerWidth - popupWidth; + popupWindow.showAsDropDown(anchor, xOffset, 1); + }); + + })); } } diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/screen/Screen.java b/app/src/main/java/eu/konggdev/strikemaps/ui/screen/Screen.java index 5d58fce..3c6e37a 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/screen/Screen.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/screen/Screen.java @@ -2,25 +2,24 @@ package eu.konggdev.strikemaps.ui.screen; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import androidx.appcompat.widget.Toolbar; import java.util.Map; import eu.konggdev.strikemaps.app.AppController; import eu.konggdev.strikemaps.ui.fragment.ContainerFragment; import eu.konggdev.strikemaps.ui.fragment.FragmentEmptyPlaceholder; -import eu.konggdev.strikemaps.ui.fragment.layout.content.main.MainContentLayout; import eu.konggdev.strikemaps.ui.fragment.popup.Popup; import eu.konggdev.strikemaps.ui.element.region.UIRegion; public class Screen { @NonNull AppController app; - public Screen(AppController app, Map regions) { + Toolbar supportBar; + public Screen(AppController app, Map regions, Toolbar supportBar) { this.app = app; this.uiRegions = regions; + this.supportBar = supportBar; } - - private MainContentLayout mainContent; - Map uiRegions; public Integer popup; diff --git a/app/src/main/res/drawable/ic_hamburger_menu.png b/app/src/main/res/drawable/ic_hamburger_menu.png index c6c049d66baf03cbfd59753d59a924ff527e4757..2ccf9ea0179921377087a7f4e2fcc0f01936dd6d 100644 GIT binary patch delta 162 zcmcb{xRFt@Gr-TCmrII^fq{Y7)59eQNQ(op3I`jIOgge~@kB+5ieyh0#}JRsx0ek0 z4j6DSJBUxpf3k9q!uj5am)E=kuNZ7wm7jEA9*@99f7zSv#@q}Y94oYrNxax=|IB;a zo~>nfS87DgTO;NASly82DT=r-8j%ljvQaiIFA4PTCd&44kRijbw^miAa OwG5uFelF{r5}E+?xIpy) delta 200 zcmV;(05|`!0oDN_iBL{Q4GJ0x0000DNk~Le0000H0000a2nGNE0B_pSasvP} z12fy4Q(J3q{hJq(b3Qa8+Sgic6E}pJ_j8D + android:padding="6dp"> - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_preview.xml b/app/src/main/res/layout/item_preview.xml index 225c5a6..9c09285 100644 --- a/app/src/main/res/layout/item_preview.xml +++ b/app/src/main/res/layout/item_preview.xml @@ -55,4 +55,5 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/choiceName" app:layout_constraintBottom_toBottomOf="parent"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/menu_dropdown.xml b/app/src/main/res/layout/menu_dropdown.xml new file mode 100644 index 0000000..fc522f3 --- /dev/null +++ b/app/src/main/res/layout/menu_dropdown.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 5bf9e18..d0c4d29 100755 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b5a8832..e1c7da5 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ Strike Maps + Settings Attribution Earth map data Included;\n - © OpenStreetMap Contributors\nMap Rendering libraries Included;\n - MapLibre developed by MapLibre Organization\n - Vtm developed by Mapsforge\nStrike Maps made with <3 by konggdev \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 2ff8ad6..889752f 100755 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file