From 35141bc1ec0aa0f9e5d6a65b7bd30136f6bf0ac8 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sun, 18 Nov 2018 16:49:02 +0100 Subject: [PATCH] Back Button Implemented! Finally! Finally! Finally! --- .../java/de/sebse/fuplanner/MainActivity.java | 64 +++++++++++++++---- .../canteen/DaySwitcherFragment.java | 42 ++++++++++-- .../moddetails/ModDetailFragment.java | 2 +- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 90 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 2467c20..a110f8f 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -2,6 +2,7 @@ package de.sebse.fuplanner; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -11,6 +12,8 @@ import android.widget.Toast; import com.android.volley.NetworkResponse; import com.google.android.material.navigation.NavigationView; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Iterator; @@ -43,6 +46,7 @@ import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.NewAsyncQueue; +import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.RequestPermissionsResultListener; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.network.NetworkCallback; @@ -68,6 +72,7 @@ public class MainActivity extends AppCompatActivity private static final String ARG_FRAGMENT_PAGE = "fragment_page"; private static final String ARG_FRAGMENT_STATUS = "fragment_status"; + private static final int DOUBLE_CLICK_TO_EXIT_MILLIS = 200; private FragmentManager mFragmentManager; private GoogleAuth mGoogleAuth; @@ -75,12 +80,14 @@ public class MainActivity extends AppCompatActivity private final Logger log = new Logger(this); private NavigationView mNavigationView; - private int fragmentPage = FRAGMENT_NONE; - private String fragmentData = ""; + private int mFragmentPage = FRAGMENT_NONE; + @NotNull + private String mFragmentData = ""; private CanteenBrowser mCanteenBrowser; private final HashMap permissionListeners = new HashMap<>(); private boolean mOfflineBanner; private final NewAsyncQueue mQueue = new NewAsyncQueue(); + private long mDoubleBackToExitPressedOnce = 0; @Override protected void onCreate(Bundle savedInstanceState) { @@ -110,24 +117,51 @@ public class MainActivity extends AppCompatActivity desiredPage = FRAGMENT_LOGIN; desiredData = ""; } + log.d("desired", desiredPage, desiredData); updateNavigation(); changeFragment(desiredPage, desiredData); } @Override public void onBackPressed() { + if (mDoubleBackToExitPressedOnce + DOUBLE_CLICK_TO_EXIT_MILLIS > System.currentTimeMillis()) { + super.onBackPressed(); + return; + } + DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { - super.onBackPressed(); + if (mFragmentPage == FRAGMENT_MODULES_DETAILS) { + ModDetailFragment fragment = (ModDetailFragment) mFragmentManager.findFragmentByTag(String.valueOf(FRAGMENT_MODULES_DETAILS)); + if (fragment != null && fragment.isVisible() && Regex.has("\\.[1-9][0-9]*", fragment.getData())) { + fragment.gotoFragmentPart(0, -1); + } else { + changeFragment(FRAGMENT_MODULES); + } + } else if (mFragmentPage == FRAGMENT_CANTEENS_DETAILS) { + DaySwitcherFragment fragment = (DaySwitcherFragment) mFragmentManager.findFragmentByTag(String.valueOf(FRAGMENT_CANTEENS_DETAILS)); + if (fragment != null && fragment.isVisible() && Regex.has("\\.[1-9][0-9]*", fragment.getData())) { + fragment.gotoFragmentPart(0); + } else { + changeFragment(FRAGMENT_CANTEENS); + } + } else if (getKVV().account().isLoggedIn() && mFragmentPage != getDefaultFragmentAfterLogin()) { + changeFragment(getDefaultFragmentAfterLogin()); + } else if (!getKVV().account().isLoggedIn() && mFragmentPage != FRAGMENT_LOGIN) { + changeFragment(FRAGMENT_LOGIN); + } else { + mDoubleBackToExitPressedOnce = System.currentTimeMillis(); + showToast(R.string.back_to_exit); + } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. - if (fragmentPage == FRAGMENT_SCHEDULE) { + if (mFragmentPage == FRAGMENT_SCHEDULE) { getMenuInflater().inflate(R.menu.options_schedule, menu); return true; } @@ -217,13 +251,15 @@ public class MainActivity extends AppCompatActivity @Override protected void onSaveInstanceState(Bundle savedInstanceState) { - if (fragmentPage != FRAGMENT_STARTUP && fragmentPage != FRAGMENT_NONE && fragmentPage != FRAGMENT_LOGIN) { - Fragment fragment = mFragmentManager.findFragmentByTag(String.valueOf(fragmentPage)); - savedInstanceState.putInt(ARG_FRAGMENT_PAGE, fragmentPage); + if (mFragmentPage != FRAGMENT_STARTUP && mFragmentPage != FRAGMENT_NONE && mFragmentPage != FRAGMENT_LOGIN) { + Fragment fragment = mFragmentManager.findFragmentByTag(String.valueOf(mFragmentPage)); + savedInstanceState.putInt(ARG_FRAGMENT_PAGE, mFragmentPage); if (fragment instanceof ModDetailFragment) { savedInstanceState.putString(ARG_FRAGMENT_STATUS, ((ModDetailFragment) fragment).getData()); + } else if (fragment instanceof DaySwitcherFragment) { + savedInstanceState.putString(ARG_FRAGMENT_STATUS, ((DaySwitcherFragment) fragment).getData()); } else { - savedInstanceState.putString(ARG_FRAGMENT_STATUS, fragmentData); + savedInstanceState.putString(ARG_FRAGMENT_STATUS, mFragmentData); } } super.onSaveInstanceState(savedInstanceState); @@ -319,7 +355,7 @@ public class MainActivity extends AppCompatActivity fragment = ScheduleFragment.newInstance(); break; case FRAGMENT_CANTEENS_DETAILS: - fragment = DaySwitcherFragment.newInstance(Integer.parseInt(newData)); + fragment = DaySwitcherFragment.newInstance(newData); break; case FRAGMENT_CANTEENS: fragment = CanteensFragment.newInstance(); @@ -345,8 +381,8 @@ public class MainActivity extends AppCompatActivity findViewById(R.id.app_bar_include).setVisibility(View.VISIBLE); } - this.fragmentPage = newFragment; - this.fragmentData = newData; + this.mFragmentPage = newFragment; + this.mFragmentData = newData; invalidateOptionsMenu(); } @@ -367,9 +403,9 @@ public class MainActivity extends AppCompatActivity private void setNavigationSelection() { MenuItem item; - switch (fragmentPage) { + switch (mFragmentPage) { case FRAGMENT_MODULES_DETAILS: - getKVV().modules().list().find(fragmentData, success -> { + getKVV().modules().list().find(mFragmentData, success -> { int size = mNavigationView.getMenu().size(); //noinspection ConstantConditions String title = success == null ? null : success.title; @@ -391,7 +427,7 @@ public class MainActivity extends AppCompatActivity case FRAGMENT_CANTEENS_DETAILS: getCanteenBrowser().getCanteens(success -> { int size = mNavigationView.getMenu().size(); - Canteen canteen = success.getCanteen(Integer.parseInt(fragmentData)); + Canteen canteen = success.getCanteen(Integer.parseInt(mFragmentData)); //noinspection ConstantConditions String title = canteen == null ? null : canteen.getName(); for (int k = 0; k < size; k++) { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java index 0af8703..0150508 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/canteen/DaySwitcherFragment.java @@ -31,10 +31,12 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener // Parameters private int mCanteenId; + private String mPageRestoreRequest = null; private MainActivityListener mListener; private final Logger log = new Logger(this); private DaySwitcherAdapter adapterViewPager; + private ViewPager mViewPager; public DaySwitcherFragment() { // Required empty public constructor @@ -47,10 +49,14 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener * @param canteenId Canteen id in canteens list. * @return A new instance of fragment DaySwitcherFragment. */ - public static Fragment newInstance(int canteenId) { + public static Fragment newInstance(String canteenId) { DaySwitcherFragment fragment = new DaySwitcherFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, canteenId); + if (!canteenId.contains(".")) + args.putString(ARG_POSITION, canteenId+".0"); + else + args.putString(ARG_POSITION, canteenId); + fragment.setArguments(args); return fragment; } @@ -59,7 +65,15 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mCanteenId = getArguments().getInt(ARG_POSITION); + String canteenId = getArguments().getString(ARG_POSITION); + if (!canteenId.contains(".")) { + mCanteenId = Integer.parseInt(canteenId); + mPageRestoreRequest = null; + } else { + String[] split = canteenId.split("\\.", 2); + mCanteenId = Integer.parseInt(split[0]); + mPageRestoreRequest = split[1]; + } } if (mListener != null) { mListener.onTitleTextChange(R.string.canteens); @@ -77,10 +91,10 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener // Inflate the layout for this fragment View v = inflater.inflate(R.layout.fragment_mod_detail, container, false); - ViewPager mViewPager = v.findViewById(R.id.vpPager); + mViewPager = v.findViewById(R.id.vpPager); adapterViewPager = new DaySwitcherAdapter(getChildFragmentManager()); mViewPager.setAdapter(adapterViewPager); - + applyPageRequest(); refresh(); return v; @@ -114,8 +128,10 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener Canteen canteen = canteens.getCanteen(mCanteenId); canteen.cleanUpDays(); adapterViewPager.setModule(canteen); + applyPageRequest(); browser.getCanteen(canteen, success -> { adapterViewPager.setModule(); + applyPageRequest(); if (callback != null) callback.onResponse(success); }, error -> { @@ -136,4 +152,20 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener refresh(true, callback, errorCallback); } + public void gotoFragmentPart(int part) { + mViewPager.setCurrentItem(part, true); + } + + public String getData() { + return mCanteenId+"."+mViewPager.getCurrentItem(); + } + + private void applyPageRequest() { + if (mPageRestoreRequest != null) { + int request = Integer.parseInt(mPageRestoreRequest); + mViewPager.setCurrentItem(request); + if (request == mViewPager.getCurrentItem()) + mPageRestoreRequest = null; + } + } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java index b903da7..b673cb2 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java @@ -48,7 +48,7 @@ public class ModDetailFragment extends Fragment implements ModDetailListener { ModDetailFragment fragment = new ModDetailFragment(); Bundle args = new Bundle(); if (!itemPosition.contains(".")) - args.putString(ARG_POSITION, itemPosition+"."+0); + args.putString(ARG_POSITION, itemPosition+".0"); else args.putString(ARG_POSITION, itemPosition); diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5c53aae..cfc4442 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -81,4 +81,5 @@ Neuigkeiten Update-News Tipps/Tricks + Klicke ZURÜCK erneut zum Beenden! \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b351a08..9d5d76d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,4 +89,5 @@ News Update News Tips/Tricks + Please click BACK again to exit!