From 0b23d4355e840548e41ba09cfa3a239652d3450c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Villegas?= Date: Wed, 25 Feb 2026 13:32:09 -0300 Subject: [PATCH] feat: stabilize public methods and their implementations --- .../navigation/NavigationController.java | 40 +++++++- .../tempo/navigation/NavigationHelper.java | 97 ++++++++----------- 2 files changed, 79 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationController.java b/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationController.java index 8b89f37a..a6437dca 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationController.java +++ b/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationController.java @@ -1,12 +1,44 @@ package com.cappielloantonio.tempo.navigation; +import android.view.View; + +import androidx.annotation.NonNull; import androidx.annotation.OptIn; +import androidx.appcompat.app.AppCompatActivity; import androidx.media3.common.util.UnstableApi; +import androidx.navigation.NavController; -public interface NavigationController { +import com.cappielloantonio.tempo.navigation.NavigationHelper; - @OptIn(markerClass = UnstableApi.class) - default boolean isVisible() { - return NavigationDelegate.isVisible(); +import com.google.android.material.bottomsheet.BottomSheetBehavior; + +public class NavigationController { + + NavigationHelper helper; + + public NavigationController(@NonNull NavigationHelper helper) { + this.helper = helper; + } + + public void syncWithBottomSheetBehavior(BottomSheetBehavior bottomSheetBehavior, + NavController navController) { + helper.syncWithBottomSheetBehavior(bottomSheetBehavior, navController); + + } + + public void setNavbarVisibility(boolean visibility) { + helper.setBottomNavigationBarVisibility(visibility); + } + + public void setDrawerLock(boolean visibility) { + helper.setNavigationDrawerLock(visibility); + } + + public void toggleDrawerLockOnOrientation(AppCompatActivity activity) { + helper.toggleNavigationDrawerLockOnOrientationChange(activity); + } + + public void setSystemBarsVisibility(AppCompatActivity activity, boolean visibility) { + helper.setSystemBarsVisibility(activity, visibility); } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationHelper.java b/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationHelper.java index c9cb2711..b5916f73 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationHelper.java +++ b/app/src/main/java/com/cappielloantonio/tempo/navigation/NavigationHelper.java @@ -1,18 +1,21 @@ package com.cappielloantonio.tempo.navigation; import android.content.Context; +import android.content.res.Configuration; import android.view.View; import android.view.Window; import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.OptIn; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.media3.common.util.UnstableApi; import androidx.navigation.NavController; +import androidx.navigation.NavDestination; import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.ui.NavigationUI; @@ -23,6 +26,8 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.navigation.NavigationView; +import org.jetbrains.annotations.Contract; + import java.util.Objects; public class NavigationHelper { @@ -34,62 +39,33 @@ public class NavigationHelper { /* Navigation components */ private NavigationView navigationView; private NavHostFragment navHostFragment; - private NavController navController; /* States that need to be remembered */ - private final Context context; + // -- // /* Private constructor */ - private NavigationHelper(@NonNull Context context) { - this.context = context.getApplicationContext(); + public NavigationHelper(@NonNull BottomNavigationView bottomNavigationView, + @NonNull FrameLayout bottomNavigationViewFrame, + @NonNull DrawerLayout drawerLayout, + @NonNull NavigationView navigationView, + @NonNull NavHostFragment navHostFragment) { + this.bottomNavigationView = bottomNavigationView; + this.bottomNavigationViewFrame = bottomNavigationViewFrame; + this.drawerLayout = drawerLayout; + this.navigationView = navigationView; + this.navHostFragment = navHostFragment; } - /* Call inside onCreate() in MainActivity giving as argument `this` */ - @OptIn(markerClass = UnstableApi.class) - public static NavigationHelper init(@NonNull MainActivity activity) { - NavigationHelper helper = new NavigationHelper(activity); - helper.bindViews(activity); - helper.setupNavigation(activity); - return helper; - } - - /* Call inside onDestroy() in MainActivity*/ - public void release() { - bottomNavigationView = null; - bottomNavigationViewFrame = null; - drawerLayout = null; - navigationView = null; - navHostFragment = null; - navController = null; - } - - /* Bind the views by finding them on the layout (XML id attr) */ - @OptIn(markerClass = UnstableApi.class) - private void bindViews(@NonNull MainActivity activity) { - bottomNavigationView = activity.findViewById(R.id.bottom_navigation); - bottomNavigationViewFrame = activity.findViewById(R.id.bottom_navigation_frame); - drawerLayout = activity.findViewById(R.id.drawer_layout); - navigationView = activity.findViewById(R.id.nav_view); - - navHostFragment = (NavHostFragment) activity - .getSupportFragmentManager() - .findFragmentById(R.id.nav_host_fragment); - navController = Objects.requireNonNull(navHostFragment).getNavController(); - } - - /* The navigation graph (untouched original implementation) */ - @OptIn(markerClass = UnstableApi.class) - private void setupNavigation(@NonNull MainActivity activity) { + public void syncWithBottomSheetBehavior(@NonNull BottomSheetBehavior bottomSheetBehavior, + @NonNull NavController navController) { navController.addOnDestinationChangedListener( (controller, destination, arguments) -> { - int destId = destination.getId(); - boolean isTarget = destId == R.id.homeFragment || - destId == R.id.libraryFragment || - destId == R.id.downloadFragment; + // React to the user clicking one of these on bottom-navbar/drawer + boolean isTarget = isTargetDestination(destination); + int currentState = bottomSheetBehavior.getState(); - if (isTarget && - activity.bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { - activity.bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + if (isTarget && currentState == BottomSheetBehavior.STATE_EXPANDED) { + bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); @@ -97,6 +73,18 @@ public class NavigationHelper { NavigationUI.setupWithNavController(navigationView, navController); } + @Contract(pure = true) + private static boolean isTargetDestination(NavDestination destination) { + int destId = destination.getId(); + return destId == R.id.homeFragment || + destId == R.id.libraryFragment || + destId == R.id.downloadFragment || + destId == R.id.albumCatalogueFragment || + destId == R.id.artistCatalogueFragment || + destId == R.id.genreCatalogueFragment || + destId == R.id.playlistCatalogueFragment; + } + /* Clean public methods Removes the need to invoke the activity on the fragment @@ -117,7 +105,13 @@ public class NavigationHelper { drawerLayout.setDrawerLockMode(mode); } - public void toggleNavigationDrawerLockOnOrientationChange(MainActivity activity, boolean isLandscape) { + @OptIn(markerClass = UnstableApi.class) + public void toggleNavigationDrawerLockOnOrientationChange( + AppCompatActivity activity) { + + int orientation = activity.getResources().getConfiguration().orientation; + boolean isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE; + if (Preferences.getEnableDrawerOnPortrait()) { setNavigationDrawerLock(false); return; @@ -130,11 +124,6 @@ public class NavigationHelper { that everything was defined on the activity and is gobally available */ - @NonNull - public NavController getNavController() { - return navController; - } - @NonNull public BottomNavigationView getBottomNavigationView() { return bottomNavigationView; @@ -155,7 +144,7 @@ public class NavigationHelper { */ @OptIn(markerClass = UnstableApi.class) - public void setSystemBarsVisibility(MainActivity activity, boolean visibility) { + public void setSystemBarsVisibility(AppCompatActivity activity, boolean visibility) { WindowInsetsControllerCompat insetsController; Window window = activity.getWindow(); View decorView = window.getDecorView();