diff --git a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/MainActivity.java b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/MainActivity.java index 41f5c3d..0d9c70d 100644 --- a/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/MainActivity.java +++ b/app/src/main/java/se/ajpanton/statusbartweak/shell/ui/MainActivity.java @@ -5,7 +5,9 @@ import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; +import android.view.View; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; @@ -22,10 +24,16 @@ import se.ajpanton.statusbartweak.R; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private static final String EXTRA_OPEN_NAV_ITEM = "open_nav_item"; + private static final float PERMANENT_SIDEBAR_FOLDED_WIDTH_MULTIPLIER = 1.1f; private SafeInsetDrawerLayout drawerLayout; - private NavigationView navigationView; - private Integer navigationBasePaddingLeft; + private NavigationView drawerNavigationView; + private NavigationView permanentNavigationView; + private MaterialToolbar toolbar; + private ActionBarDrawerToggle drawerToggle; + private Integer drawerNavigationBasePaddingLeft; + private Integer permanentNavigationBasePaddingLeft; + private boolean permanentSidebar; public static Intent newOpenDebugIntent(Context context) { Intent intent = new Intent(context, MainActivity.class); @@ -39,24 +47,42 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - MaterialToolbar toolbar = findViewById(R.id.toolbar); + toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); drawerLayout = findViewById(R.id.drawer_layout); - navigationView = findViewById(R.id.nav_view); - navigationView.setNavigationItemSelectedListener(this); - navigationView.getMenu().setGroupCheckable(0, true, true); + drawerNavigationView = findViewById(R.id.nav_view_drawer); + permanentNavigationView = findViewById(R.id.nav_view_permanent); + setupNavigationView(drawerNavigationView); + setupNavigationView(permanentNavigationView); applyNavigationDrawerInsets(); - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + drawerToggle = new ActionBarDrawerToggle( this, drawerLayout, toolbar, R.string.nav_open, R.string.nav_close ); - drawerLayout.addDrawerListener(toggle); - toggle.syncState(); + drawerLayout.addDrawerListener(drawerToggle); + drawerToggle.syncState(); + toolbar.setNavigationOnClickListener(v -> { + if (!permanentSidebar) { + drawerLayout.openDrawer(GravityCompat.START); + } + }); + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (!permanentSidebar && drawerLayout.isDrawerOpen(GravityCompat.START)) { + drawerLayout.closeDrawer(GravityCompat.START); + return; + } + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + setEnabled(true); + } + }); if (savedInstanceState == null) { int initialItemId = resolveInitialItemId(getIntent()); @@ -77,7 +103,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override public boolean onNavigationItemSelected(@NonNull android.view.MenuItem item) { navigateTo(item.getItemId()); - drawerLayout.closeDrawer(GravityCompat.START); + if (!permanentSidebar) { + drawerLayout.closeDrawer(GravityCompat.START); + } return true; } @@ -149,6 +177,11 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } private void syncDrawerSelection(int itemId) { + syncNavigationSelection(drawerNavigationView, itemId); + syncNavigationSelection(permanentNavigationView, itemId); + } + + private void syncNavigationSelection(NavigationView navigationView, int itemId) { if (navigationView == null) { return; } @@ -167,6 +200,17 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On navigationView.invalidate(); } + private void setupNavigationView(NavigationView navigationView) { + if (navigationView == null) { + return; + } + navigationView.setNavigationItemSelectedListener(this); + navigationView.getMenu().setGroupCheckable(0, true, true); + navigationView.addOnLayoutChangeListener((view, left, top, right, bottom, + oldLeft, oldTop, oldRight, oldBottom) -> + updateNavigationHeaderHeight(navigationView)); + } + private int resolveInitialItemId(Intent intent) { int requested = resolveOpenItemId(intent); return requested != -1 ? requested : R.id.nav_layout; @@ -195,6 +239,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void applyNavigationDrawerMarginsFromRootInsets() { WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(drawerLayout); if (insets == null) { + applyNavigationDrawerSafeArea(0, 0); return; } Insets safeInsets = insets.getInsetsIgnoringVisibility( @@ -206,10 +251,25 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On int safeLeft = Math.max(Math.max(0, leftInset), Math.max(0, drawerLayout.getPaddingLeft())); int safeRight = Math.max(Math.max(0, rightInset), Math.max(0, drawerLayout.getPaddingRight())); drawerLayout.setDrawerSafeInsets(safeLeft, safeRight); - if (navigationBasePaddingLeft == null) { - navigationBasePaddingLeft = navigationView.getPaddingLeft(); + drawerNavigationBasePaddingLeft = applyNavigationLeftPadding( + drawerNavigationView, + drawerNavigationBasePaddingLeft, + safeLeft); + permanentNavigationBasePaddingLeft = applyNavigationLeftPadding( + permanentNavigationView, + permanentNavigationBasePaddingLeft, + 0); + updatePermanentSidebarMode(); + } + + private Integer applyNavigationLeftPadding(NavigationView navigationView, + Integer basePaddingLeft, + int safeLeft) { + if (navigationView == null) { + return basePaddingLeft; } - int leftPadding = navigationBasePaddingLeft + safeLeft; + int base = basePaddingLeft != null ? basePaddingLeft : navigationView.getPaddingLeft(); + int leftPadding = base + safeLeft; if (navigationView.getPaddingLeft() != leftPadding || Math.round(navigationView.getTranslationX()) != 0) { navigationView.setTranslationX(0f); @@ -220,5 +280,72 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On navigationView.getPaddingBottom()); navigationView.requestLayout(); } + return base; + } + + private void updatePermanentSidebarMode() { + int rootWidth = drawerLayout.getWidth(); + if (rootWidth <= 0) { + return; + } + int drawerWidth = getResources().getDimensionPixelSize(R.dimen.sbt_navigation_drawer_width); + int foldedPortraitWidth = getResources().getDimensionPixelSize(R.dimen.sbt_folded_portrait_width); + boolean shouldUsePermanentSidebar = rootWidth >= drawerWidth + + Math.round(foldedPortraitWidth * PERMANENT_SIDEBAR_FOLDED_WIDTH_MULTIPLIER); + if (permanentSidebar != shouldUsePermanentSidebar) { + permanentSidebar = shouldUsePermanentSidebar; + drawerToggle.setDrawerIndicatorEnabled(!permanentSidebar); + toolbar.setVisibility(permanentSidebar ? View.GONE : View.VISIBLE); + if (permanentSidebar) { + permanentNavigationView.setVisibility(View.VISIBLE); + drawerLayout.closeDrawer(GravityCompat.START, false); + } else { + drawerNavigationView.setVisibility(View.VISIBLE); + drawerLayout.closeDrawer(GravityCompat.START, false); + permanentNavigationView.setVisibility(View.GONE); + drawerNavigationView.requestLayout(); + } + drawerToggle.syncState(); + } + updateNavigationHeaderHeight(drawerNavigationView); + updateNavigationHeaderHeight(permanentNavigationView); + } + + private void updateNavigationHeaderHeight(NavigationView navigationView) { + if (navigationView == null || navigationView.getHeaderCount() == 0) { + return; + } + int navigationHeight = navigationView.getHeight(); + if (navigationHeight <= 0) { + return; + } + int menuRows = countVisibleMenuRows(navigationView.getMenu()); + int menuHeight = menuRows * getResources().getDimensionPixelSize(R.dimen.sbt_navigation_menu_item_height); + int minHeaderHeight = getResources().getDimensionPixelSize(R.dimen.sbt_drawer_header_min_height); + int maxHeaderHeight = getResources().getDimensionPixelSize(R.dimen.sbt_drawer_header_max_height); + int desiredHeaderHeight = Math.max( + minHeaderHeight, + Math.min(maxHeaderHeight, navigationHeight - menuHeight)); + View header = navigationView.getHeaderView(0); + if (header == null || header.getLayoutParams() == null + || header.getLayoutParams().height == desiredHeaderHeight) { + return; + } + header.getLayoutParams().height = desiredHeaderHeight; + header.requestLayout(); + } + + private int countVisibleMenuRows(Menu menu) { + if (menu == null) { + return 0; + } + int count = 0; + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + if (item != null && item.isVisible()) { + count++; + } + } + return count; } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 600a798..d684068 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -9,30 +9,52 @@ android:fitsSystemWindows="true"> + android:orientation="horizontal"> - + - + + + + + + + + android:padding="@dimen/sbt_drawer_header_padding"> + + 216dp + 360dp + 48dp + 86dp + 86dp + 172dp + 16dp +