From cc32c187324d0f313e8cd53831417a04d024c580 Mon Sep 17 00:00:00 2001 From: Sergiy Kozyr Date: Fri, 2 Aug 2024 10:13:36 +0300 Subject: [PATCH 01/13] Added draft of "Login with OSM website" button Signed-off-by: Sergiy Kozyr --- .../cpp/app/organicmaps/editor/OsmOAuth.cpp | 14 ++++++++++ .../organicmaps/editor/OsmLoginFragment.java | 27 +++++++++++++++++++ .../java/app/organicmaps/editor/OsmOAuth.java | 8 ++++++ .../main/res/layout/fragment_osm_login.xml | 7 +++++ editor/osm_auth.hpp | 7 +++++ 5 files changed, 63 insertions(+) diff --git a/android/app/src/main/cpp/app/organicmaps/editor/OsmOAuth.cpp b/android/app/src/main/cpp/app/organicmaps/editor/OsmOAuth.cpp index 90d320ef65..1533aca1df 100644 --- a/android/app/src/main/cpp/app/organicmaps/editor/OsmOAuth.cpp +++ b/android/app/src/main/cpp/app/organicmaps/editor/OsmOAuth.cpp @@ -34,6 +34,20 @@ bool LoadOsmUserPreferences(std::string const & oauthToken, UserPreferences & ou extern "C" { +JNIEXPORT jobjectArray JNICALL +Java_app_organicmaps_editor_OsmOAuth_nativeOAuthParams(JNIEnv * env, jclass clazz) +{ + OsmOAuth auth = OsmOAuth::ServerAuth(); + jobjectArray oauthParams = env->NewObjectArray(5, env->FindClass("java/lang/String"), nullptr); + env->SetObjectArrayElement(oauthParams, 0, ToJavaString(env, auth.GetBaseUrl())); + env->SetObjectArrayElement(oauthParams, 1, ToJavaString(env, auth.GetClientId())); + env->SetObjectArrayElement(oauthParams, 2, ToJavaString(env, auth.GetClientSecret())); + env->SetObjectArrayElement(oauthParams, 3, ToJavaString(env, auth.GetScope())); + env->SetObjectArrayElement(oauthParams, 4, ToJavaString(env, auth.GetRedirectUri())); + + return oauthParams; +} + JNIEXPORT jstring JNICALL Java_app_organicmaps_editor_OsmOAuth_nativeAuthWithPassword(JNIEnv * env, jclass clazz, jstring login, jstring password) diff --git a/android/app/src/main/java/app/organicmaps/editor/OsmLoginFragment.java b/android/app/src/main/java/app/organicmaps/editor/OsmLoginFragment.java index 4e33db9e22..12c558a264 100644 --- a/android/app/src/main/java/app/organicmaps/editor/OsmLoginFragment.java +++ b/android/app/src/main/java/app/organicmaps/editor/OsmLoginFragment.java @@ -1,6 +1,8 @@ package app.organicmaps.editor; +import android.content.ActivityNotFoundException; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -29,6 +31,7 @@ public class OsmLoginFragment extends BaseMwmToolbarFragment { private ProgressBar mProgress; private Button mLoginButton; + private Button mLoginWebsiteButton; private Button mLostPasswordButton; private TextInputEditText mLoginInput; private TextInputEditText mPasswordInput; @@ -47,6 +50,8 @@ public class OsmLoginFragment extends BaseMwmToolbarFragment getToolbarController().setTitle(R.string.login); mLoginInput = view.findViewById(R.id.osm_username); mPasswordInput = view.findViewById(R.id.osm_password); + mLoginWebsiteButton = view.findViewById(R.id.login_website); + mLoginWebsiteButton.setOnClickListener((v) -> loginWithBrowser()); mLoginButton = view.findViewById(R.id.login); mLoginButton.setOnClickListener((v) -> login()); mLostPasswordButton = view.findViewById(R.id.lost_password); @@ -75,6 +80,28 @@ public class OsmLoginFragment extends BaseMwmToolbarFragment }); } + private void loginWithBrowser() + { + mLoginWebsiteButton.setEnabled(false); + + String[] oauthParams = OsmOAuth.nativeOAuthParams(); + Uri oauth2url = Uri.parse(oauthParams[0] + "/oauth2/authorize") + .buildUpon() + .appendQueryParameter("client_id", oauthParams[1]) + .appendQueryParameter("scope", oauthParams[3]) + .appendQueryParameter("redirect_uri", oauthParams[4]) + .appendQueryParameter("response_type", "code") + .build(); + try { + Intent myIntent = new Intent(Intent.ACTION_VIEW, oauth2url); + startActivity(myIntent); + } catch (ActivityNotFoundException e) { + //Toast.makeText(this, "No application can handle this request." + // + " Please install a webbrowser", Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + } + private void enableInput(boolean enable) { mPasswordInput.setEnabled(enable); diff --git a/android/app/src/main/java/app/organicmaps/editor/OsmOAuth.java b/android/app/src/main/java/app/organicmaps/editor/OsmOAuth.java index d5d7dc8450..36386850a6 100644 --- a/android/app/src/main/java/app/organicmaps/editor/OsmOAuth.java +++ b/android/app/src/main/java/app/organicmaps/editor/OsmOAuth.java @@ -10,6 +10,8 @@ import androidx.annotation.Size; import androidx.annotation.WorkerThread; import androidx.fragment.app.FragmentManager; +import java.util.Map; + import app.organicmaps.MwmApplication; import app.organicmaps.util.NetworkPolicy; @@ -98,6 +100,12 @@ public final class OsmOAuth return nativeGetHistoryUrl(getUsername(context)); } + /* + Returns 5 strings: ServerURL, ClientId, ClientSecret, Scope, RedirectUri + */ + @NonNull + public static native String[] nativeOAuthParams(); + /** * @return string with OAuth2 token */ diff --git a/android/app/src/main/res/layout/fragment_osm_login.xml b/android/app/src/main/res/layout/fragment_osm_login.xml index 3868214a12..988ab6cb27 100644 --- a/android/app/src/main/res/layout/fragment_osm_login.xml +++ b/android/app/src/main/res/layout/fragment_osm_login.xml @@ -60,6 +60,13 @@ android:text="@string/login_to_make_edits_visible" android:textAppearance="@style/MwmTextAppearance.Body2" android:textColor="?android:textColorPrimary" /> +