diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java index ac9fd2eed1..67ff772573 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java @@ -8,8 +8,8 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; - import io.highfidelity.hifiinterface.fragment.LoginFragment; +import io.highfidelity.hifiinterface.fragment.OnBackPressedListener; import io.highfidelity.hifiinterface.fragment.SignupFragment; import io.highfidelity.hifiinterface.fragment.StartMenuFragment; @@ -105,8 +105,9 @@ public class LoginMenuActivity extends AppCompatActivity FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment fragment = SignupFragment.newInstance(); - fragmentTransaction.replace(R.id.content_frame, fragment); - fragmentTransaction.addToBackStack(fragment.toString()); + String tag = getString(R.string.tagFragmentSignup); + fragmentTransaction.replace(R.id.content_frame, fragment, tag); + fragmentTransaction.addToBackStack(tag); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); fragmentTransaction.commit(); hideStatusBar(); @@ -116,8 +117,9 @@ public class LoginMenuActivity extends AppCompatActivity FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment fragment = LoginFragment.newInstance(); - fragmentTransaction.replace(R.id.content_frame, fragment); - fragmentTransaction.addToBackStack(fragment.toString()); + String tag = getString(R.string.tagFragmentLogin); + fragmentTransaction.replace(R.id.content_frame, fragment, tag); + fragmentTransaction.addToBackStack(tag); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); fragmentTransaction.commit(); hideStatusBar(); @@ -167,7 +169,15 @@ public class LoginMenuActivity extends AppCompatActivity FragmentManager fm = getFragmentManager(); int index = fm.getBackStackEntryCount() - 1; if (index > 0) { - super.onBackPressed(); + FragmentManager.BackStackEntry backEntry = fm.getBackStackEntryAt(index); + String tag = backEntry.getName(); + Fragment topFragment = getFragmentManager().findFragmentByTag(tag); + if (topFragment instanceof OnBackPressedListener && + ((OnBackPressedListener) topFragment).doBack()) { + + } else { + super.onBackPressed(); + } } else if (finishOnBack){ finishAffinity(); } else { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java index 76cda847cb..d0e00867b8 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -148,11 +148,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On startActivity(new Intent(this, LoginMenuActivity.class)); } - private void loadSignupFragment() { - Fragment fragment = SignupFragment.newInstance(); - loadFragment(fragment, getString(R.string.signup), getString(R.string.tagFragmentSignup), true, false); - } - private void loadPrivacyPolicyFragment() { Fragment fragment = PolicyFragment.newInstance(); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java index 81493b1f65..ccd771c807 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/LoginFragment.java @@ -22,7 +22,8 @@ import io.highfidelity.hifiinterface.R; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationActive; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationInactive; -public class LoginFragment extends Fragment { +public class LoginFragment extends Fragment + implements OnBackPressedListener { private EditText mUsername; private EditText mPassword; @@ -31,6 +32,8 @@ public class LoginFragment extends Fragment { private ViewGroup mLoginForm; private ViewGroup mLoggingInFrame; private ViewGroup mLoggedInFrame; + private boolean mLoginInProgress; + private boolean mLoginSuccess; public native void login(String username, String password, Fragment usernameChangedListener); public native void cancelLogin(); @@ -142,6 +145,8 @@ public class LoginFragment extends Fragment { mLoginButton.setEnabled(false); hideError(); showActivityIndicator(); + mLoginInProgress = true; + mLoginSuccess = false; login(username, password, this); } } @@ -188,9 +193,11 @@ public class LoginFragment extends Fragment { } public void handleLoginCompleted(boolean success) { + mLoginInProgress = false; getActivity().runOnUiThread(() -> { mLoginButton.setEnabled(true); if (success) { + mLoginSuccess = true; showLoggedInMessage(); } else { showLoginForm(); @@ -199,6 +206,22 @@ public class LoginFragment extends Fragment { }); } + @Override + public boolean doBack() { + if (mLoginInProgress) { + cancelLogin(); + showLoginForm(); + mLoginInProgress = false; + mLoginButton.setEnabled(true); + return true; + } else if (mLoginSuccess) { + onGetStartedClicked(); + return true; + } else { + return false; + } + } + public interface OnLoginInteractionListener { void onLoginCompleted(); void onCancelLogin(); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/OnBackPressedListener.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/OnBackPressedListener.java new file mode 100644 index 0000000000..c160138cea --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/OnBackPressedListener.java @@ -0,0 +1,11 @@ +package io.highfidelity.hifiinterface.fragment; + +public interface OnBackPressedListener { + + /** + * Processes the back pressed event and returns true if it was managed by this Fragment + * @return + */ + boolean doBack(); + +} diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignupFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignupFragment.java index e0297bb9ab..e20a8dfb2d 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignupFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignupFragment.java @@ -20,7 +20,8 @@ import io.highfidelity.hifiinterface.R; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationActive; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationInactive; -public class SignupFragment extends Fragment { +public class SignupFragment extends Fragment + implements OnBackPressedListener { private EditText mEmail; private EditText mUsername; @@ -33,6 +34,10 @@ public class SignupFragment extends Fragment { private ViewGroup mLoggingInFrame; private ViewGroup mLoggedInFrame; + private boolean mLoginInProgress; + private boolean mSignupInProgress; + private boolean mSignupSuccess; + public native void signup(String email, String username, String password); // move to SignupFragment public native void cancelSignup(); public native void login(String username, String password); @@ -69,7 +74,7 @@ public class SignupFragment extends Fragment { mSignupButton.setOnClickListener(view -> signup()); - rootView.findViewById(R.id.getStarted).setOnClickListener(view -> onGetStartedPressed()); + rootView.findViewById(R.id.getStarted).setOnClickListener(view -> onGetStartedClicked()); mPassword.setOnEditorActionListener((textView, actionId, keyEvent) -> onPasswordEditorAction(textView, actionId, keyEvent)); @@ -135,6 +140,8 @@ public class SignupFragment extends Fragment { hideError(); mActivityText.setText(R.string.creating_account); showActivityIndicator(); + mSignupInProgress = true; + mSignupSuccess = false; signup(email, username, password); } } @@ -179,7 +186,7 @@ public class SignupFragment extends Fragment { void onCancelSignup(); } - private void onGetStartedPressed() { + private void onGetStartedClicked() { if (mListener != null) { mListener.onSignupCompleted(); } @@ -187,16 +194,18 @@ public class SignupFragment extends Fragment { public void handleSignupCompleted() { + mSignupInProgress = false; String username = mUsername.getText().toString().trim(); String password = mPassword.getText().toString(); getActivity().runOnUiThread(() -> { mActivityText.setText(R.string.logging_in); }); - + mLoginInProgress = true; login(username, password); } public void handleSignupFailed(String error) { + mSignupInProgress = false; getActivity().runOnUiThread(() -> { mSignupButton.setEnabled(true); showSignupForm(); @@ -206,9 +215,11 @@ public class SignupFragment extends Fragment { } public void handleLoginCompleted(boolean success) { + mLoginInProgress = false; getActivity().runOnUiThread(() -> { mSignupButton.setEnabled(true); if (success) { + mSignupSuccess = true; showLoggedInMessage(); } else { // Registration was successful but login failed. @@ -219,4 +230,25 @@ public class SignupFragment extends Fragment { }); } + @Override + public boolean doBack() { + if (mSignupInProgress) { + cancelSignup(); + } else if (mLoginInProgress) { + cancelLogin(); + } + + if (mSignupInProgress || mLoginInProgress) { + showSignupForm(); + mLoginInProgress = false; + mSignupInProgress = false; + mSignupButton.setEnabled(true); + return true; + } else if (mSignupSuccess) { + onGetStartedClicked(); + return true; + } else { + return false; + } + } }