2323import android .widget .TextView ;
2424import android .widget .Toast ;
2525
26+ import androidx .activity .OnBackPressedCallback ;
2627import androidx .annotation .NonNull ;
2728import androidx .annotation .Nullable ;
2829import androidx .appcompat .app .ActionBarDrawerToggle ;
@@ -167,21 +168,34 @@ public abstract class CandyBarMainActivity extends AppCompatActivity implements
167168 @ NonNull
168169 public abstract ActivityConfiguration onInit ();
169170
171+ private final OnBackPressedCallback backPressedCallback = new OnBackPressedCallback (true ) {
172+ @ Override
173+ public void handleOnBackPressed () {
174+ if (mFragManager .getBackStackEntryCount () > 0 ) {
175+ clearBackStack ();
176+ return ;
177+ }
178+
179+ if (mDrawerLayout .isDrawerOpen (GravityCompat .START )) {
180+ mDrawerLayout .closeDrawers ();
181+ return ;
182+ }
183+
184+ if (mFragmentTag != Extras .Tag .HOME ) {
185+ mPosition = mLastPosition = 0 ;
186+ setFragment (getFragment (mPosition ));
187+ }
188+ }
189+ };
190+
170191 @ Override
171192 protected void onCreate (@ Nullable Bundle savedInstanceState ) {
172193 final boolean isMaterialYou = Preferences .get (this ).isMaterialYou ();
173- final int nightMode ;
174- switch (Preferences .get (this ).getTheme ()) {
175- case LIGHT :
176- nightMode = AppCompatDelegate .MODE_NIGHT_NO ;
177- break ;
178- case DARK :
179- nightMode = AppCompatDelegate .MODE_NIGHT_YES ;
180- break ;
181- default :
182- nightMode = AppCompatDelegate .MODE_NIGHT_FOLLOW_SYSTEM ;
183- break ;
184- }
194+ final int nightMode = switch (Preferences .get (this ).getTheme ()) {
195+ case LIGHT -> AppCompatDelegate .MODE_NIGHT_NO ;
196+ case DARK -> AppCompatDelegate .MODE_NIGHT_YES ;
197+ default -> AppCompatDelegate .MODE_NIGHT_FOLLOW_SYSTEM ;
198+ };
185199 AppCompatDelegate .setDefaultNightMode (nightMode );
186200
187201 LocaleHelper .setLocale (this );
@@ -202,6 +216,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
202216
203217 initNavigationView (toolbar );
204218 initNavigationViewHeader ();
219+ registerBackPressHandler ();
205220
206221 ViewCompat .setOnApplyWindowInsetsListener (toolbar , (v , insets ) -> {
207222 ViewGroup .MarginLayoutParams params = (ViewGroup .MarginLayoutParams ) v .getLayoutParams ();
@@ -432,24 +447,8 @@ protected void onSaveInstanceState(Bundle outState) {
432447 super .onSaveInstanceState (outState );
433448 }
434449
435- @ Override
436- public void onBackPressed () {
437- if (mFragManager .getBackStackEntryCount () > 0 ) {
438- clearBackStack ();
439- return ;
440- }
441-
442- if (mDrawerLayout .isDrawerOpen (GravityCompat .START )) {
443- mDrawerLayout .closeDrawers ();
444- return ;
445- }
446-
447- if (mFragmentTag != Extras .Tag .HOME ) {
448- mPosition = mLastPosition = 0 ;
449- setFragment (getFragment (mPosition ));
450- return ;
451- }
452- super .onBackPressed ();
450+ private void registerBackPressHandler () {
451+ getOnBackPressedDispatcher ().addCallback (backPressedCallback );
453452 }
454453
455454 @ Override
@@ -991,10 +990,11 @@ private void setFragment(Fragment fragment) {
991990 Menu menu = mNavigationView .getMenu ();
992991 menu .getItem (mPosition ).setChecked (true );
993992 mToolbarTitle .setText (menu .getItem (mPosition ).getTitle ());
993+
994+ backPressedCallback .setEnabled (mFragmentTag != Extras .Tag .HOME );
994995 }
995996
996997 private Fragment getFragment (int position ) {
997- mFragmentTag = Extras .Tag .HOME ;
998998 if (position == Extras .Tag .HOME .idx ) {
999999 mFragmentTag = Extras .Tag .HOME ;
10001000 return new HomeFragment ();
@@ -1023,6 +1023,8 @@ private Fragment getFragment(int position) {
10231023 mFragmentTag = Extras .Tag .ABOUT ;
10241024 return new AboutFragment ();
10251025 }
1026+
1027+ mFragmentTag = Extras .Tag .HOME ;
10261028 return new HomeFragment ();
10271029 }
10281030
0 commit comments