From 585534102aee1da48f6a078cb7fd5d217a5e2e7c Mon Sep 17 00:00:00 2001 From: androiddevkkotlin Date: Fri, 6 Nov 2020 11:27:36 +0200 Subject: [PATCH] Final refactor --- .../oauth/OsmOAuthAuthorizationClient.java | 39 ---- .../res/layout/bottom_sheet_dialog_button.xml | 1 + OsmAnd/res/layout/bottom_sheet_login.xml | 3 +- OsmAnd/res/layout/osm_login_data.xml | 3 +- OsmAnd/res/layout/preference_login.xml | 137 ++++++------ OsmAnd/res/values/strings.xml | 13 +- OsmAnd/src/net/osmand/plus/OsmandPlugin.java | 9 +- .../osmand/plus/activities/MapActivity.java | 1 - .../net/osmand/plus/helpers/IntentHelper.java | 1 - .../LoginBottomSheetFragment.java | 209 +++++++++--------- .../plus/osmedit/EditPOIMenuController.java | 19 +- .../plus/osmedit/OsmEditingFragment.java | 76 ++++--- .../osmand/plus/osmedit/OsmEditingPlugin.java | 32 ++- .../osmedit/ValidateOsmLoginDetailsTask.java | 33 ++- .../oauth/OsmOAuthAuthorizationAdapter.java | 62 +++--- .../bottomsheets/OsmLoginDataBottomSheet.java | 27 ++- 16 files changed, 324 insertions(+), 341 deletions(-) diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/oauth/OsmOAuthAuthorizationClient.java b/OsmAnd-java/src/main/java/net/osmand/osm/oauth/OsmOAuthAuthorizationClient.java index f973e134a2..f1c718465e 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/oauth/OsmOAuthAuthorizationClient.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/oauth/OsmOAuthAuthorizationClient.java @@ -9,12 +9,8 @@ import com.github.scribejava.core.model.*; import com.github.scribejava.core.oauth.OAuth10aService; import net.osmand.PlatformUtil; import org.apache.commons.logging.Log; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.ExecutionException; /** @@ -93,39 +89,6 @@ public class OsmOAuthAuthorizationClient { service.execute(req, callback); } - public String authorizeOsmUserDetails() throws InterruptedException, ExecutionException, IOException, XmlPullParserException { - OAuth1RequestToken requestToken = startOAuth(); - if (requestToken == null) { - throw new IllegalArgumentException("Illegal request token: "); - } - // save for reuse of request ( they usually don't match and should'nt be an issue) - String url = "https://api.openstreetmap.org/api/0.6/user/details"; - OAuthRequest req = new OAuthRequest(Verb.GET, url); - service.signRequest(accessToken, req); - req.addHeader("Content-Type", "application/xml"); - Response response = service.execute(req); - String user = ""; - String home = ""; - String lang = ""; - XmlPullParser parser = PlatformUtil.newXMLPullParser(); - parser.setInput(response.getStream(), "UTF-8"); - List languages = new ArrayList<>(); - int tok; - while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) { - if (tok == XmlPullParser.START_TAG) { - String name = parser.getName(); - if ("user".equals(name)) { - user = parser.getAttributeValue("", "display_name"); - } else if ("home".equals(name)) { - } else if ("lang".equals(name)) { - languages.add(parser.nextText()); - } - } - } - return user; - } - - public Response performRequest(String url, String method, String body) throws InterruptedException, ExecutionException, IOException { service.getApi().getSignatureType(); @@ -140,8 +103,6 @@ public class OsmOAuthAuthorizationClient { return service.execute(req); } - - public OAuth1RequestToken startOAuth() { try { requestToken = service.getRequestToken(); diff --git a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml index 697075cba5..6ce7d34fc3 100644 --- a/OsmAnd/res/layout/bottom_sheet_dialog_button.xml +++ b/OsmAnd/res/layout/bottom_sheet_dialog_button.xml @@ -25,6 +25,7 @@ android:textSize="@dimen/default_desc_text_size" osmand:typeface="@string/font_roboto_medium" android:duplicateParentState="true" + android:drawablePadding="@dimen/content_padding_half" tools:text="Button" android:paddingStart="@dimen/content_padding_small" android:paddingEnd="@dimen/content_padding_small" /> diff --git a/OsmAnd/res/layout/bottom_sheet_login.xml b/OsmAnd/res/layout/bottom_sheet_login.xml index bcccec19bc..85915a72cc 100644 --- a/OsmAnd/res/layout/bottom_sheet_login.xml +++ b/OsmAnd/res/layout/bottom_sheet_login.xml @@ -10,7 +10,8 @@ android:paddingTop="@dimen/measurement_tool_menu_title_padding_top" android:orientation="vertical" android:paddingEnd="@dimen/content_padding" - android:paddingStart="@dimen/content_padding"> + android:paddingStart="@dimen/content_padding" + android:paddingBottom="@dimen/content_padding_half"> - - + \ No newline at end of file diff --git a/OsmAnd/res/layout/preference_login.xml b/OsmAnd/res/layout/preference_login.xml index 8754f1c76c..14ecba71af 100644 --- a/OsmAnd/res/layout/preference_login.xml +++ b/OsmAnd/res/layout/preference_login.xml @@ -1,81 +1,80 @@ + xmlns:osmand="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/list_background_color" + android:gravity="center_vertical"> - + + - + - + - + - + - + - - - + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 91eec18222..fc7a48c5bc 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,16 @@ Thx - Hardy --> + Login + Password + Account + Use login and password + You need to login to upload new or modified changes. \n\nYou can log in using the safe OAuth method or use your login and password. + You can view all your unloaded edits or OSM bugs in %1$s. Uploaded points don’t show in OsmAnd. + Sing in with OpenStreetMap + Login to OpenStreetMap.org + Login to OpenStreetMap + These plugin setting are global, and apply to all profiles You must add at least two points. Travel Emergency @@ -482,9 +492,7 @@ Route recalculation Announce Username and password - These settings apply to all profiles. OSM editing - View your edits or OSM bugs not yet uploaded in %1$s. Uploaded points will not show any more. OSM Icon shown while navigating or moving. Icon shown at rest. @@ -3196,7 +3204,6 @@ Global app settings Your OSM username Needed for openstreetmap.org submissions. - Your OSM password Background mode OsmAnd runs in the background with the screen off. There is not enough free space to download %1$s MB (free: %2$s). diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index 6d353713a0..54f45b7425 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -541,10 +541,10 @@ public abstract class OsmandPlugin { protected void addMyPlacesTab(FavoritesActivity favoritesActivity, List mTabs, Intent intent) { } - protected void contextMenuFragment(Activity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) { + protected void contextMenuFragment(FragmentActivity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) { } - protected void optionsMenuFragment(Activity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { + protected void optionsMenuFragment(FragmentActivity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { } protected boolean searchFinished(QuickSearchDialogFragment searchFragment, SearchPhrase phrase, boolean isResultEmpty) { @@ -815,14 +815,13 @@ public abstract class OsmandPlugin { } } - public static void onContextMenuActivity(Activity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) { + public static void onContextMenuActivity(FragmentActivity activity, Fragment fragment, Object info, ContextMenuAdapter adapter) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.contextMenuFragment(activity, fragment, info, adapter); } } - - public static void onOptionsMenuActivity(Activity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { + public static void onOptionsMenuActivity(FragmentActivity activity, Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { for (OsmandPlugin plugin : getEnabledPlugins()) { plugin.optionsMenuFragment(activity, fragment, optionsMenuAdapter); } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 6d8c5ad4d5..288f697470 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -119,7 +119,6 @@ import net.osmand.plus.measurementtool.LoginBottomSheetFragment; import net.osmand.plus.measurementtool.MeasurementEditingContext; import net.osmand.plus.measurementtool.MeasurementToolFragment; import net.osmand.plus.measurementtool.SnapTrackWarningFragment; -import net.osmand.plus.osmedit.OsmEditingFragment; import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.routepreparationmenu.ChooseRouteFragment; diff --git a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java index 3efb1f6aac..9e5aaa5254 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/IntentHelper.java @@ -20,7 +20,6 @@ import net.osmand.plus.dashboard.DashboardOnMap.DashboardType; import net.osmand.plus.mapmarkers.MapMarkersDialogFragment; import net.osmand.plus.mapsource.EditMapSourceDialogFragment; import net.osmand.plus.measurementtool.LoginBottomSheetFragment; -import net.osmand.plus.osmedit.OsmEditingFragment; import net.osmand.plus.search.QuickSearchDialogFragment; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.backend.OsmandSettings; diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/LoginBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/LoginBottomSheetFragment.java index 8fad09f8dd..e61813cd93 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/LoginBottomSheetFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/LoginBottomSheetFragment.java @@ -4,145 +4,144 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.graphics.drawable.DrawableCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; +import net.osmand.PlatformUtil; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.UiUtilities.DialogButtonType; import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerSpaceItem; -import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem; +import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.settings.bottomsheets.OsmLoginDataBottomSheet; +import org.apache.commons.logging.Log; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; + public class LoginBottomSheetFragment extends MenuBottomSheetDialogFragment { - private ApplicationMode appMode; - private OsmOAuthAuthorizationAdapter client; - private static final String OSM_LOGIN_DATA = "osm_login_data"; + public static final String TAG = LoginBottomSheetFragment.class.getSimpleName(); + private static final Log log = PlatformUtil.getLog(LoginBottomSheetFragment.class); + private static final String OSM_LOGIN_DATA = "osm_login_data"; - public static final String TAG = LoginBottomSheetFragment.class.getSimpleName(); + private OsmOAuthAuthorizationAdapter authorizationAdapter; @Override public void createMenuItems(Bundle savedInstanceState) { - items.add(new SimpleBottomSheetItem.Builder() - .setLayoutId(R.layout.bottom_sheet_login) - .create()); - - items.add(new DividerSpaceItem(getContext(), - getResources().getDimensionPixelSize(R.dimen.bottom_sheet_content_margin))); - + OsmandApplication app = requiredMyApplication(); + authorizationAdapter = new OsmOAuthAuthorizationAdapter(app); + items.add(new SimpleBottomSheetItem.Builder().setLayoutId(R.layout.bottom_sheet_login).create()); } - @Override - protected int getDismissButtonTextId() { - return R.string.shared_string_cancel; - } + @Override + protected int getDismissButtonTextId() { + return R.string.shared_string_cancel; + } - @Override - protected int getRightBottomButtonTextId() { - return R.string.use_login_password; - } + @Override + protected int getRightBottomButtonTextId() { + return R.string.use_login_password; + } - @Override - protected void setupThirdButton() { - super.setupThirdButton(); - TextView textViewIcon = thirdButton.findViewById(R.id.button_text); - Drawable drawable = getResources().getDrawable(R.drawable.ic_action_openstreetmap_logo); - drawable = DrawableCompat.wrap(drawable); - DrawableCompat.setTint(drawable, getResources().getColor(R.color.popup_text_color)); - AndroidUtils.setCompoundDrawablesWithIntrinsicBounds( - textViewIcon, - drawable, - null, - null, - null); - textViewIcon.setCompoundDrawablePadding(AndroidUtils.dpToPx(getActivity(), 8f)); - } + @Override + protected void setupThirdButton() { + super.setupThirdButton(); + OsmandApplication app = getMyApplication(); + if (app != null) { + Drawable icon = app.getUIUtilities().getIcon(R.drawable.ic_action_openstreetmap_logo, R.color.popup_text_color); + TextView buttonText = thirdButton.findViewById(R.id.button_text); + AndroidUtils.setCompoundDrawablesWithIntrinsicBounds(buttonText, icon, null, null, null); + } + } - @Override - protected int getThirdBottomButtonTextId() { - return R.string.sing_in_with_open_street_map; - } + @Override + protected int getThirdBottomButtonTextId() { + return R.string.sing_in_with_open_street_map; + } - @Override - public int getFirstDividerHeight() { - return getResources().getDimensionPixelSize(R.dimen.card_content_padding_large); - } + @Override + public int getFirstDividerHeight() { + return getResources().getDimensionPixelSize(R.dimen.card_content_padding_large); + } - @Override - public int getSecondDividerHeight() { - return getResources().getDimensionPixelSize(R.dimen.content_padding_small); - } + @Override + public int getSecondDividerHeight() { + return getResources().getDimensionPixelSize(R.dimen.content_padding_small); + } - public ApplicationMode getSelectedAppMode() { - return appMode; - } + @Override + protected void onRightBottomButtonClick() { + FragmentManager fragmentManager = getFragmentManager(); + if (fragmentManager != null) { + OsmLoginDataBottomSheet.showInstance(fragmentManager, OSM_LOGIN_DATA, getTargetFragment(), usedOnMap, null); + } + dismiss(); + } - @Override - protected void onRightBottomButtonClick() { - ApplicationMode appMode = getSelectedAppMode(); - FragmentManager fragmentManager = getFragmentManager(); - if (fragmentManager != null) { - OsmLoginDataBottomSheet.showInstance(fragmentManager, OSM_LOGIN_DATA, getTargetFragment(), false, appMode); - } - dismiss(); - } + @Override + protected void onThirdBottomButtonClick() { + View view = getView(); + if (view != null) { + authorizationAdapter.startOAuth((ViewGroup) view); + } + } - public OsmOAuthAuthorizationAdapter getClient() { - return client; - } + @Override + protected DialogButtonType getRightBottomButtonType() { + return (DialogButtonType.SECONDARY); + } - @Override - protected void onThirdBottomButtonClick() { - View view = getView(); - client = new OsmOAuthAuthorizationAdapter(getMyApplication()); - if (view != null) { - client.startOAuth((ViewGroup) view); - } - } + public static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) { + if (!fragmentManager.isStateSaved()) { + LoginBottomSheetFragment fragment = new LoginBottomSheetFragment(); + fragment.setTargetFragment(targetFragment, 0); + fragment.show(fragmentManager, TAG); + } + } - @Override - protected DialogButtonType getThirdBottomButtonType() { - return (DialogButtonType.PRIMARY); - } + public void authorize(String oauthVerifier) { + if (authorizationAdapter != null) { + authorizationAdapter.authorize(oauthVerifier); + updateUserName(); + } + Fragment target = getTargetFragment(); + if (target instanceof OsmAuthorizationListener) { + ((OsmAuthorizationListener) target).authorizationCompleted(); + } + dismiss(); + } - @Override - protected DialogButtonType getRightBottomButtonType() { - return (DialogButtonType.SECONDARY); - } + private void updateUserName() { + OsmandApplication app = getMyApplication(); + if (app != null) { + 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 static void showInstance(@NonNull FragmentManager fragmentManager, @Nullable Fragment targetFragment) { - if (!fragmentManager.isStateSaved()) { - LoginBottomSheetFragment fragment = new LoginBottomSheetFragment(); - fragment.setTargetFragment(targetFragment, 0); - fragment.show(fragmentManager, TAG); - } - } - - public interface LoginOsmAuthorizationListener { - void informAuthorizationPrefsUpdate(); - } - - public void authorize(String oauthVerifier) { - if (client != null) { - client.authorize(oauthVerifier); - } - Fragment target = getTargetFragment(); - if (target instanceof LoginOsmAuthorizationListener) { - ((LoginOsmAuthorizationListener) target).informAuthorizationPrefsUpdate(); - } - dismiss(); - } + public interface OsmAuthorizationListener { + void authorizationCompleted(); + } } - - diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java index e0aeb331b3..60c2ed0b2b 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPOIMenuController.java @@ -2,18 +2,20 @@ package net.osmand.plus.osmedit; import android.content.DialogInterface; import android.graphics.drawable.Drawable; + import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import net.osmand.data.PointDescription; import net.osmand.osm.PoiType; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.measurementtool.LoginBottomSheetFragment; import net.osmand.plus.osmedit.OsmPoint.Action; -import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment; +import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment.SimpleProgressDialogPoiUploader; import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter; import net.osmand.plus.render.RenderingIcons; import net.osmand.plus.settings.backend.OsmandSettings; @@ -42,12 +44,15 @@ public class EditPOIMenuController extends MenuController { @Override public void buttonPressed() { MapActivity activity = getMapActivity(); - OsmandSettings settings = activity.getMyApplication().getSettings(); if (plugin != null && activity != null) { - OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(activity.getMyApplication()); - if (client.isValidToken() || !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get())){ - new SendPoiDialogFragment.SimpleProgressDialogPoiUploader(activity). - showProgressDialog(new OsmPoint[] { getOsmPoint() }, false, false); + OsmandApplication app = activity.getMyApplication(); + OsmandSettings settings = app.getSettings(); + OsmOAuthAuthorizationAdapter client = new OsmOAuthAuthorizationAdapter(app); + if (client.isValidToken() + || !Algorithms.isEmpty(settings.USER_NAME.get()) + && !Algorithms.isEmpty(settings.USER_PASSWORD.get())) { + SimpleProgressDialogPoiUploader poiDialogUploader = new SimpleProgressDialogPoiUploader(activity); + poiDialogUploader.showProgressDialog(new OsmPoint[] {getOsmPoint()}, false, false); } else { LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), activity.getLoginBottomSheetFragment()); } @@ -206,7 +211,7 @@ public class EditPOIMenuController extends MenuController { return null; } } - + @Override public int getAdditionalInfoIconRes() { if (osmPoint.getAction() == Action.DELETE) { diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java index 4eb706eeaf..3435ad1561 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingFragment.java @@ -19,6 +19,8 @@ import net.osmand.plus.activities.MapActivity; import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.FontCache; import net.osmand.plus.measurementtool.LoginBottomSheetFragment; +import net.osmand.plus.measurementtool.LoginBottomSheetFragment.OsmAuthorizationListener; +import net.osmand.plus.osmedit.ValidateOsmLoginDetailsTask.ValidateOsmLoginListener; import net.osmand.plus.osmedit.oauth.OsmOAuthAuthorizationAdapter; import net.osmand.plus.settings.backend.OsmAndAppCustomization; import net.osmand.plus.settings.fragments.BaseSettingsFragment; @@ -32,26 +34,21 @@ import org.apache.commons.logging.Log; import static net.osmand.plus.myplaces.FavoritesActivity.TAB_ID; import static net.osmand.plus.osmedit.OsmEditingPlugin.OSM_EDIT_TAB; -public class OsmEditingFragment extends BaseSettingsFragment implements OnPreferenceChanged, ValidateOsmLoginDetailsTask.ValidateOsmLoginListener, LoginBottomSheetFragment.LoginOsmAuthorizationListener { +public class OsmEditingFragment extends BaseSettingsFragment implements OnPreferenceChanged, ValidateOsmLoginListener, OsmAuthorizationListener { private static final Log log = PlatformUtil.getLog(OsmEditingFragment.class); - private static final String OSM_EDITING_INFO = "osm_editing_info"; + private static final String OSM_LOGOUT = "osm_logout"; private static final String OPEN_OSM_EDITS = "open_osm_edits"; private static final String OSM_LOGIN_DATA = "osm_login_data"; - private static final String OSM_LOGOUT = "osm_logout"; + private static final String OSM_EDITING_INFO = "osm_editing_info"; - private OsmOAuthAuthorizationAdapter client; - - @Override - public void loginValidationFinished(String error) { - updateAllSettings(); - } + private OsmOAuthAuthorizationAdapter authorizationAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - client = new OsmOAuthAuthorizationAdapter(app); + authorizationAdapter = new OsmOAuthAuthorizationAdapter(app); } @Override @@ -85,31 +82,40 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer } } + @Override + public void loginValidationFinished(String warning) { + updateAllSettings(); + } + private void setupLoginPref() { Preference nameAndPasswordPref = findPreference(OSM_LOGIN_DATA); - nameAndPasswordPref.setTitle(R.string.login_open_street_map); - nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account)); - - boolean validToken = client.isValidToken(); - boolean loginExists = !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get()); - boolean visible = !validToken && !loginExists; - nameAndPasswordPref.setVisible(visible); + if (!isValidToken() && !isLoginExists()) { + nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account)); + nameAndPasswordPref.setVisible(true); + } else { + nameAndPasswordPref.setVisible(false); + } } private void setupLogoutPref() { + boolean validToken = isValidToken(); Preference nameAndPasswordPref = findPreference(OSM_LOGOUT); - boolean validToken = client.isValidToken(); - if (validToken){ - nameAndPasswordPref.setSummary(settings.USER_DISPLAY_NAME.get()); - + if (validToken || isLoginExists()) { + String userName = validToken ? settings.USER_DISPLAY_NAME.get() : settings.USER_NAME.get(); + nameAndPasswordPref.setVisible(true); + nameAndPasswordPref.setSummary(userName); + nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account)); } else { - nameAndPasswordPref.setSummary(settings.USER_NAME.get()); + nameAndPasswordPref.setVisible(false); } - nameAndPasswordPref.setIcon(getContentIcon(R.drawable.ic_action_user_account)); + } - boolean loginExists = !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get()); - boolean visible = validToken || loginExists; - nameAndPasswordPref.setVisible(visible); + private boolean isValidToken() { + return authorizationAdapter.isValidToken(); + } + + private boolean isLoginExists() { + return !Algorithms.isEmpty(settings.USER_NAME.get()) && !Algorithms.isEmpty(settings.USER_PASSWORD.get()); } private void setupOfflineEditingPref() { @@ -165,15 +171,15 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer return true; } } else if (OSM_LOGOUT.equals(prefId)) { - if (client.isValidToken()) { - settings.USER_ACCESS_TOKEN.set(""); - settings.USER_ACCESS_TOKEN_SECRET.set(""); + if (isValidToken()) { + settings.USER_ACCESS_TOKEN.resetToDefault(); + settings.USER_ACCESS_TOKEN_SECRET.resetToDefault(); - client.resetToken(); - client = new OsmOAuthAuthorizationAdapter(app); + authorizationAdapter.resetToken(); + authorizationAdapter = new OsmOAuthAuthorizationAdapter(app); } else { - settings.USER_NAME.set(""); - settings.USER_PASSWORD.set(""); + settings.USER_NAME.resetToDefault(); + settings.USER_PASSWORD.resetToDefault(); } app.showShortToastMessage(R.string.osm_edit_logout_success); updateAllSettings(); @@ -188,8 +194,8 @@ public class OsmEditingFragment extends BaseSettingsFragment implements OnPrefer } @Override - public void informAuthorizationPrefsUpdate() { - client = new OsmOAuthAuthorizationAdapter(app); + public void authorizationCompleted() { + authorizationAdapter = new OsmOAuthAuthorizationAdapter(app); updateAllSettings(); } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java index fbb5c3e46f..71da65bf20 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java @@ -1,6 +1,5 @@ package net.osmand.plus.osmedit; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; @@ -16,13 +15,11 @@ import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; -import androidx.fragment.app.FragmentManager; import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; @@ -398,15 +395,15 @@ public class OsmEditingPlugin extends OsmandPlugin { } @Override - public void contextMenuFragment(final Activity la, final Fragment fragment, final Object info, ContextMenuAdapter adapter) { + public void contextMenuFragment(final FragmentActivity activity, final Fragment fragment, final Object info, ContextMenuAdapter adapter) { if (fragment instanceof AvailableGPXFragment) { - adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, la) + adapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, activity) .setIcon(R.drawable.ic_action_export) .setListener(new ContextMenuAdapter.ItemClickListener() { @Override public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) { - sendGPXFiles(la, (AvailableGPXFragment) fragment, (GpxInfo) info); + sendGPXFiles(activity, (AvailableGPXFragment) fragment, (GpxInfo) info); return true; } }).createItem()); @@ -414,7 +411,7 @@ public class OsmEditingPlugin extends OsmandPlugin { } @Override - public void optionsMenuFragment(final Activity activity, final Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { + public void optionsMenuFragment(final FragmentActivity activity, final Fragment fragment, ContextMenuAdapter optionsMenuAdapter) { if (fragment instanceof AvailableGPXFragment) { final AvailableGPXFragment f = ((AvailableGPXFragment) fragment); optionsMenuAdapter.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.local_index_mi_upload_gpx, activity) @@ -440,7 +437,6 @@ public class OsmEditingPlugin extends OsmandPlugin { } } - public enum UploadVisibility implements IEnumWithResource { Public(R.string.gpxup_public), Identifiable(R.string.gpxup_identifiable), @@ -462,16 +458,16 @@ public class OsmEditingPlugin extends OsmandPlugin { } } - public boolean sendGPXFiles(final Activity la, AvailableGPXFragment f, final GpxInfo... info) { + public boolean sendGPXFiles(final FragmentActivity activity, AvailableGPXFragment fragment, final GpxInfo... info) { String name = settings.USER_NAME.get(); String pwd = settings.USER_PASSWORD.get(); String authToken = settings.USER_ACCESS_TOKEN.get(); if ((Algorithms.isEmpty(name) || Algorithms.isEmpty(pwd)) && Algorithms.isEmpty(authToken)) { - LoginBottomSheetFragment.showInstance(f.getFragmentManager(), f.getTargetFragment()); + LoginBottomSheetFragment.showInstance(activity.getSupportFragmentManager(), fragment.getTargetFragment()); return false; } - AlertDialog.Builder bldr = new AlertDialog.Builder(la); - LayoutInflater inflater = (LayoutInflater) la.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View view = inflater.inflate(R.layout.send_gpx_osm, null); final EditText descr = (EditText) view.findViewById(R.id.memory_size); if (info.length > 0 && info[0].getFileName() != null) { @@ -480,23 +476,23 @@ public class OsmEditingPlugin extends OsmandPlugin { } final EditText tags = (EditText) view.findViewById(R.id.TagsText); final Spinner visibility = ((Spinner) view.findViewById(R.id.Visibility)); - EnumAdapter adapter = new EnumAdapter<>(la, android.R.layout.simple_spinner_item, UploadVisibility.values()); + EnumAdapter adapter = new EnumAdapter<>(activity, android.R.layout.simple_spinner_item, UploadVisibility.values()); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); visibility.setAdapter(adapter); visibility.setSelection(0); - bldr.setView(view); - bldr.setNegativeButton(R.string.shared_string_no, null); - bldr.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() { + builder.setView(view); + builder.setNegativeButton(R.string.shared_string_no, null); + builder.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - new UploadGPXFilesTask(la, descr.getText().toString(), tags.getText().toString(), + new UploadGPXFilesTask(activity, descr.getText().toString(), tags.getText().toString(), (UploadVisibility) visibility.getItemAtPosition(visibility.getSelectedItemPosition()) ).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, info); } }); - bldr.show(); + builder.show(); return true; } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java b/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java index 3fc06f1b8b..5dabe123b4 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/ValidateOsmLoginDetailsTask.java @@ -2,32 +2,23 @@ package net.osmand.plus.osmedit; import android.os.AsyncTask; -import net.osmand.plus.GpxSelectionHelper; +import androidx.annotation.NonNull; + import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.R; import net.osmand.plus.osmedit.OsmBugsUtil.OsmBugResult; -import java.lang.ref.WeakReference; - public class ValidateOsmLoginDetailsTask extends AsyncTask { private OsmandApplication app; - private ValidateOsmLoginListener validateOsmLoginListener; + private ValidateOsmLoginListener validateListener; - public interface ValidateOsmLoginListener { - - void loginValidationFinished(String error); - - } - - public ValidateOsmLoginDetailsTask(OsmandApplication app, ValidateOsmLoginListener validateTargetOsmLoginDetailsTask ) { + public ValidateOsmLoginDetailsTask(@NonNull OsmandApplication app, ValidateOsmLoginListener validateListener) { this.app = app; - this.validateOsmLoginListener = validateTargetOsmLoginDetailsTask; + this.validateListener = validateListener; } - - @Override protected OsmBugResult doInBackground(Void... params) { OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); @@ -39,14 +30,20 @@ public class ValidateOsmLoginDetailsTask extends AsyncTask