From 49c0e998bf69134eecfd81ef3f7513bea86f4864 Mon Sep 17 00:00:00 2001 From: Dima-1 Date: Mon, 16 Nov 2020 23:56:35 +0200 Subject: [PATCH] Fix crash: landscape tap on "Sign in..." --- .../net/osmand/plus/helpers/IntentHelper.java | 20 +++- .../oauth/OsmOAuthAuthorizationAdapter.java | 109 ++++++++++++++---- .../plus/osmedit/oauth/OsmOAuthHelper.java | 33 +----- 3 files changed, 104 insertions(+), 58 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java index 5fa07a91e3..25cc6dcc30 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java @@ -297,12 +297,7 @@ public class IntentHelper { Uri uri = intent.getData(); if (uri.toString().startsWith("osmand-oauth")) { String oauthVerifier = uri.getQueryParameter("oauth_verifier"); - app.getOsmOAuthHelper().authorize(oauthVerifier); - for (Fragment fragment : mapActivity.getSupportFragmentManager().getFragments()) { - if (fragment instanceof OsmAuthorizationListener) { - ((OsmAuthorizationListener) fragment).authorizationCompleted(); - } - } + app.getOsmOAuthHelper().authorize(oauthVerifier, getOnAuthorizeListener()); mapActivity.setIntent(null); return true; } @@ -310,6 +305,19 @@ public class IntentHelper { return false; } + private OsmAuthorizationListener getOnAuthorizeListener() { + return new OsmAuthorizationListener() { + @Override + public void authorizationCompleted() { + for (Fragment fragment : mapActivity.getSupportFragmentManager().getFragments()) { + if (fragment instanceof OsmAuthorizationListener) { + ((OsmAuthorizationListener) fragment).authorizationCompleted(); + } + } + } + }; + } + private boolean handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (!Algorithms.isEmpty(sharedText)) { diff --git a/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthAuthorizationAdapter.java b/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthAuthorizationAdapter.java index 7c2562b580..726a1e1b37 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthAuthorizationAdapter.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthAuthorizationAdapter.java @@ -1,10 +1,13 @@ package net.osmand.plus.osmedit.oauth; import android.net.TrafficStats; +import android.os.AsyncTask; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; +import androidx.annotation.NonNull; + import com.github.scribejava.core.model.OAuth1AccessToken; import com.github.scribejava.core.model.OAuth1RequestToken; import com.github.scribejava.core.model.OAuthAsyncRequestCallback; @@ -16,18 +19,22 @@ import net.osmand.osm.oauth.OsmOAuthAuthorizationClient; import net.osmand.plus.BuildConfig; import net.osmand.plus.OsmandApplication; +import org.apache.commons.logging.Log; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.util.concurrent.ExecutionException; +import static net.osmand.plus.osmedit.oauth.OsmOAuthHelper.*; + public class OsmOAuthAuthorizationAdapter { private static final int THREAD_ID = 10101; private static final String OSM_USER = "user"; private static final String DISPLAY_NAME = "display_name"; private static final String OSM_USER_DETAILS_URL = "https://api.openstreetmap.org/api/0.6/user/details"; + public final static Log log = PlatformUtil.getLog(OsmOAuthAuthorizationAdapter.class); private OsmandApplication app; private OsmOAuthAuthorizationClient client = @@ -61,9 +68,8 @@ public class OsmOAuthAuthorizationAdapter { } } - public void startOAuth(ViewGroup rootLayout) { - OAuth1RequestToken requestToken = client.startOAuth(); - loadWebView(rootLayout, client.getService().getAuthorizationUrl(requestToken)); + public void startOAuth(final ViewGroup rootLayout) { + new StartOAuthAsyncTask(rootLayout).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null); } private void saveToken() { @@ -93,30 +99,91 @@ public class OsmOAuthAuthorizationAdapter { return client.performRequestWithoutAuth(url, method, body); } - public void authorize(String oauthVerifier) { - client.authorize(oauthVerifier); - saveToken(); + public void authorize(String oauthVerifier, final OsmOAuthHelper helper, final OsmAuthorizationListener listener) { + new AuthorizeAsyncTask(helper, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, oauthVerifier); } - public String getUserName() throws InterruptedException, ExecutionException, IOException, XmlPullParserException { - Response response = getOsmUserDetails(); - return parseUserName(response); + private class StartOAuthAsyncTask extends AsyncTask { + + private final ViewGroup rootLayout; + + public StartOAuthAsyncTask(ViewGroup rootLayout) { + this.rootLayout = rootLayout; + } + + @Override + protected OAuth1RequestToken doInBackground(Void... params) { + return client.startOAuth(); + } + + @Override + protected void onPostExecute(@NonNull OAuth1RequestToken requestToken) { + loadWebView(rootLayout, client.getService().getAuthorizationUrl(requestToken)); + } + } - public Response getOsmUserDetails() throws InterruptedException, ExecutionException, IOException { - return performRequest(OSM_USER_DETAILS_URL, Verb.GET.name(), null); - } + private class AuthorizeAsyncTask extends AsyncTask { - public String parseUserName(Response response) throws XmlPullParserException, IOException { - String userName = null; - XmlPullParser parser = PlatformUtil.newXMLPullParser(); - parser.setInput(response.getStream(), "UTF-8"); - int tok; - while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (tok == XmlPullParser.START_TAG && OSM_USER.equals(parser.getName())) { - userName = parser.getAttributeValue("", DISPLAY_NAME); + private final OsmOAuthHelper helper; + private final OsmAuthorizationListener listener; + + public AuthorizeAsyncTask(OsmOAuthHelper helper, OsmAuthorizationListener listener) { + this.helper = helper; + this.listener = listener; + } + + @Override + protected Void doInBackground(String... oauthVerifier) { + client.authorize(oauthVerifier[0]); + saveToken(); + updateUserName(); + return null; + } + + @Override + protected void onPostExecute(Void result) { + if (listener != null) { + listener.authorizationCompleted(); } } - return userName; + + public void updateUserName() { + String userName = ""; + try { + userName = getUserName(); + } catch (InterruptedException e) { + log.error(e); + } catch (ExecutionException e) { + log.error(e); + } catch (IOException e) { + log.error(e); + } catch (XmlPullParserException e) { + log.error(e); + } + app.getSettings().USER_DISPLAY_NAME.set(userName); + } + + public String getUserName() throws InterruptedException, ExecutionException, IOException, XmlPullParserException { + Response response = getOsmUserDetails(); + return parseUserName(response); + } + + public Response getOsmUserDetails() throws InterruptedException, ExecutionException, IOException { + return performRequest(OSM_USER_DETAILS_URL, Verb.GET.name(), null); + } + + public String parseUserName(Response response) throws XmlPullParserException, IOException { + String userName = null; + XmlPullParser parser = PlatformUtil.newXMLPullParser(); + parser.setInput(response.getStream(), "UTF-8"); + int tok; + while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { + if (tok == XmlPullParser.START_TAG && OSM_USER.equals(parser.getName())) { + userName = parser.getAttributeValue("", DISPLAY_NAME); + } + } + return userName; + } } } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthHelper.java b/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthHelper.java index d13bf624f2..a9ff75c6b5 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthHelper.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/oauth/OsmOAuthHelper.java @@ -4,25 +4,13 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; -import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; -import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; -import java.util.concurrent.ExecutionException; - public class OsmOAuthHelper { - private static final Log log = PlatformUtil.getLog(OsmOAuthHelper.class); - - private final OsmandApplication app; - private final OsmOAuthAuthorizationAdapter authorizationAdapter; public OsmOAuthHelper(@NonNull OsmandApplication app) { - this.app = app; authorizationAdapter = new OsmOAuthAuthorizationAdapter(app); } @@ -30,31 +18,14 @@ public class OsmOAuthHelper { authorizationAdapter.startOAuth(view); } - public void authorize(String oauthVerifier) { - authorizationAdapter.authorize(oauthVerifier); - updateUserName(); + public void authorize(String oauthVerifier, OsmAuthorizationListener listener) { + authorizationAdapter.authorize(oauthVerifier, this, listener); } public OsmOAuthAuthorizationAdapter getAuthorizationAdapter() { return authorizationAdapter; } - private void updateUserName() { - String userName = ""; - try { - userName = authorizationAdapter.getUserName(); - } catch (InterruptedException e) { - log.error(e); - } catch (ExecutionException e) { - log.error(e); - } catch (IOException e) { - log.error(e); - } catch (XmlPullParserException e) { - log.error(e); - } - app.getSettings().USER_DISPLAY_NAME.set(userName); - } - public interface OsmAuthorizationListener { void authorizationCompleted(); }