Persistent drawer

This commit is contained in:
ByteHamster 2020-07-17 09:40:50 +02:00
parent 663c715e3f
commit ff8a56e49c
4 changed files with 83 additions and 17 deletions

View File

@ -68,9 +68,9 @@ public class MainActivity extends CastEnabledActivity {
public static final String EXTRA_OPEN_PLAYER = "open_player"; public static final String EXTRA_OPEN_PLAYER = "open_player";
public static final String EXTRA_REFRESH_ON_START = "refresh_on_start"; public static final String EXTRA_REFRESH_ON_START = "refresh_on_start";
private DrawerLayout drawerLayout; private @Nullable DrawerLayout drawerLayout;
private @Nullable ActionBarDrawerToggle drawerToggle;
private View navDrawer; private View navDrawer;
private ActionBarDrawerToggle drawerToggle;
private LockableBottomSheetBehavior sheetBehavior; private LockableBottomSheetBehavior sheetBehavior;
private long lastBackButtonPressTime = 0; private long lastBackButtonPressTime = 0;
private RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool(); private RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool();
@ -97,8 +97,11 @@ public class MainActivity extends CastEnabledActivity {
navDrawer = findViewById(R.id.navDrawerFragment); navDrawer = findViewById(R.id.navDrawerFragment);
final FragmentManager fm = getSupportFragmentManager(); final FragmentManager fm = getSupportFragmentManager();
fm.addOnBackStackChangedListener(() -> fm.addOnBackStackChangedListener(() -> {
drawerToggle.setDrawerIndicatorEnabled(fm.getBackStackEntryCount() == 0)); if (drawerToggle != null) { // Tablet layout does not have a drawer
drawerToggle.setDrawerIndicatorEnabled(fm.getBackStackEntryCount() == 0);
}
});
if (fm.findFragmentByTag(MAIN_FRAGMENT_TAG) == null) { if (fm.findFragmentByTag(MAIN_FRAGMENT_TAG) == null) {
String lastFragment = NavDrawerFragment.getLastNavFragment(this); String lastFragment = NavDrawerFragment.getLastNavFragment(this);
@ -151,12 +154,14 @@ public class MainActivity extends CastEnabledActivity {
@Override @Override
public void setSupportActionBar(@Nullable Toolbar toolbar) { public void setSupportActionBar(@Nullable Toolbar toolbar) {
drawerLayout.removeDrawerListener(drawerToggle); if (drawerLayout != null) { // Tablet layout does not have a drawer
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, drawerLayout.removeDrawerListener(drawerToggle);
R.string.drawer_open, R.string.drawer_close); drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
drawerLayout.addDrawerListener(drawerToggle); R.string.drawer_open, R.string.drawer_close);
drawerToggle.syncState(); drawerLayout.addDrawerListener(drawerToggle);
drawerToggle.setDrawerIndicatorEnabled(getSupportFragmentManager().getBackStackEntryCount() == 0); drawerToggle.syncState();
drawerToggle.setDrawerIndicatorEnabled(getSupportFragmentManager().getBackStackEntryCount() == 0);
}
super.setSupportActionBar(toolbar); super.setSupportActionBar(toolbar);
} }
@ -164,7 +169,11 @@ public class MainActivity extends CastEnabledActivity {
SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE); SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
if (prefs.getBoolean(PREF_IS_FIRST_LAUNCH, true)) { if (prefs.getBoolean(PREF_IS_FIRST_LAUNCH, true)) {
loadFragment(AddFeedFragment.TAG, null); loadFragment(AddFeedFragment.TAG, null);
new Handler().postDelayed(() -> drawerLayout.openDrawer(navDrawer), 1500); new Handler().postDelayed(() -> {
if (drawerLayout != null) { // Tablet layout does not have a drawer
drawerLayout.openDrawer(navDrawer);
}
}, 1500);
// for backward compatibility, we only change defaults for fresh installs // for backward compatibility, we only change defaults for fresh installs
UserPreferences.setUpdateInterval(12); UserPreferences.setUpdateInterval(12);
@ -258,7 +267,10 @@ public class MainActivity extends CastEnabledActivity {
// not commit anything in an AsyncTask, but that's a bigger // not commit anything in an AsyncTask, but that's a bigger
// change than we want now. // change than we want now.
t.commitAllowingStateLoss(); t.commitAllowingStateLoss();
drawerLayout.closeDrawer(navDrawer);
if (drawerLayout != null) { // Tablet layout does not have a drawer
drawerLayout.closeDrawer(navDrawer);
}
} }
public void loadChildFragment(Fragment fragment, TransitionEffect transition) { public void loadChildFragment(Fragment fragment, TransitionEffect transition) {
@ -292,13 +304,17 @@ public class MainActivity extends CastEnabledActivity {
@Override @Override
protected void onPostCreate(Bundle savedInstanceState) { protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState); super.onPostCreate(savedInstanceState);
drawerToggle.syncState(); if (drawerToggle != null) { // Tablet layout does not have a drawer
drawerToggle.syncState();
}
} }
@Override @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig); if (drawerToggle != null) { // Tablet layout does not have a drawer
drawerToggle.onConfigurationChanged(newConfig);
}
} }
@Override @Override
@ -351,7 +367,7 @@ public class MainActivity extends CastEnabledActivity {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle.onOptionsItemSelected(item)) { if (drawerToggle != null && drawerToggle.onOptionsItemSelected(item)) { // Tablet layout does not have a drawer
return true; return true;
} else if (item.getItemId() == android.R.id.home) { } else if (item.getItemId() == android.R.id.home) {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) { if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
@ -374,7 +390,9 @@ public class MainActivity extends CastEnabledActivity {
} else { } else {
switch (UserPreferences.getBackButtonBehavior()) { switch (UserPreferences.getBackButtonBehavior()) {
case OPEN_DRAWER: case OPEN_DRAWER:
drawerLayout.openDrawer(navDrawer); if (drawerLayout != null) { // Tablet layout does not have drawer
drawerLayout.openDrawer(navDrawer);
}
break; break;
case SHOW_PROMPT: case SHOW_PROMPT:
new AlertDialog.Builder(this) new AlertDialog.Builder(this)

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/navDrawerFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="?android:attr/listDivider" />
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/overview_coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:foreground="?android:windowContentOverlay"
tools:background="@android:color/holo_red_dark" />
<FrameLayout
android:elevation="8dp"
android:id="@+id/audioplayerFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/windowBackground"
android:visibility="gone"
app:layout_behavior="de.danoeh.antennapod.view.LockableBottomSheetBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</LinearLayout>

View File

@ -5,7 +5,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
tools:ignore="InconsistentLayout">
<!-- InconsistentLayout: Tablet layout does not have a drawer -->
<androidx.coordinatorlayout.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/overview_coordinator_layout" android:id="@+id/overview_coordinator_layout"