Back Button Implemented! Finally! Finally! Finally!

This commit is contained in:
Caesar2011
2018-11-18 16:49:02 +01:00
parent d62256f1db
commit 35141bc1ec
5 changed files with 90 additions and 20 deletions

View File

@@ -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<String, RequestPermissionsResultListener> 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++) {

View File

@@ -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;
}
}
}

View File

@@ -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);

View File

@@ -81,4 +81,5 @@
<string name="news">Neuigkeiten</string>
<string name="update_news">Update-News</string>
<string name="tricks">Tipps/Tricks</string>
<string name="back_to_exit">Klicke ZURÜCK erneut zum Beenden!</string>
</resources>

View File

@@ -89,4 +89,5 @@
<string name="news">News</string>
<string name="update_news">Update News</string>
<string name="tricks">Tips/Tricks</string>
<string name="back_to_exit">Please click BACK again to exit!</string>
</resources>