From 160e633af56e686ed8fe167d88a5c14203d85078 Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 2 Nov 2018 17:08:19 -0300 Subject: [PATCH] Implement login through oauth for steam login button --- android/app/build.gradle | 6 ++ android/app/src/main/cpp/native.cpp | 46 +++++++++ .../hifiinterface/InterfaceActivity.java | 9 ++ .../hifiinterface/LoginMenuActivity.java | 10 +- .../hifiinterface/WebViewActivity.java | 23 ++++- .../hifiinterface/fragment/LoginFragment.java | 97 ++++++++++++++++++- .../fragment/StartMenuFragment.java | 10 +- .../fragment/WebViewFragment.java | 26 +++++ .../app/src/main/res/drawable/ic_steam.xml | 11 +++ .../res/drawable/rounded_button_color4.xml | 24 +++++ .../src/main/res/layout/fragment_login.xml | 2 +- .../main/res/layout/fragment_login_menu.xml | 18 ++++ android/app/src/main/res/values/colors.xml | 1 + android/app/src/main/res/values/strings.xml | 2 + libraries/networking/src/AccountManager.cpp | 24 +++++ libraries/networking/src/AccountManager.h | 1 + 16 files changed, 298 insertions(+), 12 deletions(-) create mode 100644 android/app/src/main/res/drawable/ic_steam.xml create mode 100644 android/app/src/main/res/drawable/rounded_button_color4.xml diff --git a/android/app/build.gradle b/android/app/build.gradle index 76f5acfaea..91ab54cf22 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -53,6 +53,9 @@ android { debug { buildConfigField "String", "BACKTRACE_URL", "\"" + (System.getenv("CMAKE_BACKTRACE_URL") ? System.getenv("CMAKE_BACKTRACE_URL") : '') + "\"" buildConfigField "String", "BACKTRACE_TOKEN", "\"" + (System.getenv("CMAKE_BACKTRACE_TOKEN") ? System.getenv("CMAKE_BACKTRACE_TOKEN") : '') + "\"" + buildConfigField "String", "OAUTH_CLIENT_ID", "\"" + (System.getenv("OAUTH_CLIENT_ID") ? System.getenv("OAUTH_CLIENT_ID") : '') + "\"" + buildConfigField "String", "OAUTH_CLIENT_SECRET", "\"" + (System.getenv("OAUTH_CLIENT_SECRET") ? System.getenv("OAUTH_CLIENT_SECRET") : '') + "\"" + buildConfigField "String", "OAUTH_REDIRECT_URI", "\"" + (System.getenv("OAUTH_REDIRECT_URI") ? System.getenv("OAUTH_REDIRECT_URI") : '') + "\"" } release { minifyEnabled false @@ -63,6 +66,9 @@ android { project.hasProperty("HIFI_ANDROID_KEY_PASSWORD")? signingConfigs.release : null buildConfigField "String", "BACKTRACE_URL", "\"" + (System.getenv("CMAKE_BACKTRACE_URL") ? System.getenv("CMAKE_BACKTRACE_URL") : '') + "\"" buildConfigField "String", "BACKTRACE_TOKEN", "\"" + (System.getenv("CMAKE_BACKTRACE_TOKEN") ? System.getenv("CMAKE_BACKTRACE_TOKEN") : '') + "\"" + buildConfigField "String", "OAUTH_CLIENT_ID", "\"" + (System.getenv("OAUTH_CLIENT_ID") ? System.getenv("OAUTH_CLIENT_ID") : '') + "\"" + buildConfigField "String", "OAUTH_CLIENT_SECRET", "\"" + (System.getenv("OAUTH_CLIENT_SECRET") ? System.getenv("OAUTH_CLIENT_SECRET") : '') + "\"" + buildConfigField "String", "OAUTH_REDIRECT_URI", "\"" + (System.getenv("OAUTH_REDIRECT_URI") ? System.getenv("OAUTH_REDIRECT_URI") : '') + "\"" } } diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 63e116abcc..4d60912831 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -363,6 +363,52 @@ Java_io_highfidelity_hifiinterface_fragment_LoginFragment_login(JNIEnv *env, job Q_ARG(const QString&, username), Q_ARG(const QString&, password)); } +JNIEXPORT void JNICALL +Java_io_highfidelity_hifiinterface_fragment_LoginFragment_retrieveAccessToken(JNIEnv *env, + jobject instance, + jstring authCode_, + jstring clientId_, + jstring clientSecret_, + jstring redirectUri_) { + const char *c_authCode = env->GetStringUTFChars(authCode_, 0); + const char *c_clientId = env->GetStringUTFChars(clientId_, 0); + const char *c_clientSecret = env->GetStringUTFChars(clientSecret_, 0); + const char *c_redirectUri = env->GetStringUTFChars(redirectUri_, 0); + + QString authCode = QString(c_authCode); + QString clientId = QString(c_clientId); + QString clientSecret = QString(c_clientSecret); + QString redirectUri = QString(c_redirectUri); + + env->ReleaseStringUTFChars(authCode_, c_authCode); + env->ReleaseStringUTFChars(clientId_, c_clientId); + env->ReleaseStringUTFChars(clientSecret_, c_clientSecret); + env->ReleaseStringUTFChars(redirectUri_, c_redirectUri); + + auto accountManager = DependencyManager::get(); + + __loginCompletedListener = QAndroidJniObject(instance); // TODO: use a different listener? + + QObject::connect(accountManager.data(), &AccountManager::loginComplete, [](const QUrl& authURL) { + jboolean jSuccess = (jboolean) true; + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } + }); + + QObject::connect(accountManager.data(), &AccountManager::loginFailed, []() { + jboolean jSuccess = (jboolean) false; + if (__loginCompletedListener.isValid()) { + __loginCompletedListener.callMethod("handleLoginCompleted", "(Z)V", jSuccess); + } + }); + + QMetaObject::invokeMethod(accountManager.data(), "requestAccessTokenWithAuthCode", + Q_ARG(const QString&, authCode), Q_ARG(const QString&, clientId), + Q_ARG(const QString&, clientSecret), Q_ARG(const QString&, redirectUri)); + +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_fragment_SignupFragment_login(JNIEnv *env, jobject instance, 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 5250d2582b..7db158a100 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/InterfaceActivity.java @@ -142,6 +142,12 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); webSlidingDrawer = (SlidingDrawer) inflater.inflate(R.layout.web_drawer, mainLayout, false); QtLayout qtLayout = (QtLayout) mainLayout.getChildAt(0); + if (qtLayout == null) { + Log.d("[QTLAYOUT-NULL]" , "Mainlayout children: " + mainLayout.getChildCount()); + for (int i=0; i< mainLayout.getChildCount(); i++) { + Log.d("[QTLAYOUT-NULL]" , "Child " + i + ": " + mainLayout.getChildAt(i)); + } + } QtLayout.LayoutParams layoutParams = new QtLayout.LayoutParams(webSlidingDrawer.getLayoutParams()); webSlidingDrawer.setOnDrawerCloseListener(() -> { WebViewFragment webViewFragment = (WebViewFragment) getFragmentManager().findFragmentByTag("webViewFragment"); @@ -380,4 +386,7 @@ public class InterfaceActivity extends QtActivity implements WebViewFragment.OnW public void onExpand() { keepInterfaceRunning = true; } + + @Override + public void onOAuthAuthorizeCallback(Uri uri) { } } 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 67ff772573..63f74ac3e2 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/LoginMenuActivity.java @@ -92,7 +92,7 @@ public class LoginMenuActivity extends AppCompatActivity @Override public void onLoginButtonClicked() { - loadLoginFragment(); + loadLoginFragment(false); } @Override @@ -100,6 +100,10 @@ public class LoginMenuActivity extends AppCompatActivity loadMainActivity(); } + @Override + public void onSteamLoginButtonClicked() { + loadLoginFragment(true); + } private void loadSignupFragment() { FragmentManager fragmentManager = getFragmentManager(); @@ -113,10 +117,10 @@ public class LoginMenuActivity extends AppCompatActivity hideStatusBar(); } - private void loadLoginFragment() { + private void loadLoginFragment(boolean useOauth) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - Fragment fragment = LoginFragment.newInstance(); + Fragment fragment = LoginFragment.newInstance(useOauth); String tag = getString(R.string.tagFragmentLogin); fragmentTransaction.replace(R.id.content_frame, fragment, tag); fragmentTransaction.addToBackStack(tag); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/WebViewActivity.java b/android/app/src/main/java/io/highfidelity/hifiinterface/WebViewActivity.java index 5d65bcad51..e906c4b734 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/WebViewActivity.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/WebViewActivity.java @@ -28,11 +28,18 @@ import java.net.MalformedURLException; import java.net.URL; import io.highfidelity.hifiinterface.fragment.WebViewFragment; +import io.highfidelity.hifiinterface.fragment.WebViewFragment.OnWebViewInteractionListener; -public class WebViewActivity extends Activity implements WebViewFragment.OnWebViewInteractionListener { +public class WebViewActivity extends Activity implements OnWebViewInteractionListener { public static final String WEB_VIEW_ACTIVITY_EXTRA_URL = "url"; + public static final String WEB_VIEW_ACTIVITY_EXTRA_CLEAR_COOKIES = "clear_cookies"; + public static final String RESULT_OAUTH_CODE = "code"; + public static final String RESULT_OAUTH_STATE = "state"; + private static final String FRAGMENT_TAG = "WebViewActivity_WebFragment"; + private static final String OAUTH_CODE = "code"; + private static final String OAUTH_STATE = "state"; private native void nativeProcessURL(String url); @@ -47,14 +54,15 @@ public class WebViewActivity extends Activity implements WebViewFragment.OnWebVi mActionBar = getActionBar(); mActionBar.setDisplayHomeAsUpEnabled(true); - loadWebViewFragment(getIntent().getStringExtra(WEB_VIEW_ACTIVITY_EXTRA_URL)); + loadWebViewFragment(getIntent().getStringExtra(WEB_VIEW_ACTIVITY_EXTRA_URL), getIntent().getBooleanExtra(WEB_VIEW_ACTIVITY_EXTRA_CLEAR_COOKIES, false)); } - private void loadWebViewFragment(String url) { + private void loadWebViewFragment(String url, boolean clearCookies) { WebViewFragment fragment = WebViewFragment.newInstance(); Bundle bundle = new Bundle(); bundle.putString(WebViewFragment.URL, url); bundle.putBoolean(WebViewFragment.TOOLBAR_VISIBLE, false); + bundle.putBoolean(WebViewFragment.CLEAR_COOKIES, clearCookies); fragment.setArguments(bundle); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction ft = fragmentManager.beginTransaction(); @@ -131,4 +139,13 @@ public class WebViewActivity extends Activity implements WebViewFragment.OnWebVi @Override public void onExpand() { } + @Override + public void onOAuthAuthorizeCallback(Uri uri) { + Intent result = new Intent(); + result.putExtra(RESULT_OAUTH_CODE, uri.getQueryParameter(OAUTH_CODE)); + result.putExtra(RESULT_OAUTH_STATE, uri.getQueryParameter(OAUTH_STATE)); + setResult(Activity.RESULT_OK, result); + finish(); + } + } 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 eea65d425f..79fbb50737 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,10 +1,13 @@ package io.highfidelity.hifiinterface.fragment; +import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.Nullable; +import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -18,8 +21,14 @@ import android.widget.TextView; import org.qtproject.qt5.android.QtNative; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Random; + +import io.highfidelity.hifiinterface.BuildConfig; import io.highfidelity.hifiinterface.HifiUtils; import io.highfidelity.hifiinterface.R; +import io.highfidelity.hifiinterface.WebViewActivity; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationActive; import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationInactive; @@ -27,6 +36,14 @@ import static org.qtproject.qt5.android.QtActivityDelegate.ApplicationInactive; public class LoginFragment extends Fragment implements OnBackPressedListener { + private static final String ARG_USE_OAUTH = "use_oauth"; + private static final String TAG = "Interface"; + + private final String OAUTH_CLIENT_ID = BuildConfig.OAUTH_CLIENT_ID; + private final String OAUTH_REDIRECT_URI = BuildConfig.OAUTH_REDIRECT_URI; + private final String OAUTH_AUTHORIZE_BASE_URL = "https://highfidelity.com/oauth/authorize"; + private static final int OAUTH_AUTORIZE_REQUEST = 1; + private EditText mUsername; private EditText mPassword; private TextView mError; @@ -37,8 +54,12 @@ public class LoginFragment extends Fragment private ViewGroup mLoggedInFrame; private boolean mLoginInProgress; private boolean mLoginSuccess; + private boolean mUseOauth; + private String mOauthState; public native void login(String username, String password, boolean keepLoggedIn); + private native void retrieveAccessToken(String authCode, String clientId, String clientSecret, String redirectUri); + public native void cancelLogin(); private LoginFragment.OnLoginInteractionListener mListener; @@ -47,11 +68,22 @@ public class LoginFragment extends Fragment // Required empty public constructor } - public static LoginFragment newInstance() { + public static LoginFragment newInstance(boolean useOauth) { LoginFragment fragment = new LoginFragment(); + Bundle args = new Bundle(); + args.putBoolean(ARG_USE_OAUTH, useOauth); + fragment.setArguments(args); return fragment; } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mUseOauth = getArguments().getBoolean(ARG_USE_OAUTH, false); + } + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -79,6 +111,11 @@ public class LoginFragment extends Fragment mKeepMeLoggedInCheckbox.setChecked(HifiUtils.getInstance().isKeepingLoggedIn()); + if (mUseOauth) { + openWebForAuthorization(); + } else { + showLoginForm(); + } return rootView; } @@ -109,12 +146,33 @@ public class LoginFragment extends Fragment @Override public void onStop() { super.onStop(); - showLoginForm(); + if (!mUseOauth) { + showLoginForm(); + } // Leave the Qt app paused QtNative.setApplicationState(ApplicationInactive); hideKeyboard(); } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == OAUTH_AUTORIZE_REQUEST) { + if (resultCode == Activity.RESULT_OK) { + String authCode = data.getStringExtra(WebViewActivity.RESULT_OAUTH_CODE); + String state = data.getStringExtra(WebViewActivity.RESULT_OAUTH_STATE); + if (state != null && state.equals(mOauthState) && mListener != null) { + mOauthState = null; + showActivityIndicator(); + mLoginInProgress = true; + retrieveAccessToken(authCode, BuildConfig.OAUTH_CLIENT_ID, BuildConfig.OAUTH_CLIENT_SECRET, BuildConfig.OAUTH_REDIRECT_URI); + } + } else { + onCancelLogin(); + } + } + + } + private void onCancelLogin() { if (mListener != null) { mListener.onCancelLogin(); @@ -207,8 +265,12 @@ public class LoginFragment extends Fragment mLoginSuccess = true; showLoggedInMessage(); } else { - showLoginForm(); - showError(getString(R.string.login_username_or_password_incorrect)); + if (!mUseOauth) { + showLoginForm(); + showError(getString(R.string.login_username_or_password_incorrect)); + } else { + openWebForAuthorization(); + } } }); } @@ -229,6 +291,33 @@ public class LoginFragment extends Fragment } } + private void updateOauthState() { + mOauthState = Long.toString(new Random().nextLong()); + } + + private String buildAuthorizeUrl() { + StringBuilder sb = new StringBuilder(OAUTH_AUTHORIZE_BASE_URL); + sb.append("?client_id=").append(OAUTH_CLIENT_ID); + try { + String redirectUri = URLEncoder.encode(OAUTH_REDIRECT_URI, "utf-8"); + sb.append("&redirect_uri=").append(redirectUri); + } catch (UnsupportedEncodingException e) { + Log.e(TAG, "Cannot build oauth autorization url", e); + } + sb.append("&response_type=code&scope=owner"); + sb.append("&state=").append(mOauthState); + return sb.toString(); + } + + private void openWebForAuthorization() { + Intent openUrlIntent = new Intent(getActivity(), WebViewActivity.class); + updateOauthState(); + openUrlIntent.putExtra(WebViewActivity.WEB_VIEW_ACTIVITY_EXTRA_URL, buildAuthorizeUrl()); + openUrlIntent.putExtra(WebViewActivity.WEB_VIEW_ACTIVITY_EXTRA_CLEAR_COOKIES, true); + startActivityForResult(openUrlIntent, OAUTH_AUTORIZE_REQUEST); + } + + public interface OnLoginInteractionListener { void onLoginCompleted(); void onCancelLogin(); 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 index 22614fa300..fe77991962 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/StartMenuFragment.java @@ -1,8 +1,8 @@ package io.highfidelity.hifiinterface.fragment; +import android.app.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; @@ -11,6 +11,7 @@ import io.highfidelity.hifiinterface.R; public class StartMenuFragment extends Fragment { + private String TAG = "HighFidelity"; private StartMenuInteractionListener mListener; public StartMenuFragment() { @@ -39,6 +40,12 @@ public class StartMenuFragment extends Fragment { } }); + rootView.findViewById(R.id.steamLoginButton).setOnClickListener(view -> { + if (mListener != null) { + mListener.onSteamLoginButtonClicked(); + } + }); + rootView.findViewById(R.id.takeMeInWorld).setOnClickListener(view -> { if (mListener != null) { mListener.onSkipLoginClicked(); @@ -81,5 +88,6 @@ public class StartMenuFragment extends Fragment { void onSignupButtonClicked(); void onLoginButtonClicked(); void onSkipLoginClicked(); + void onSteamLoginButtonClicked(); } } diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/WebViewFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/WebViewFragment.java index 2d887d5a19..94aa6f29a3 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/WebViewFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/WebViewFragment.java @@ -4,9 +4,11 @@ import android.app.Fragment; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.net.Uri; import android.net.http.SslError; import android.os.Bundle; import android.os.Handler; +import android.util.Log; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -14,6 +16,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; +import android.webkit.CookieManager; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebResourceError; @@ -25,6 +28,10 @@ import android.webkit.WebViewClient; import android.widget.ProgressBar; import android.widget.Toast; +import java.util.List; +import java.util.Set; + +import io.highfidelity.hifiinterface.BuildConfig; import io.highfidelity.hifiinterface.R; import io.highfidelity.hifiinterface.WebViewActivity; @@ -32,6 +39,7 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu public static final String URL = "url"; public static final String TOOLBAR_VISIBLE = "toolbar_visible"; + public static final String CLEAR_COOKIES = "clear_cookies"; private static final long DELAY_HIDE_TOOLBAR_MILLIS = 3000; private static final long FADE_OUT_DURATION = 2000; @@ -41,6 +49,7 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu private ProgressBar mProgressBar; private String mUrl; private boolean mToolbarVisible; + private boolean mClearCookies; private OnWebViewInteractionListener mListener; private Runnable mCloseAction; @@ -170,6 +179,7 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu if (getArguments() != null) { mUrl = getArguments().getString(URL); mToolbarVisible = getArguments().getBoolean(TOOLBAR_VISIBLE); + mClearCookies = getArguments().getBoolean(CLEAR_COOKIES); } } @@ -179,6 +189,10 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu View rootView = inflater.inflate(R.layout.fragment_web_view, container, false); mProgressBar = rootView.findViewById(R.id.toolbarProgressBar); myWebView = rootView.findViewById(R.id.web_view); + if (mClearCookies) { + CookieManager.getInstance().removeAllCookies(null); + } + mHandler = new Handler(); gestureDetector = new GestureDetector(this); gestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() { @@ -251,6 +265,7 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu void onWebLoaded(String url, SafenessLevel safenessLevel); void onTitleReceived(String title); void onExpand(); + void onOAuthAuthorizeCallback(Uri uri); } @@ -320,6 +335,17 @@ public class WebViewFragment extends Fragment implements GestureDetector.OnGestu super.onLoadResource(view, url); } } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + if (request.getUrl().toString().startsWith(BuildConfig.OAUTH_REDIRECT_URI)) { + if (mListener != null) { + mListener.onOAuthAuthorizeCallback(request.getUrl()); + } + return true; + } + return super.shouldOverrideUrlLoading(view, request); + } } class HiFiWebChromeClient extends WebChromeClient { diff --git a/android/app/src/main/res/drawable/ic_steam.xml b/android/app/src/main/res/drawable/ic_steam.xml new file mode 100644 index 0000000000..9b739c1f73 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_steam.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/rounded_button_color4.xml b/android/app/src/main/res/drawable/rounded_button_color4.xml new file mode 100644 index 0000000000..679bf24513 --- /dev/null +++ b/android/app/src/main/res/drawable/rounded_button_color4.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ 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 2f48424ae8..343822e243 100644 --- a/android/app/src/main/res/layout/fragment_login.xml +++ b/android/app/src/main/res/layout/fragment_login.xml @@ -111,7 +111,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/header" app:layout_constraintBottom_toBottomOf="parent" - android:visibility="visible"> + android:visibility="gone"> app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"/> +