Back Button Implemented! Finally! Finally! Finally!
This commit is contained in:
@@ -2,6 +2,7 @@ package de.sebse.fuplanner;
|
|||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -11,6 +12,8 @@ import android.widget.Toast;
|
|||||||
import com.android.volley.NetworkResponse;
|
import com.android.volley.NetworkResponse;
|
||||||
import com.google.android.material.navigation.NavigationView;
|
import com.google.android.material.navigation.NavigationView;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
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.services.KVV.types.Modules;
|
||||||
import de.sebse.fuplanner.tools.MainActivityListener;
|
import de.sebse.fuplanner.tools.MainActivityListener;
|
||||||
import de.sebse.fuplanner.tools.NewAsyncQueue;
|
import de.sebse.fuplanner.tools.NewAsyncQueue;
|
||||||
|
import de.sebse.fuplanner.tools.Regex;
|
||||||
import de.sebse.fuplanner.tools.RequestPermissionsResultListener;
|
import de.sebse.fuplanner.tools.RequestPermissionsResultListener;
|
||||||
import de.sebse.fuplanner.tools.logging.Logger;
|
import de.sebse.fuplanner.tools.logging.Logger;
|
||||||
import de.sebse.fuplanner.tools.network.NetworkCallback;
|
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_PAGE = "fragment_page";
|
||||||
private static final String ARG_FRAGMENT_STATUS = "fragment_status";
|
private static final String ARG_FRAGMENT_STATUS = "fragment_status";
|
||||||
|
private static final int DOUBLE_CLICK_TO_EXIT_MILLIS = 200;
|
||||||
|
|
||||||
private FragmentManager mFragmentManager;
|
private FragmentManager mFragmentManager;
|
||||||
private GoogleAuth mGoogleAuth;
|
private GoogleAuth mGoogleAuth;
|
||||||
@@ -75,12 +80,14 @@ public class MainActivity extends AppCompatActivity
|
|||||||
private final Logger log = new Logger(this);
|
private final Logger log = new Logger(this);
|
||||||
private NavigationView mNavigationView;
|
private NavigationView mNavigationView;
|
||||||
|
|
||||||
private int fragmentPage = FRAGMENT_NONE;
|
private int mFragmentPage = FRAGMENT_NONE;
|
||||||
private String fragmentData = "";
|
@NotNull
|
||||||
|
private String mFragmentData = "";
|
||||||
private CanteenBrowser mCanteenBrowser;
|
private CanteenBrowser mCanteenBrowser;
|
||||||
private final HashMap<String, RequestPermissionsResultListener> permissionListeners = new HashMap<>();
|
private final HashMap<String, RequestPermissionsResultListener> permissionListeners = new HashMap<>();
|
||||||
private boolean mOfflineBanner;
|
private boolean mOfflineBanner;
|
||||||
private final NewAsyncQueue mQueue = new NewAsyncQueue();
|
private final NewAsyncQueue mQueue = new NewAsyncQueue();
|
||||||
|
private long mDoubleBackToExitPressedOnce = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -110,24 +117,51 @@ public class MainActivity extends AppCompatActivity
|
|||||||
desiredPage = FRAGMENT_LOGIN;
|
desiredPage = FRAGMENT_LOGIN;
|
||||||
desiredData = "";
|
desiredData = "";
|
||||||
}
|
}
|
||||||
|
log.d("desired", desiredPage, desiredData);
|
||||||
updateNavigation();
|
updateNavigation();
|
||||||
changeFragment(desiredPage, desiredData);
|
changeFragment(desiredPage, desiredData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
|
if (mDoubleBackToExitPressedOnce + DOUBLE_CLICK_TO_EXIT_MILLIS > System.currentTimeMillis()) {
|
||||||
|
super.onBackPressed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DrawerLayout drawer = findViewById(R.id.drawer_layout);
|
DrawerLayout drawer = findViewById(R.id.drawer_layout);
|
||||||
if (drawer.isDrawerOpen(GravityCompat.START)) {
|
if (drawer.isDrawerOpen(GravityCompat.START)) {
|
||||||
drawer.closeDrawer(GravityCompat.START);
|
drawer.closeDrawer(GravityCompat.START);
|
||||||
} else {
|
} 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
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
// Inflate the menu; this adds items to the action bar if it is present.
|
// 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);
|
getMenuInflater().inflate(R.menu.options_schedule, menu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -217,13 +251,15 @@ public class MainActivity extends AppCompatActivity
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSaveInstanceState(Bundle savedInstanceState) {
|
protected void onSaveInstanceState(Bundle savedInstanceState) {
|
||||||
if (fragmentPage != FRAGMENT_STARTUP && fragmentPage != FRAGMENT_NONE && fragmentPage != FRAGMENT_LOGIN) {
|
if (mFragmentPage != FRAGMENT_STARTUP && mFragmentPage != FRAGMENT_NONE && mFragmentPage != FRAGMENT_LOGIN) {
|
||||||
Fragment fragment = mFragmentManager.findFragmentByTag(String.valueOf(fragmentPage));
|
Fragment fragment = mFragmentManager.findFragmentByTag(String.valueOf(mFragmentPage));
|
||||||
savedInstanceState.putInt(ARG_FRAGMENT_PAGE, fragmentPage);
|
savedInstanceState.putInt(ARG_FRAGMENT_PAGE, mFragmentPage);
|
||||||
if (fragment instanceof ModDetailFragment) {
|
if (fragment instanceof ModDetailFragment) {
|
||||||
savedInstanceState.putString(ARG_FRAGMENT_STATUS, ((ModDetailFragment) fragment).getData());
|
savedInstanceState.putString(ARG_FRAGMENT_STATUS, ((ModDetailFragment) fragment).getData());
|
||||||
|
} else if (fragment instanceof DaySwitcherFragment) {
|
||||||
|
savedInstanceState.putString(ARG_FRAGMENT_STATUS, ((DaySwitcherFragment) fragment).getData());
|
||||||
} else {
|
} else {
|
||||||
savedInstanceState.putString(ARG_FRAGMENT_STATUS, fragmentData);
|
savedInstanceState.putString(ARG_FRAGMENT_STATUS, mFragmentData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onSaveInstanceState(savedInstanceState);
|
super.onSaveInstanceState(savedInstanceState);
|
||||||
@@ -319,7 +355,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
fragment = ScheduleFragment.newInstance();
|
fragment = ScheduleFragment.newInstance();
|
||||||
break;
|
break;
|
||||||
case FRAGMENT_CANTEENS_DETAILS:
|
case FRAGMENT_CANTEENS_DETAILS:
|
||||||
fragment = DaySwitcherFragment.newInstance(Integer.parseInt(newData));
|
fragment = DaySwitcherFragment.newInstance(newData);
|
||||||
break;
|
break;
|
||||||
case FRAGMENT_CANTEENS:
|
case FRAGMENT_CANTEENS:
|
||||||
fragment = CanteensFragment.newInstance();
|
fragment = CanteensFragment.newInstance();
|
||||||
@@ -345,8 +381,8 @@ public class MainActivity extends AppCompatActivity
|
|||||||
findViewById(R.id.app_bar_include).setVisibility(View.VISIBLE);
|
findViewById(R.id.app_bar_include).setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fragmentPage = newFragment;
|
this.mFragmentPage = newFragment;
|
||||||
this.fragmentData = newData;
|
this.mFragmentData = newData;
|
||||||
|
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
@@ -367,9 +403,9 @@ public class MainActivity extends AppCompatActivity
|
|||||||
|
|
||||||
private void setNavigationSelection() {
|
private void setNavigationSelection() {
|
||||||
MenuItem item;
|
MenuItem item;
|
||||||
switch (fragmentPage) {
|
switch (mFragmentPage) {
|
||||||
case FRAGMENT_MODULES_DETAILS:
|
case FRAGMENT_MODULES_DETAILS:
|
||||||
getKVV().modules().list().find(fragmentData, success -> {
|
getKVV().modules().list().find(mFragmentData, success -> {
|
||||||
int size = mNavigationView.getMenu().size();
|
int size = mNavigationView.getMenu().size();
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
String title = success == null ? null : success.title;
|
String title = success == null ? null : success.title;
|
||||||
@@ -391,7 +427,7 @@ public class MainActivity extends AppCompatActivity
|
|||||||
case FRAGMENT_CANTEENS_DETAILS:
|
case FRAGMENT_CANTEENS_DETAILS:
|
||||||
getCanteenBrowser().getCanteens(success -> {
|
getCanteenBrowser().getCanteens(success -> {
|
||||||
int size = mNavigationView.getMenu().size();
|
int size = mNavigationView.getMenu().size();
|
||||||
Canteen canteen = success.getCanteen(Integer.parseInt(fragmentData));
|
Canteen canteen = success.getCanteen(Integer.parseInt(mFragmentData));
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
String title = canteen == null ? null : canteen.getName();
|
String title = canteen == null ? null : canteen.getName();
|
||||||
for (int k = 0; k < size; k++) {
|
for (int k = 0; k < size; k++) {
|
||||||
|
|||||||
@@ -31,10 +31,12 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
|
|
||||||
// Parameters
|
// Parameters
|
||||||
private int mCanteenId;
|
private int mCanteenId;
|
||||||
|
private String mPageRestoreRequest = null;
|
||||||
|
|
||||||
private MainActivityListener mListener;
|
private MainActivityListener mListener;
|
||||||
private final Logger log = new Logger(this);
|
private final Logger log = new Logger(this);
|
||||||
private DaySwitcherAdapter adapterViewPager;
|
private DaySwitcherAdapter adapterViewPager;
|
||||||
|
private ViewPager mViewPager;
|
||||||
|
|
||||||
public DaySwitcherFragment() {
|
public DaySwitcherFragment() {
|
||||||
// Required empty public constructor
|
// Required empty public constructor
|
||||||
@@ -47,10 +49,14 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
* @param canteenId Canteen id in canteens list.
|
* @param canteenId Canteen id in canteens list.
|
||||||
* @return A new instance of fragment DaySwitcherFragment.
|
* @return A new instance of fragment DaySwitcherFragment.
|
||||||
*/
|
*/
|
||||||
public static Fragment newInstance(int canteenId) {
|
public static Fragment newInstance(String canteenId) {
|
||||||
DaySwitcherFragment fragment = new DaySwitcherFragment();
|
DaySwitcherFragment fragment = new DaySwitcherFragment();
|
||||||
Bundle args = new Bundle();
|
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);
|
fragment.setArguments(args);
|
||||||
return fragment;
|
return fragment;
|
||||||
}
|
}
|
||||||
@@ -59,7 +65,15 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
if (getArguments() != null) {
|
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) {
|
if (mListener != null) {
|
||||||
mListener.onTitleTextChange(R.string.canteens);
|
mListener.onTitleTextChange(R.string.canteens);
|
||||||
@@ -77,10 +91,10 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
// Inflate the layout for this fragment
|
// Inflate the layout for this fragment
|
||||||
View v = inflater.inflate(R.layout.fragment_mod_detail, container, false);
|
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());
|
adapterViewPager = new DaySwitcherAdapter(getChildFragmentManager());
|
||||||
mViewPager.setAdapter(adapterViewPager);
|
mViewPager.setAdapter(adapterViewPager);
|
||||||
|
applyPageRequest();
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
@@ -114,8 +128,10 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
Canteen canteen = canteens.getCanteen(mCanteenId);
|
Canteen canteen = canteens.getCanteen(mCanteenId);
|
||||||
canteen.cleanUpDays();
|
canteen.cleanUpDays();
|
||||||
adapterViewPager.setModule(canteen);
|
adapterViewPager.setModule(canteen);
|
||||||
|
applyPageRequest();
|
||||||
browser.getCanteen(canteen, success -> {
|
browser.getCanteen(canteen, success -> {
|
||||||
adapterViewPager.setModule();
|
adapterViewPager.setModule();
|
||||||
|
applyPageRequest();
|
||||||
if (callback != null)
|
if (callback != null)
|
||||||
callback.onResponse(success);
|
callback.onResponse(success);
|
||||||
}, error -> {
|
}, error -> {
|
||||||
@@ -136,4 +152,20 @@ public class DaySwitcherFragment extends Fragment implements DaySwitcherListener
|
|||||||
refresh(true, callback, errorCallback);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public class ModDetailFragment extends Fragment implements ModDetailListener {
|
|||||||
ModDetailFragment fragment = new ModDetailFragment();
|
ModDetailFragment fragment = new ModDetailFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
if (!itemPosition.contains("."))
|
if (!itemPosition.contains("."))
|
||||||
args.putString(ARG_POSITION, itemPosition+"."+0);
|
args.putString(ARG_POSITION, itemPosition+".0");
|
||||||
else
|
else
|
||||||
args.putString(ARG_POSITION, itemPosition);
|
args.putString(ARG_POSITION, itemPosition);
|
||||||
|
|
||||||
|
|||||||
@@ -81,4 +81,5 @@
|
|||||||
<string name="news">Neuigkeiten</string>
|
<string name="news">Neuigkeiten</string>
|
||||||
<string name="update_news">Update-News</string>
|
<string name="update_news">Update-News</string>
|
||||||
<string name="tricks">Tipps/Tricks</string>
|
<string name="tricks">Tipps/Tricks</string>
|
||||||
|
<string name="back_to_exit">Klicke ZURÜCK erneut zum Beenden!</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -89,4 +89,5 @@
|
|||||||
<string name="news">News</string>
|
<string name="news">News</string>
|
||||||
<string name="update_news">Update News</string>
|
<string name="update_news">Update News</string>
|
||||||
<string name="tricks">Tips/Tricks</string>
|
<string name="tricks">Tips/Tricks</string>
|
||||||
|
<string name="back_to_exit">Please click BACK again to exit!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user