From ee6f39182099bd8bf2da36de146f2c181b1c00f5 Mon Sep 17 00:00:00 2001 From: konggdev Date: Sat, 23 May 2026 07:08:52 +0200 Subject: [PATCH] Make activity authoritative for contentView and implement a basic Settings skeleton --- .../eu/konggdev/strikemaps/MainActivity.java | 8 ++ .../strikemaps/app/AppController.java | 3 +- .../konggdev/strikemaps/ui/UIComponent.java | 64 ++++++++------- .../ui/element/{ => region}/UIRegion.java | 3 +- .../region/content/MainContentRegion.java | 24 ++++++ .../ui/fragment/ContainerFragment.java | 1 - .../fragment/layout/FragmentLayoutSearch.java | 51 ++++++++++++ .../main/FragmentLayoutContentMap.java | 5 +- .../main/FragmentLayoutContentSettings.java | 16 +++- .../konggdev/strikemaps/ui/screen/Screen.java | 21 ++--- .../ui/screen/definition/DefinedScreen.java | 5 ++ app/src/main/res/layout/fragment_search.xml | 39 +++++++++ app/src/main/res/layout/fragment_settings.xml | 21 +++++ app/src/main/res/layout/screen_main.xml | 80 ------------------- app/src/main/res/layout/screen_settings.xml | 6 -- app/src/main/res/layout/view_main.xml | 41 ++++++++++ 16 files changed, 252 insertions(+), 136 deletions(-) rename app/src/main/java/eu/konggdev/strikemaps/ui/element/{ => region}/UIRegion.java (95%) create mode 100644 app/src/main/java/eu/konggdev/strikemaps/ui/element/region/content/MainContentRegion.java create mode 100644 app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java create mode 100644 app/src/main/java/eu/konggdev/strikemaps/ui/screen/definition/DefinedScreen.java create mode 100644 app/src/main/res/layout/fragment_search.xml create mode 100644 app/src/main/res/layout/fragment_settings.xml delete mode 100755 app/src/main/res/layout/screen_main.xml delete mode 100644 app/src/main/res/layout/screen_settings.xml create mode 100755 app/src/main/res/layout/view_main.xml diff --git a/app/src/main/java/eu/konggdev/strikemaps/MainActivity.java b/app/src/main/java/eu/konggdev/strikemaps/MainActivity.java index 890eb31..1760868 100755 --- a/app/src/main/java/eu/konggdev/strikemaps/MainActivity.java +++ b/app/src/main/java/eu/konggdev/strikemaps/MainActivity.java @@ -18,6 +18,7 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); app = new AppController(this); + setContentView(R.layout.view_main); app.init(); } @@ -28,4 +29,11 @@ public class MainActivity extends AppCompatActivity { public void logcat(String log) { Log.i("LogcatGeneric", log); } + + @Override + public void onBackPressed() { + if (!app.getUi().back()) { + super.onBackPressed(); // exits app + } + } } 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 d3d8434..d061956 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java +++ b/app/src/main/java/eu/konggdev/strikemaps/app/AppController.java @@ -7,6 +7,7 @@ import eu.konggdev.strikemaps.MainActivity; import eu.konggdev.strikemaps.R; import eu.konggdev.strikemaps.map.MapComponent; import eu.konggdev.strikemaps.ui.UIComponent; +import eu.konggdev.strikemaps.ui.screen.definition.DefinedScreen; import static android.content.Context.MODE_PRIVATE; public class AppController { @@ -39,7 +40,7 @@ public class AppController { if(map == null) map = new MapComponent(this); if(ui == null) { ui = new UIComponent(this, map); - ui.swapScreen(R.layout.screen_main); //Initial + ui.swapScreen(DefinedScreen.MAIN); //Initial } } } 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 d5962a4..ccaf9a0 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/UIComponent.java @@ -3,64 +3,74 @@ package eu.konggdev.strikemaps.ui; import android.app.AlertDialog; import android.view.View; import androidx.annotation.NonNull; -import com.google.common.collect.BiMap; import eu.konggdev.strikemaps.Component; import eu.konggdev.strikemaps.R; import eu.konggdev.strikemaps.app.AppController; import eu.konggdev.strikemaps.map.MapComponent; -import eu.konggdev.strikemaps.ui.element.UIRegion; +import eu.konggdev.strikemaps.ui.element.region.content.MainContentRegion; +import eu.konggdev.strikemaps.ui.element.region.UIRegion; import eu.konggdev.strikemaps.ui.fragment.layout.FragmentLayoutControls; +import eu.konggdev.strikemaps.ui.fragment.layout.FragmentLayoutSearch; import eu.konggdev.strikemaps.ui.fragment.layout.content.main.FragmentLayoutContentSettings; import eu.konggdev.strikemaps.ui.screen.Screen; +import eu.konggdev.strikemaps.ui.screen.definition.DefinedScreen; -import java.util.HashMap; +import java.util.ArrayDeque; import java.util.Map; import java.util.function.Consumer; public class UIComponent implements Component { @NonNull AppController app; - private Map screens; - private Integer currentScreen; + MapComponent map; + + private final ArrayDeque screenStack = new ArrayDeque<>(); public UIComponent(AppController app, MapComponent map) { this.app = app; - this.screens = Map.of( + this.map = map; + } + + public Map getScreens(MapComponent map) { + return Map.of( //Main screen - R.layout.screen_main, new Screen( + DefinedScreen.MAIN, new Screen( //App reference app, - //Map view - map.toFragment(), //FragmentLayoutContentMap //Main screen init regions definition - Map.of(R.id.bottomUi, new UIRegion(new FragmentLayoutControls(app, R.id.bottomUi), R.id.bottomUi)), //TODO: Probably stop referencing layout 3(!) times everytime - //Layout - R.layout.screen_main //TODO: Define this for the Screen without duplicating the reference + Map.of( + 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 ), //Settings screen - R.layout.screen_settings, new Screen( + DefinedScreen.SETTINGS, new Screen( app, - //Settings - new FragmentLayoutContentSettings(), - /* No regions defined in settings - Entire screen is just the main view */ - new HashMap<>(), - //Layout - R.layout.screen_settings + //Just the settings content fragment + Map.of( + R.id.mainContentView, new MainContentRegion(new FragmentLayoutContentSettings(), R.id.mainContentView) + ) ) ); } - public void swapScreen(Integer screen) { - currentScreen = screen; + public void swapScreen(DefinedScreen screenKey) { + if (!screenStack.isEmpty()) getCurrentScreen().detachAll(); + screenStack.add(getScreens(map).get(screenKey)); getCurrentScreen().attachAll(); } - public Screen getCurrentScreen() { - return getScreen(currentScreen); + public boolean back() { + if (screenStack.size() <= 1) return false; + getCurrentScreen().detachAll(); + + screenStack.removeLast(); + getCurrentScreen().attachAll(); + return true; } - public Screen getScreen(Integer screen) { - return screens.get(screen); + public Screen getCurrentScreen() { + return screenStack.getLast(); } public void alert(AlertDialog dialog) { @@ -74,4 +84,4 @@ public class UIComponent implements Component { public View inflateUi(int layout) { return app.getActivity().getLayoutInflater().inflate(layout, null); } -} +} \ No newline at end of file diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/element/UIRegion.java b/app/src/main/java/eu/konggdev/strikemaps/ui/element/region/UIRegion.java similarity index 95% rename from app/src/main/java/eu/konggdev/strikemaps/ui/element/UIRegion.java rename to app/src/main/java/eu/konggdev/strikemaps/ui/element/region/UIRegion.java index bed3122..8969437 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/element/UIRegion.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/element/region/UIRegion.java @@ -1,4 +1,4 @@ -package eu.konggdev.strikemaps.ui.element; +package eu.konggdev.strikemaps.ui.element.region; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -40,5 +40,4 @@ public class UIRegion { currentFragment = stockFragment; } } - } diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/element/region/content/MainContentRegion.java b/app/src/main/java/eu/konggdev/strikemaps/ui/element/region/content/MainContentRegion.java new file mode 100644 index 0000000..d7e1741 --- /dev/null +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/element/region/content/MainContentRegion.java @@ -0,0 +1,24 @@ +package eu.konggdev.strikemaps.ui.element.region.content; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import eu.konggdev.strikemaps.ui.element.region.UIRegion; + +public class MainContentRegion extends UIRegion { + public Fragment fragment; + public Integer layoutId; + + public MainContentRegion(@NonNull Fragment initFragment, Integer refLayoutId) { + super(initFragment, refLayoutId); + this.fragment = initFragment; + this.layoutId = refLayoutId; + } + + public Fragment getFragment() { + return this.fragment; + } + + public void setFragment(Fragment fragment) { + this.fragment = fragment; + } +} diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/ContainerFragment.java b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/ContainerFragment.java index 3e44762..efa3498 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/ContainerFragment.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/ContainerFragment.java @@ -4,7 +4,6 @@ import android.view.MotionEvent; import android.view.View; import androidx.fragment.app.Fragment; -import eu.konggdev.strikemaps.ui.element.UIRegion; public interface ContainerFragment { abstract public Integer getRegion(); 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 new file mode 100644 index 0000000..4525e80 --- /dev/null +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/FragmentLayoutSearch.java @@ -0,0 +1,51 @@ +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.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import android.widget.TextView; +import android.widget.Toast; + +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.screen.definition.DefinedScreen; + +public class FragmentLayoutSearch extends Fragment implements Layout { + AppController app; + View rootView; + + private final Integer region; + + public FragmentLayoutSearch(AppController app, Integer region) { + super(R.layout.fragment_search); + this.app = app; + this.region = region; + } + + @Override + public Integer getRegion() { + return region; + } + + @Override + public Fragment toFragment() { + return this; + } + + @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))); + } +} diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentMap.java b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentMap.java index 1f520a2..f2c2de9 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentMap.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentMap.java @@ -2,13 +2,11 @@ package eu.konggdev.strikemaps.ui.fragment.layout.content.main; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; - -import eu.konggdev.strikemaps.ui.element.UIRegion; - import eu.konggdev.strikemaps.R; public class FragmentLayoutContentMap extends Fragment implements MainContentLayout { @@ -28,6 +26,7 @@ public class FragmentLayoutContentMap extends Fragment implements MainContentLay public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); LinearLayout layout = (LinearLayout) view; + if(mapView.getParent() != null) ((ViewGroup) mapView.getParent()).removeView(mapView); layout.addView(mapView); } } diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentSettings.java b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentSettings.java index 6b30a80..dcefccc 100644 --- a/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentSettings.java +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/fragment/layout/content/main/FragmentLayoutContentSettings.java @@ -1,10 +1,20 @@ package eu.konggdev.strikemaps.ui.fragment.layout.content.main; -import androidx.fragment.app.Fragment; +import android.os.Bundle; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import eu.konggdev.strikemaps.R; + +public class FragmentLayoutContentSettings extends Fragment implements MainContentLayout { + public FragmentLayoutContentSettings() { + super(R.layout.fragment_settings); + } -public class FragmentLayoutContentSettings implements MainContentLayout { @Override public Fragment toFragment() { - return null; + return this; } } 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 e1b434d..5d58fce 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 @@ -3,27 +3,22 @@ package eu.konggdev.strikemaps.ui.screen; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import java.util.List; import java.util.Map; -import eu.konggdev.strikemaps.R; 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.UIRegion; +import eu.konggdev.strikemaps.ui.element.region.UIRegion; public class Screen { @NonNull AppController app; - public Screen(AppController app, MainContentLayout mainContent, Map regions, Integer layout) { + public Screen(AppController app, Map regions) { this.app = app; - this.layout = layout; - this.mainContent = mainContent; this.uiRegions = regions; } - private final Integer layout; - private MainContentLayout mainContent; Map uiRegions; @@ -68,10 +63,10 @@ public class Screen { } public void attachAll() { - app.getActivity().setContentView(layout); - fragmentTransaction(R.id.mainContentView, mainContent.toFragment()); - for (UIRegion region : uiRegions.values()) { - setFragment(region, region.getFragment()); - } + for (UIRegion region : uiRegions.values()) setFragment(region, region.getFragment()); + } + + public void detachAll() { + for (UIRegion region : uiRegions.values()) fragmentTransaction(region.layoutId, new FragmentEmptyPlaceholder()); } } \ No newline at end of file diff --git a/app/src/main/java/eu/konggdev/strikemaps/ui/screen/definition/DefinedScreen.java b/app/src/main/java/eu/konggdev/strikemaps/ui/screen/definition/DefinedScreen.java new file mode 100644 index 0000000..72abed5 --- /dev/null +++ b/app/src/main/java/eu/konggdev/strikemaps/ui/screen/definition/DefinedScreen.java @@ -0,0 +1,5 @@ +package eu.konggdev.strikemaps.ui.screen.definition; +public enum DefinedScreen { + MAIN, + SETTINGS +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..7b22ac9 --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml new file mode 100644 index 0000000..21191ef --- /dev/null +++ b/app/src/main/res/layout/fragment_settings.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/screen_main.xml b/app/src/main/res/layout/screen_main.xml deleted file mode 100755 index 54c3289..0000000 --- a/app/src/main/res/layout/screen_main.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/screen_settings.xml b/app/src/main/res/layout/screen_settings.xml deleted file mode 100644 index 912a5d0..0000000 --- a/app/src/main/res/layout/screen_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_main.xml b/app/src/main/res/layout/view_main.xml new file mode 100755 index 0000000..30cdfdc --- /dev/null +++ b/app/src/main/res/layout/view_main.xml @@ -0,0 +1,41 @@ + + + + + + + + + +