diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index ce5af01f29..ba956ba322 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -255,6 +255,16 @@ JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_fragment_HomeFragme return env->NewStringUTF(lastLocation.toString().toLatin1().data()); } +JNIEXPORT void JNICALL +Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeCancelLogin(JNIEnv *env, jobject instance) { + + auto accountManager = DependencyManager::get(); + + QObject::disconnect(accountManager.data(), &AccountManager::loginComplete, nullptr, nullptr); + QObject::disconnect(accountManager.data(), &AccountManager::loginFailed, nullptr, nullptr); + +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *env, jobject instance, jstring username_, jstring password_, @@ -273,17 +283,23 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en QObject::connect(accountManager.data(), &AccountManager::loginComplete, [](const QUrl& authURL) { jboolean jSuccess = (jboolean) true; - __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } }); QObject::connect(accountManager.data(), &AccountManager::loginFailed, []() { jboolean jSuccess = (jboolean) false; - __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } }); QObject::connect(accountManager.data(), &AccountManager::usernameChanged, [](const QString& username) { QAndroidJniObject string = QAndroidJniObject::fromString(username); - __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); + if (__usernameChangedListener.isValid()) { + __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); + } }); QMetaObject::invokeMethod(accountManager.data(), "requestAccessToken", 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 f29c237ed7..1a030baabf 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 @@ -4,6 +4,7 @@ import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -19,8 +20,13 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; +import org.qtproject.qt5.android.QtNative; + 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 { private EditText mUsername; @@ -32,6 +38,7 @@ public class LoginFragment extends Fragment { private ProgressDialog mDialog; public native void nativeLogin(String username, String password, Activity usernameChangedListener); + public native void nativeCancelLogin(); private LoginFragment.OnLoginInteractionListener mListener; @@ -125,10 +132,19 @@ public class LoginFragment extends Fragment { mListener = null; } + @Override + public void onResume() { + super.onResume(); + // This hack intends to keep Qt threads running even after the app comes from background + QtNative.setApplicationState(ApplicationActive); + } + @Override public void onStop() { super.onStop(); cancelActivityIndicator(); + // Leave the Qt app paused + QtNative.setApplicationState(ApplicationInactive); hideKeyboard(); } @@ -164,7 +180,15 @@ public class LoginFragment extends Fragment { mDialog = new ProgressDialog(getContext()); } mDialog.setMessage(getString(R.string.logging_in)); - mDialog.setCancelable(false); + mDialog.setCancelable(true); + mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + nativeCancelLogin(); + cancelActivityIndicator(); + mLoginButton.setEnabled(true); + } + }); mDialog.show(); }