Allow cancelling ongoing signup or login

This commit is contained in:
Gabriel Calero 2018-10-26 13:04:34 -03:00
parent 11d82e0ad0
commit 3d677d8e5a
5 changed files with 87 additions and 16 deletions

View file

@ -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 {

View file

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

View file

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

View file

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

View file

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