From 11d82e0ad0f12ee25bffcd04febb8c9c6ac6e87b Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Thu, 25 Oct 2018 19:12:51 -0300 Subject: [PATCH] New login + signup --- android/app/src/main/AndroidManifest.xml | 4 + android/app/src/main/cpp/native.cpp | 66 ++-- .../highfidelity/hifiinterface/HifiUtils.java | 3 + .../hifiinterface/InterfaceActivity.java | 7 +- .../hifiinterface/LoginMenuActivity.java | 177 +++++++++ .../hifiinterface/MainActivity.java | 85 +--- .../hifiinterface/SplashActivity.java | 9 +- .../fragment/FriendsFragment.java | 2 - .../hifiinterface/fragment/LoginFragment.java | 121 +++--- .../fragment/SignedInFragment.java | 73 ---- .../fragment/SignupFragment.java | 121 +++--- .../fragment/StartMenuFragment.java | 85 ++++ .../drawable/encourage_login_background.jpg | Bin 0 -> 49513 bytes .../app/src/main/res/drawable/hifi_header.xml | 2 +- .../src/main/res/drawable/ic_right_arrow.xml | 11 + ...d_button.xml => rounded_button_color1.xml} | 0 .../res/drawable/rounded_button_color3.xml | 24 ++ .../src/main/res/drawable/rounded_edit.xml | 7 - .../res/layout/activity_encourage_login.xml | 14 + .../src/main/res/layout/fragment_login.xml | 369 ++++++++++++------ .../main/res/layout/fragment_login_menu.xml | 104 +++++ .../src/main/res/layout/fragment_signedin.xml | 63 --- .../src/main/res/layout/fragment_signup.xml | 253 ++++++++---- android/app/src/main/res/values/colors.xml | 1 + android/app/src/main/res/values/dimens.xml | 6 +- android/app/src/main/res/values/strings.xml | 13 +- 26 files changed, 1057 insertions(+), 563 deletions(-) create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java delete mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignedInFragment.java create mode 100644 android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java create mode 100644 android/app/src/main/res/drawable/encourage_login_background.jpg create mode 100644 android/app/src/main/res/drawable/ic_right_arrow.xml rename android/app/src/main/res/drawable/{rounded_button.xml => rounded_button_color1.xml} (100%) create mode 100644 android/app/src/main/res/drawable/rounded_button_color3.xml delete mode 100644 android/app/src/main/res/drawable/rounded_edit.xml create mode 100644 android/app/src/main/res/layout/activity_encourage_login.xml create mode 100644 android/app/src/main/res/layout/fragment_login_menu.xml delete mode 100644 android/app/src/main/res/layout/fragment_signedin.xml diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b216819ed0..57e708068f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -71,6 +71,10 @@ android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.Translucent.NoActionBar" /> + + (); @@ -269,17 +269,15 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeCancelLogin(JNIE } JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeCancelLogin(JNIEnv *env, +Java_io_highfidelity_hifiinterface_fragment_SignupFragment_cancelLogin(JNIEnv *env, jobject instance) { - Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeCancelLogin(env, instance); + Java_io_highfidelity_hifiinterface_fragment_LoginFragment_cancelLogin(env, instance); } - JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *env, jobject instance, - jstring username_, jstring password_, - jobject usernameChangedListener) { +Java_io_highfidelity_hifiinterface_fragment_LoginFragment_login(JNIEnv *env, jobject instance, + jstring username_, jstring password_) { const char *c_username = env->GetStringUTFChars(username_, 0); const char *c_password = env->GetStringUTFChars(password_, 0); QString username = QString(c_username); @@ -290,7 +288,6 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en auto accountManager = DependencyManager::get(); __loginCompletedListener = QAndroidJniObject(instance); - __usernameChangedListener = QAndroidJniObject(usernameChangedListener); QObject::connect(accountManager.data(), &AccountManager::loginComplete, [](const QUrl& authURL) { jboolean jSuccess = (jboolean) true; @@ -306,24 +303,16 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *en } }); - QObject::connect(accountManager.data(), &AccountManager::usernameChanged, [](const QString& username) { - QAndroidJniObject string = QAndroidJniObject::fromString(username); - if (__usernameChangedListener.isValid()) { - __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); - } - }); - QMetaObject::invokeMethod(accountManager.data(), "requestAccessToken", Q_ARG(const QString&, username), Q_ARG(const QString&, password)); } JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeLogin(JNIEnv *env, +Java_io_highfidelity_hifiinterface_fragment_SignupFragment_login(JNIEnv *env, jobject instance, jstring username_, - jstring password_, - jobject usernameChangedListener) { - Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(env, instance, username_, password_, usernameChangedListener); + jstring password_) { + Java_io_highfidelity_hifiinterface_fragment_LoginFragment_login(env, instance, username_, password_); } JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeInitAfterAppLoaded(JNIEnv* env, jobject obj) { @@ -331,7 +320,7 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeInitAf } JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeSignup(JNIEnv *env, jobject instance, +Java_io_highfidelity_hifiinterface_fragment_SignupFragment_signup(JNIEnv *env, jobject instance, jstring email_, jstring username_, jstring password_) { @@ -359,8 +348,6 @@ Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeSignup(JNIEnv * }); QObject::connect(&AndroidHelper::instance(), &AndroidHelper::handleSignupFailed, [](QString errorString) { - jboolean jSuccess = (jboolean) false; - jstring jError = QAndroidJniObject::fromString(errorString).object(); if (__signupCompletedListener.isValid()) { QAndroidJniObject string = QAndroidJniObject::fromString(errorString); __signupCompletedListener.callMethod("handleSignupFailed", "(Ljava/lang/String;)V", string.object()); @@ -371,19 +358,13 @@ Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeSignup(JNIEnv * } JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_fragment_SignupFragment_nativeCancelSignup(JNIEnv *env, jobject instance) { +Java_io_highfidelity_hifiinterface_fragment_SignupFragment_cancelSignup(JNIEnv *env, jobject instance) { QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::handleSignupCompleted, nullptr, nullptr); QObject::disconnect(&AndroidHelper::instance(), &AndroidHelper::handleSignupFailed, nullptr, nullptr); __signupCompletedListener = nullptr; } -JNIEXPORT jboolean JNICALL -Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeIsLoggedIn(JNIEnv *env, jobject instance) { - auto accountManager = DependencyManager::get(); - return accountManager->isLoggedIn(); -} - JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_fragment_FriendsFragment_nativeGetAccessToken(JNIEnv *env, jobject instance) { auto accountManager = DependencyManager::get(); @@ -407,22 +388,43 @@ Java_io_highfidelity_hifiinterface_SplashActivity_registerLoadCompleteListener(J } JNIEXPORT jboolean JNICALL -Java_io_highfidelity_hifiinterface_MainActivity_nativeIsLoggedIn(JNIEnv *env, jobject instance) { +Java_io_highfidelity_hifiinterface_HifiUtils_isUserLoggedIn(JNIEnv *env, jobject instance) { return DependencyManager::get()->isLoggedIn(); } JNIEXPORT void JNICALL -Java_io_highfidelity_hifiinterface_MainActivity_nativeLogout(JNIEnv *env, jobject instance) { +Java_io_highfidelity_hifiinterface_MainActivity_logout(JNIEnv *env, jobject instance) { DependencyManager::get()->logout(); } JNIEXPORT jstring JNICALL -Java_io_highfidelity_hifiinterface_MainActivity_nativeGetDisplayName(JNIEnv *env, +Java_io_highfidelity_hifiinterface_MainActivity_getUsername(JNIEnv *env, jobject instance) { QString username = DependencyManager::get()->getAccountInfo().getUsername(); return env->NewStringUTF(username.toLatin1().data()); } +JNIEXPORT void JNICALL +Java_io_highfidelity_hifiinterface_MainActivity_setUsernameChangedListener(JNIEnv *env, + jobject instance, + jobject usernameChangedListener) { + __usernameChangedListener = QAndroidJniObject(usernameChangedListener); + + if (!__usernameChangedListener.isValid()) { + return; + } + + auto accountManager = DependencyManager::get(); + + QObject::connect(accountManager.data(), &AccountManager::usernameChanged, [](const QString& username) { + QAndroidJniObject string = QAndroidJniObject::fromString(username); + if (__usernameChangedListener.isValid()) { + __usernameChangedListener.callMethod("handleUsernameChanged", "(Ljava/lang/String;)V", string.object()); + } + }); + +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeBeforeEnterBackground(JNIEnv *env, jobject obj) { AndroidHelper::instance().notifyBeforeEnterBackground(); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java b/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java index f92cd0a385..a35734b9d7 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/HifiUtils.java @@ -64,4 +64,7 @@ public class HifiUtils { public native String protocolVersionSignature(); + public native boolean isUserLoggedIn(); + + } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java index 90e411173b..5250d2582b 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -313,11 +313,10 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW break; case "Login": nativeBeforeEnterBackground(); - Intent loginIntent = new Intent(this, MainActivity.class); - loginIntent.putExtra(MainActivity.EXTRA_FRAGMENT, activityName); - loginIntent.putExtra(MainActivity.EXTRA_BACK_TO_SCENE, backToScene); + Intent loginIntent = new Intent(this, LoginMenuActivity.class); + loginIntent.putExtra(LoginMenuActivity.EXTRA_BACK_TO_SCENE, backToScene); if (args != null && args.containsKey(DOMAIN_URL)) { - loginIntent.putExtra(DOMAIN_URL, (String) args.get(DOMAIN_URL)); + loginIntent.putExtra(LoginMenuActivity.EXTRA_DOMAIN_URL, (String) args.get(DOMAIN_URL)); } startActivity(loginIntent); break; diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java new file mode 100644 index 0000000000..ac9fd2eed1 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java @@ -0,0 +1,177 @@ +package io.highfidelity.hifiinterface; + + +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +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.SignupFragment; +import io.highfidelity.hifiinterface.fragment.StartMenuFragment; + +public class LoginMenuActivity extends AppCompatActivity + implements StartMenuFragment.StartMenuInteractionListener, + LoginFragment.OnLoginInteractionListener, + SignupFragment.OnSignupInteractionListener { + + public static final String EXTRA_FINISH_ON_BACK = "finishOnBack"; + public static final String EXTRA_BACK_TO_SCENE = "backToScene"; + public static final String EXTRA_DOMAIN_URL = "url"; + + private boolean finishOnBack; + private boolean backToScene; + private String domainUrlToBack; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_encourage_login); + + finishOnBack = getIntent().getBooleanExtra(EXTRA_FINISH_ON_BACK, false); + backToScene = getIntent().getBooleanExtra(EXTRA_BACK_TO_SCENE, false); + domainUrlToBack = getIntent().getStringExtra(EXTRA_DOMAIN_URL); + + if (savedInstanceState != null) { + finishOnBack = savedInstanceState.getBoolean(EXTRA_FINISH_ON_BACK, false); + backToScene = savedInstanceState.getBoolean(EXTRA_BACK_TO_SCENE, false); + domainUrlToBack = savedInstanceState.getString(EXTRA_DOMAIN_URL); + } + + loadMenuFragment(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(EXTRA_FINISH_ON_BACK, finishOnBack); + outState.putBoolean(EXTRA_BACK_TO_SCENE, backToScene); + outState.putString(EXTRA_DOMAIN_URL, domainUrlToBack); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + finishOnBack = savedInstanceState.getBoolean(EXTRA_FINISH_ON_BACK, false); + backToScene = savedInstanceState.getBoolean(EXTRA_BACK_TO_SCENE, false); + domainUrlToBack = savedInstanceState.getString(EXTRA_DOMAIN_URL); + } + + private void loadMenuFragment() { + FragmentManager fragmentManager = getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + Fragment fragment = StartMenuFragment.newInstance(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(fragment.toString()); + fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + fragmentTransaction.commit(); + hideStatusBar(); + } + + @Override + protected void onResume() { + super.onResume(); + hideStatusBar(); + } + + private void hideStatusBar() { + View decorView = getWindow().getDecorView(); + // Hide the status bar. + int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + decorView.setSystemUiVisibility(uiOptions); + } + + @Override + public void onSignupButtonClicked() { + loadSignupFragment(); + } + + @Override + public void onLoginButtonClicked() { + loadLoginFragment(); + } + + @Override + public void onSkipLoginClicked() { + loadMainActivity(); + } + + + private void loadSignupFragment() { + FragmentManager fragmentManager = getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + Fragment fragment = SignupFragment.newInstance(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(fragment.toString()); + fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + fragmentTransaction.commit(); + hideStatusBar(); + } + + private void loadLoginFragment() { + FragmentManager fragmentManager = getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + Fragment fragment = LoginFragment.newInstance(); + fragmentTransaction.replace(R.id.content_frame, fragment); + fragmentTransaction.addToBackStack(fragment.toString()); + fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + fragmentTransaction.commit(); + hideStatusBar(); + } + + @Override + public void onLoginCompleted() { + loadMainActivity(); + } + + @Override + public void onCancelLogin() { + getFragmentManager().popBackStack(); + } + + @Override + public void onCancelSignup() { + getFragmentManager().popBackStack(); + } + + private void loadMainActivity() { + finish(); + if (backToScene) { + backToScene = false; + goToDomain(domainUrlToBack != null? domainUrlToBack : ""); + } else { + startActivity(new Intent(this, MainActivity.class)); + } + } + + private void goToDomain(String domainUrl) { + Intent intent = new Intent(this, InterfaceActivity.class); + intent.putExtra(InterfaceActivity.DOMAIN_URL, domainUrl); + finish(); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + } + + + @Override + public void onSignupCompleted() { + loadMainActivity(); + } + + @Override + public void onBackPressed() { + FragmentManager fm = getFragmentManager(); + int index = fm.getBackStackEntryCount() - 1; + if (index > 0) { + super.onBackPressed(); + } else if (finishOnBack){ + finishAffinity(); + } else { + finish(); + } + } +} 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 7df04100b0..76cda847cb 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/MainActivity.java @@ -1,5 +1,6 @@ package io.highfidelity.hifiinterface; +import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; @@ -29,23 +30,16 @@ import android.widget.TextView; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; -import java.util.HashMap; -import java.util.Map; - import io.highfidelity.hifiinterface.fragment.FriendsFragment; import io.highfidelity.hifiinterface.fragment.HomeFragment; -import io.highfidelity.hifiinterface.fragment.LoginFragment; import io.highfidelity.hifiinterface.fragment.PolicyFragment; import io.highfidelity.hifiinterface.fragment.SettingsFragment; -import io.highfidelity.hifiinterface.fragment.SignedInFragment; -import io.highfidelity.hifiinterface.fragment.SignupFragment;import io.highfidelity.hifiinterface.task.DownloadProfileImageTask; +import io.highfidelity.hifiinterface.fragment.SignupFragment; +import io.highfidelity.hifiinterface.task.DownloadProfileImageTask; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, - LoginFragment.OnLoginInteractionListener, HomeFragment.OnHomeInteractionListener, - FriendsFragment.OnHomeInteractionListener, - SignupFragment.OnSignupInteractionListener, - SignedInFragment.OnSignedInInteractionListener { + FriendsFragment.OnHomeInteractionListener { private static final int PROFILE_PICTURE_PLACEHOLDER = R.drawable.default_profile_avatar; public static final String DEFAULT_FRAGMENT = "Home"; @@ -55,9 +49,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private String TAG = "HighFidelity"; - public native boolean nativeIsLoggedIn(); - public native void nativeLogout(); - public native String nativeGetDisplayName(); + public native void logout(); + public native void setUsernameChangedListener(Activity usernameChangedListener); + public native String getUsername(); private DrawerLayout mDrawerLayout; private NavigationView mNavigationView; @@ -130,9 +124,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void loadFragment(String fragment) { switch (fragment) { - case "Login": - loadLoginFragment(); - break; case "Home": loadHomeFragment(true); break; @@ -153,14 +144,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On loadFragment(fragment, getString(R.string.home), getString(R.string.tagFragmentHome), addToBackStack, true); } - private void loadLoginFragment() { - Fragment fragment = LoginFragment.newInstance(); - loadFragment(fragment, getString(R.string.login), getString(R.string.tagFragmentLogin), true, true); - } - - private void loadSignedInFragment() { - Fragment fragment = SignedInFragment.newInstance(); - loadFragment(fragment, getString(R.string.welcome), getString(R.string.tagFragmentSignedIn), true, true); + private void startLoginMenuActivity() { + startActivity(new Intent(this, LoginMenuActivity.class)); } private void loadSignupFragment() { @@ -223,7 +208,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On private void updateLoginMenu() { - if (nativeIsLoggedIn()) { + if (HifiUtils.getInstance().isUserLoggedIn()) { mLoginPanel.setVisibility(View.GONE); mProfilePanel.setVisibility(View.VISIBLE); mLogoutOption.setVisibility(View.VISIBLE); @@ -239,7 +224,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On } private void updateProfileHeader() { - updateProfileHeader(nativeGetDisplayName()); + updateProfileHeader(getUsername()); } private void updateProfileHeader(String username) { if (!username.isEmpty()) { @@ -289,15 +274,22 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On @Override protected void onStart() { super.onStart(); + setUsernameChangedListener(this); updateLoginMenu(); } + @Override + protected void onStop() { + super.onStop(); + setUsernameChangedListener(null); + } + public void onLoginClicked(View view) { - loadLoginFragment(); + startLoginMenuActivity(); } public void onLogoutClicked(View view) { - nativeLogout(); + logout(); updateLoginMenu(); exitLoggedInFragment(); @@ -338,42 +330,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On startActivity(intent); } - @Override - public void onLoginCompleted() { - loadHomeFragment(false); - updateLoginMenu(); - if (backToScene) { - backToScene = false; - goToLastLocation(); - } - } - - @Override - public void onGettingStarted() { - loadHomeFragment(false); - if (backToScene) { - backToScene = false; - goToLastLocation(); - } - } - - @Override - public void onLoginRequested() { - // go back from signup to login - onBackPressed(); - } - - @Override - public void onSignupRequested() { - loadSignupFragment(); - } - - @Override - public void onSignupCompleted() { - loadSignedInFragment(); - updateLoginMenu(); - } - public void handleUsernameChanged(String username) { runOnUiThread(() -> updateProfileHeader(username)); } @@ -418,7 +374,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On public void onBackPressed() { // if a fragment needs to internally manage back presses.. FragmentManager fm = getFragmentManager(); - Log.d("[BACK]", "getBackStackEntryCount " + fm.getBackStackEntryCount()); Fragment friendsFragment = fm.findFragmentByTag(getString(R.string.tagFragmentPeople)); if (friendsFragment != null && friendsFragment instanceof FriendsFragment) { if (((FriendsFragment) friendsFragment).onBackPressed()) { diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/SplashActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/SplashActivity.java index e0aa967aaa..bb42467ace 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/SplashActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/SplashActivity.java @@ -3,7 +3,6 @@ package io.highfidelity.hifiinterface; import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.os.Handler; import android.view.View; public class SplashActivity extends Activity { @@ -37,7 +36,13 @@ public class SplashActivity extends Activity { } public void onAppLoadedComplete() { - startActivity(new Intent(this, MainActivity.class)); + if (HifiUtils.getInstance().isUserLoggedIn()) { + startActivity(new Intent(this, MainActivity.class)); + } else { + Intent menuIntent = new Intent(this, LoginMenuActivity.class); + menuIntent.putExtra(LoginMenuActivity.EXTRA_FINISH_ON_BACK, true); + startActivity(menuIntent); + } SplashActivity.this.finish(); } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java index 2475c4d887..e19a9c5a7a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/FriendsFragment.java @@ -23,8 +23,6 @@ import io.highfidelity.hifiinterface.view.UserListAdapter; public class FriendsFragment extends Fragment { - public native boolean nativeIsLoggedIn(); - public native String nativeGetAccessToken(); private RecyclerView mUsersView; 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 f22e5cd6bb..81493b1f65 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 @@ -1,13 +1,11 @@ package io.highfidelity.hifiinterface.fragment; -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; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,14 +27,13 @@ public class LoginFragment extends Fragment { private EditText mUsername; private EditText mPassword; private TextView mError; - private TextView mForgotPassword; - private TextView mSignup; private Button mLoginButton; + private ViewGroup mLoginForm; + private ViewGroup mLoggingInFrame; + private ViewGroup mLoggedInFrame; - private ProgressDialog mDialog; - - public native void nativeLogin(String username, String password, Activity usernameChangedListener); - public native void nativeCancelLogin(); + public native void login(String username, String password, Fragment usernameChangedListener); + public native void cancelLogin(); private LoginFragment.OnLoginInteractionListener mListener; @@ -58,22 +55,21 @@ public class LoginFragment extends Fragment { mPassword = rootView.findViewById(R.id.password); mError = rootView.findViewById(R.id.error); mLoginButton = rootView.findViewById(R.id.loginButton); - mForgotPassword = rootView.findViewById(R.id.forgotPassword); - mSignup = rootView.findViewById(R.id.signupButton); + mLoginForm = rootView.findViewById(R.id.loginForm); + mLoggingInFrame = rootView.findViewById(R.id.loggingInFrame); + mLoggedInFrame = rootView.findViewById(R.id.loggedInFrame); - mLoginButton.setOnClickListener(view -> login()); + rootView.findViewById(R.id.forgotPassword).setOnClickListener(view -> onForgotPasswordClicked()); - mForgotPassword.setOnClickListener(view -> forgotPassword()); - mSignup.setOnClickListener(view -> signup()); + rootView.findViewById(R.id.cancel).setOnClickListener(view -> onCancelLogin()); + + rootView.findViewById(R.id.getStarted).setOnClickListener(view -> onGetStartedClicked()); + + mLoginButton.setOnClickListener(view -> onLoginButtonClicked()); + + rootView.findViewById(R.id.takeMeInWorld).setOnClickListener(view -> skipLogin()); + mPassword.setOnEditorActionListener((textView, actionId, keyEvent) -> onPasswordEditorAction(textView, actionId, keyEvent)); - mPassword.setOnEditorActionListener( - (textView, actionId, keyEvent) -> { - if (actionId == EditorInfo.IME_ACTION_DONE) { - mLoginButton.performClick(); - return true; - } - return false; - }); return rootView; } @@ -104,13 +100,39 @@ public class LoginFragment extends Fragment { @Override public void onStop() { super.onStop(); - cancelActivityIndicator(); + showLoginForm(); // Leave the Qt app paused QtNative.setApplicationState(ApplicationInactive); hideKeyboard(); } - public void login() { + private void onCancelLogin() { + if (mListener != null) { + mListener.onCancelLogin(); + } + } + + private boolean onPasswordEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + mLoginButton.performClick(); + return true; + } + return false; + } + + private void skipLogin() { + if (mListener != null) { + mListener.onSkipLoginClicked(); + } + } + + private void onGetStartedClicked() { + if (mListener != null) { + mListener.onLoginCompleted(); + } + } + + public void onLoginButtonClicked() { String username = mUsername.getText().toString().trim(); String password = mPassword.getText().toString(); hideKeyboard(); @@ -120,13 +142,7 @@ public class LoginFragment extends Fragment { mLoginButton.setEnabled(false); hideError(); showActivityIndicator(); - nativeLogin(username, password, getActivity()); - } - } - - public void signup() { - if (mListener != null) { - mListener.onSignupRequested(); + login(username, password, this); } } @@ -138,33 +154,29 @@ public class LoginFragment extends Fragment { } } - private void forgotPassword() { + private void onForgotPasswordClicked() { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://highfidelity.com/users/password/new")); startActivity(intent); } private void showActivityIndicator() { - if (mDialog == null) { - mDialog = new ProgressDialog(getContext()); - } - mDialog.setMessage(getString(R.string.logging_in)); - mDialog.setCancelable(true); - mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialogInterface) { - nativeCancelLogin(); - cancelActivityIndicator(); - mLoginButton.setEnabled(true); - } - }); - mDialog.show(); + mLoginForm.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.GONE); + mLoggingInFrame.setVisibility(View.VISIBLE); } - private void cancelActivityIndicator() { - if (mDialog != null) { - mDialog.cancel(); - } + private void showLoginForm() { + mLoggingInFrame.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.GONE); + mLoginForm.setVisibility(View.VISIBLE); } + + private void showLoggedInMessage() { + mLoginForm.setVisibility(View.GONE); + mLoggingInFrame.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.VISIBLE); + } + private void showError(String error) { mError.setText(error); mError.setVisibility(View.VISIBLE); @@ -178,12 +190,10 @@ public class LoginFragment extends Fragment { public void handleLoginCompleted(boolean success) { getActivity().runOnUiThread(() -> { mLoginButton.setEnabled(true); - cancelActivityIndicator(); if (success) { - if (mListener != null) { - mListener.onLoginCompleted(); - } + showLoggedInMessage(); } else { + showLoginForm(); showError(getString(R.string.login_username_or_password_incorrect)); } }); @@ -191,7 +201,8 @@ public class LoginFragment extends Fragment { public interface OnLoginInteractionListener { void onLoginCompleted(); - void onSignupRequested(); + void onCancelLogin(); + void onSkipLoginClicked(); } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignedInFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignedInFragment.java deleted file mode 100644 index 9ed2f1c7f5..0000000000 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/SignedInFragment.java +++ /dev/null @@ -1,73 +0,0 @@ -package io.highfidelity.hifiinterface.fragment; - -import android.app.Fragment; -import android.content.Context; -import android.os.Bundle; -import android.text.Html; -import android.text.Spanned; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; - -import java.io.IOException; -import java.io.InputStream; - -import io.highfidelity.hifiinterface.R; - -public class SignedInFragment extends Fragment { - - private Button mGetStartedButton; - private OnSignedInInteractionListener mListener; - - public SignedInFragment() { - // Required empty public constructor - } - - public static SignedInFragment newInstance() { - SignedInFragment fragment = new SignedInFragment(); - return fragment; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_signedin, container, false); - mGetStartedButton = rootView.findViewById(R.id.getStarted); - - mGetStartedButton.setOnClickListener(view -> { - getStarted(); - }); - - return rootView; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof SignedInFragment.OnSignedInInteractionListener) { - mListener = (SignedInFragment.OnSignedInInteractionListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnSignedInInteractionListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - - public void getStarted() { - if (mListener != null) { - mListener.onGettingStarted(); - } - } - - public interface OnSignedInInteractionListener { - void onGettingStarted(); - } - -} 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 33644e5bda..e0297bb9ab 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 @@ -1,10 +1,9 @@ package io.highfidelity.hifiinterface.fragment; -import android.app.Activity; import android.app.Fragment; -import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,16 +26,17 @@ public class SignupFragment extends Fragment { private EditText mUsername; private EditText mPassword; private TextView mError; - private TextView mCancelButton; - + private TextView mActivityText; private Button mSignupButton; - private ProgressDialog mDialog; + private ViewGroup mSignupForm; + private ViewGroup mLoggingInFrame; + private ViewGroup mLoggedInFrame; - public native void nativeSignup(String email, String username, String password); // move to SignupFragment - public native void nativeCancelSignup(); - public native void nativeLogin(String username, String password, Activity usernameChangedListener); - public native void nativeCancelLogin(); + 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); + public native void cancelLogin(); private SignupFragment.OnSignupInteractionListener mListener; @@ -59,18 +59,20 @@ public class SignupFragment extends Fragment { mPassword = rootView.findViewById(R.id.password); mError = rootView.findViewById(R.id.error); mSignupButton = rootView.findViewById(R.id.signupButton); - mCancelButton = rootView.findViewById(R.id.cancelButton); + mActivityText = rootView.findViewById(R.id.activityText); + + mSignupForm = rootView.findViewById(R.id.signupForm); + mLoggedInFrame = rootView.findViewById(R.id.loggedInFrame); + mLoggingInFrame = rootView.findViewById(R.id.loggingInFrame); + + rootView.findViewById(R.id.cancel).setOnClickListener(view -> onCancelSignup()); mSignupButton.setOnClickListener(view -> signup()); - mCancelButton.setOnClickListener(view -> login()); - mPassword.setOnEditorActionListener( - (textView, actionId, keyEvent) -> { - if (actionId == EditorInfo.IME_ACTION_DONE) { - mSignupButton.performClick(); - return true; - } - return false; - }); + + rootView.findViewById(R.id.getStarted).setOnClickListener(view -> onGetStartedPressed()); + + mPassword.setOnEditorActionListener((textView, actionId, keyEvent) -> onPasswordEditorAction(textView, actionId, keyEvent)); + return rootView; } @@ -101,15 +103,23 @@ public class SignupFragment extends Fragment { @Override public void onStop() { super.onStop(); - cancelActivityIndicator(); + showSignupForm(); // Leave the Qt app paused QtNative.setApplicationState(ApplicationInactive); hideKeyboard(); } - private void login() { + private boolean onPasswordEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + mSignupButton.performClick(); + return true; + } + return false; + } + + private void onCancelSignup() { if (mListener != null) { - mListener.onLoginRequested(); + mListener.onCancelSignup(); } } @@ -123,8 +133,9 @@ public class SignupFragment extends Fragment { } else { mSignupButton.setEnabled(false); hideError(); + mActivityText.setText(R.string.creating_account); showActivityIndicator(); - nativeSignup(email, username, password); + signup(email, username, password); } } @@ -137,23 +148,21 @@ public class SignupFragment extends Fragment { } private void showActivityIndicator() { - if (mDialog == null) { - mDialog = new ProgressDialog(getContext()); - } - mDialog.setMessage(getString(R.string.creating_account)); - mDialog.setCancelable(true); - mDialog.setOnCancelListener(dialogInterface -> { - nativeCancelSignup(); - cancelActivityIndicator(); - mSignupButton.setEnabled(true); - }); - mDialog.show(); + mSignupForm.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.GONE); + mLoggingInFrame.setVisibility(View.VISIBLE); } - private void cancelActivityIndicator() { - if (mDialog != null) { - mDialog.cancel(); - } + private void showLoggedInMessage() { + mSignupForm.setVisibility(View.GONE); + mLoggingInFrame.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.VISIBLE); + } + + private void showSignupForm() { + mLoggingInFrame.setVisibility(View.GONE); + mLoggedInFrame.setVisibility(View.GONE); + mSignupForm.setVisibility(View.VISIBLE); } private void showError(String error) { mError.setText(error); @@ -167,29 +176,30 @@ public class SignupFragment extends Fragment { public interface OnSignupInteractionListener { void onSignupCompleted(); - void onLoginRequested(); + void onCancelSignup(); } + private void onGetStartedPressed() { + if (mListener != null) { + mListener.onSignupCompleted(); + } + } + + public void handleSignupCompleted() { String username = mUsername.getText().toString().trim(); String password = mPassword.getText().toString(); - mDialog.setMessage(getString(R.string.logging_in)); - mDialog.setCancelable(true); - mDialog.setOnCancelListener(dialogInterface -> { - nativeCancelLogin(); - cancelActivityIndicator(); - if (mListener != null) { - mListener.onLoginRequested(); - } + getActivity().runOnUiThread(() -> { + mActivityText.setText(R.string.logging_in); }); - mDialog.show(); - nativeLogin(username, password, getActivity()); + + login(username, password); } public void handleSignupFailed(String error) { getActivity().runOnUiThread(() -> { mSignupButton.setEnabled(true); - cancelActivityIndicator(); + showSignupForm(); mError.setText(error); mError.setVisibility(View.VISIBLE); }); @@ -198,20 +208,15 @@ public class SignupFragment extends Fragment { public void handleLoginCompleted(boolean success) { getActivity().runOnUiThread(() -> { mSignupButton.setEnabled(true); - cancelActivityIndicator(); - if (success) { - if (mListener != null) { - mListener.onSignupCompleted(); - } + showLoggedInMessage(); } else { // Registration was successful but login failed. // Let the user to login manually - mListener.onLoginRequested(); + mListener.onCancelSignup(); + showSignupForm(); } }); } - - } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java new file mode 100644 index 0000000000..22614fa300 --- /dev/null +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java @@ -0,0 +1,85 @@ +package io.highfidelity.hifiinterface.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import io.highfidelity.hifiinterface.R; + +public class StartMenuFragment extends Fragment { + + private StartMenuInteractionListener mListener; + + public StartMenuFragment() { + // Required empty public constructor + } + + public static StartMenuFragment newInstance() { + StartMenuFragment fragment = new StartMenuFragment(); + return fragment; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View rootView = inflater.inflate(R.layout.fragment_login_menu, container, false); + rootView.findViewById(R.id.signupButton).setOnClickListener(view -> { + if (mListener != null) { + mListener.onSignupButtonClicked(); + } + }); + + rootView.findViewById(R.id.loginButton).setOnClickListener(view -> { + if (mListener != null) { + mListener.onLoginButtonClicked(); + } + }); + + rootView.findViewById(R.id.takeMeInWorld).setOnClickListener(view -> { + if (mListener != null) { + mListener.onSkipLoginClicked(); + } + }); + + + + return rootView; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof StartMenuInteractionListener) { + mListener = (StartMenuInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement StartMenuInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface StartMenuInteractionListener { + void onSignupButtonClicked(); + void onLoginButtonClicked(); + void onSkipLoginClicked(); + } +} diff --git a/android/app/src/main/res/drawable/encourage_login_background.jpg b/android/app/src/main/res/drawable/encourage_login_background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5382880c3ee52920bddcce22dfd72d271dbf5c2d GIT binary patch literal 49513 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%0A*U_dU(PQr$WN`; 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 diff --git a/android/app/src/main/res/drawable/ic_right_arrow.xml b/android/app/src/main/res/drawable/ic_right_arrow.xml new file mode 100644 index 0000000000..e35d1a2733 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_right_arrow.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/rounded_button.xml b/android/app/src/main/res/drawable/rounded_button_color1.xml similarity index 100% rename from android/app/src/main/res/drawable/rounded_button.xml rename to android/app/src/main/res/drawable/rounded_button_color1.xml diff --git a/android/app/src/main/res/drawable/rounded_button_color3.xml b/android/app/src/main/res/drawable/rounded_button_color3.xml new file mode 100644 index 0000000000..6230885b30 --- /dev/null +++ b/android/app/src/main/res/drawable/rounded_button_color3.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/rounded_edit.xml b/android/app/src/main/res/drawable/rounded_edit.xml deleted file mode 100644 index 3c1cac4d1d..0000000000 --- a/android/app/src/main/res/drawable/rounded_edit.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_encourage_login.xml b/android/app/src/main/res/layout/activity_encourage_login.xml new file mode 100644 index 0000000000..d7c9ff6b4d --- /dev/null +++ b/android/app/src/main/res/layout/activity_encourage_login.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_login.xml b/android/app/src/main/res/layout/fragment_login.xml index 6933ad1eb5..2f48424ae8 100644 --- a/android/app/src/main/res/layout/fragment_login.xml +++ b/android/app/src/main/res/layout/fragment_login.xml @@ -6,6 +6,17 @@ android:layout_height="match_parent" android:background="@color/backgroundLight"> + + + + - - - - - - - - - -