From b7f48d354d70157ab5cc51988fd7c475248bf74b Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Sun, 3 Jul 2022 13:07:02 +0300 Subject: [PATCH] [android] Replace PendingIntent with Activity.setResult() PendingIntent is too low-level mechanism for this task. Activity.setResult() is easier to use for API callers. Signed-off-by: Roman Tsisyk --- .../maps/DownloadResourcesLegacyActivity.java | 26 +++++- .../src/com/mapswithme/maps/MwmActivity.java | 1 - .../com/mapswithme/maps/SplashActivity.java | 23 +++++ .../src/com/mapswithme/maps/api/Const.java | 2 - .../mapswithme/maps/api/ParsedMwmRequest.java | 88 +------------------ .../com/mapswithme/maps/intent/Factory.java | 7 +- .../FloatingSearchToolbarController.java | 5 +- .../mapswithme/maps/search/SearchEngine.java | 2 +- .../maps/widget/placepage/PlacePageView.java | 25 ++++-- 9 files changed, 73 insertions(+), 106 deletions(-) diff --git a/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java index 6a74688190..a1dbaeba6d 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import com.mapswithme.maps.api.ParsedMwmRequest; import com.mapswithme.maps.base.BaseMwmFragmentActivity; import com.mapswithme.maps.dialog.AlertDialog; import com.mapswithme.maps.dialog.AlertDialogCallback; @@ -44,6 +45,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp private static final String ERROR_LOADING_DIALOG_TAG = "error_loading_dialog"; private static final int ERROR_LOADING_DIALOG_REQ_CODE = 234; + private static final int REQ_CODE_API_RESULT = 10; + public static final String EXTRA_COUNTRY = "country"; // Error codes, should match the same codes in JNI @@ -89,7 +92,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp private final IntentProcessor[] mIntentProcessors = { new Factory.GeoIntentProcessor(), new Factory.HttpGeoIntentProcessor(), - new Factory.MapsWithMeIntentProcessor(), + new Factory.ApiIntentProcessor(), new Factory.HttpMapsIntentProcessor(), new Factory.OpenCountryTaskProcessor(), new Factory.KmzKmlProcessor(this), @@ -390,13 +393,32 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity imp intent.putExtra(MwmActivity.EXTRA_TASK, mMapTaskToForward); intent.putExtra(MwmActivity.EXTRA_LAUNCH_BY_DEEP_LINK, true); mMapTaskToForward = null; + + if (ParsedMwmRequest.getCurrentRequest() != null) + { + // Wait for the result from MwmActivity for API callers. + startActivityForResult(intent, REQ_CODE_API_RESULT); + return; + } } startActivity(intent); - finish(); } + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case REQ_CODE_API_RESULT: + setResult(resultCode, data); + finish(); + break; + default: + super.onActivityResult(requestCode, resultCode, data); + } + } + private void finishFilesDownload(int result) { if (result == ERR_NO_MORE_FILES) diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 9b26d3660d..08f031a981 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -1127,7 +1127,6 @@ public class MwmActivity extends BaseMwmFragmentActivity if (request == null) return; - request.setPointData(object.getLat(), object.getLon(), object.getTitle(), object.getApiId()); object.setSubtitle(request.getTitle()); } } diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java index fc091b66dc..bad6c15e54 100644 --- a/android/src/com/mapswithme/maps/SplashActivity.java +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -12,6 +12,7 @@ import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import com.mapswithme.maps.api.Const; import com.mapswithme.maps.base.BaseActivity; import com.mapswithme.maps.base.BaseActivityDelegate; import com.mapswithme.maps.location.LocationHelper; @@ -29,6 +30,8 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start"; public static final String EXTRA_INITIAL_INTENT = "extra_initial_intent"; private static final int REQUEST_PERMISSIONS = 1; + private static final int REQ_CODE_API_RESULT = 10; + private static final long DELAY = 100; private boolean mCanceled = false; @@ -190,12 +193,32 @@ public class SplashActivity extends AppCompatActivity implements BaseActivity input.getParcelableExtra(EXTRA_INITIAL_INTENT) : input; result.putExtra(EXTRA_INITIAL_INTENT, initialIntent); + if (Const.ACTION_MWM_REQUEST.equals(initialIntent.getAction())) + { + // Wait for the result from MwmActivity for API callers. + startActivityForResult(result, REQ_CODE_API_RESULT); + return; + } } Counters.setFirstStartDialogSeen(this); startActivity(result); finish(); } + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case REQ_CODE_API_RESULT: + // Propagate the result to API callers + setResult(resultCode, data); + finish(); + break; + default: + super.onActivityResult(requestCode, resultCode, data); + } + } + @Override @NonNull public Activity get() diff --git a/android/src/com/mapswithme/maps/api/Const.java b/android/src/com/mapswithme/maps/api/Const.java index 27d88dd6af..bfa8dd4727 100644 --- a/android/src/com/mapswithme/maps/api/Const.java +++ b/android/src/com/mapswithme/maps/api/Const.java @@ -7,8 +7,6 @@ public class Const static final String AUTHORITY = "com.mapswithme.maps.api"; public static final String EXTRA_URL = AUTHORITY + ".url"; public static final String EXTRA_TITLE = AUTHORITY + ".title"; - public static final String EXTRA_HAS_PENDING_INTENT = AUTHORITY + ".has_pen_intent"; - public static final String EXTRA_CALLER_PENDING_INTENT = AUTHORITY + ".pending_intent"; public static final String EXTRA_PICK_POINT = AUTHORITY + ".pick_point"; diff --git a/android/src/com/mapswithme/maps/api/ParsedMwmRequest.java b/android/src/com/mapswithme/maps/api/ParsedMwmRequest.java index 2618f22bca..95cd4e5650 100644 --- a/android/src/com/mapswithme/maps/api/ParsedMwmRequest.java +++ b/android/src/com/mapswithme/maps/api/ParsedMwmRequest.java @@ -1,12 +1,6 @@ package com.mapswithme.maps.api; -import android.app.Activity; -import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; -import android.text.TextUtils; - -import com.mapswithme.maps.Framework; public class ParsedMwmRequest { @@ -15,33 +9,13 @@ public class ParsedMwmRequest // title private String mTitle; - // pending intent to call back - private PendingIntent mPendingIntent; // pick point mode private boolean mPickPoint; - // response data - private boolean mHasPoint; - private double mLat; - private double mLon; - private double mZoomLevel; - - private String mName; - private String mId; - - - public double getLat() { return mLat; } - - public double getLon() { return mLon; } - - public String getName() { return mName;} - - public static boolean isPickPointMode() { return hasRequest() && getCurrentRequest().mPickPoint; } + public boolean isPickPointMode() { return mPickPoint; } public static ParsedMwmRequest getCurrentRequest() { return sCurrentRequest; } - public static boolean hasRequest() { return sCurrentRequest != null; } - public static void setCurrentRequest(ParsedMwmRequest request) { sCurrentRequest = request; } /** @@ -54,9 +28,6 @@ public class ParsedMwmRequest request.mTitle = data.getStringExtra(Const.EXTRA_TITLE); request.mPickPoint = data.getBooleanExtra(Const.EXTRA_PICK_POINT, false); - if (data.getBooleanExtra(Const.EXTRA_HAS_PENDING_INTENT, false)) - request.mPendingIntent = data.getParcelableExtra(Const.EXTRA_CALLER_PENDING_INTENT); - return request; } @@ -64,63 +35,6 @@ public class ParsedMwmRequest public String getTitle() { return mTitle; } - // Request data - public boolean hasPoint() - { - return mHasPoint; - } - - public void setHasPoint(boolean hasPoint) { mHasPoint = hasPoint; } - - public boolean hasPendingIntent() { return mPendingIntent != null; } - - public void setPointData(double lat, double lon, String name, String id) - { - mLat = lat; - mLon = lon; - mName = name; - mId = id; - } - - public boolean sendResponse(Context context, boolean success) - { - if (hasPendingIntent()) - { - mZoomLevel = Framework.nativeGetDrawScale(); - final Intent i = new Intent(); - if (success) - { - i.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LAT, mLat) - .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LON, mLon) - .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_NAME, mName) - .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_ID, mId) - .putExtra(Const.EXTRA_MWM_RESPONSE_ZOOM, mZoomLevel); - } - try - { - mPendingIntent.send(context, success ? Activity.RESULT_OK : Activity.RESULT_CANCELED, i); - return true; - } catch (final Exception e) - { - e.printStackTrace(); - } - } - return false; - } - - public void sendResponseAndFinish(final Activity activity, final boolean success) - { - activity.runOnUiThread(new Runnable() - { - @Override - public void run() - { - sendResponse(activity, success); - activity.finish(); - } - }); - } - /** * Do not use constructor externally. Use {@link ParsedMwmRequest#extractFromIntent(android.content.Intent)} instead. */ diff --git a/android/src/com/mapswithme/maps/intent/Factory.java b/android/src/com/mapswithme/maps/intent/Factory.java index 683581aed6..246d514d06 100644 --- a/android/src/com/mapswithme/maps/intent/Factory.java +++ b/android/src/com/mapswithme/maps/intent/Factory.java @@ -48,6 +48,9 @@ public class Factory final String scheme = intent.getScheme(); if (!"geo".equals(scheme) && !"ge0".equals(scheme) && !"om".equals(scheme) && !"mapsme".equals(scheme)) return null; + SearchEngine.INSTANCE.cancelInteractiveSearch(); + final ParsedMwmRequest request = ParsedMwmRequest.extractFromIntent(intent); + ParsedMwmRequest.setCurrentRequest(request); return new OpenUrlTask(uri.toString()); } } @@ -77,7 +80,7 @@ public class Factory /** * Use this to invoke API task. */ - public static class MapsWithMeIntentProcessor implements IntentProcessor + public static class ApiIntentProcessor implements IntentProcessor { @Nullable @Override @@ -94,7 +97,7 @@ public class Factory final ParsedMwmRequest request = ParsedMwmRequest.extractFromIntent(intent); ParsedMwmRequest.setCurrentRequest(request); - if (!ParsedMwmRequest.isPickPointMode()) + if (request.isPickPointMode()) return new OpenUrlTask(apiUrl); } diff --git a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java index 1c606f1095..db81a8f109 100644 --- a/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java +++ b/android/src/com/mapswithme/maps/search/FloatingSearchToolbarController.java @@ -56,8 +56,9 @@ public class FloatingSearchToolbarController extends SearchToolbarController public void refreshQuery() { showProgress(false); - CharSequence query = ParsedMwmRequest.hasRequest() ? - ParsedMwmRequest.getCurrentRequest().getTitle() + final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); + CharSequence query = request != null ? + request.getTitle() : SearchEngine.INSTANCE.getQuery(); if (!TextUtils.isEmpty(query)) diff --git a/android/src/com/mapswithme/maps/search/SearchEngine.java b/android/src/com/mapswithme/maps/search/SearchEngine.java index 86e4af915f..78ea5af352 100644 --- a/android/src/com/mapswithme/maps/search/SearchEngine.java +++ b/android/src/com/mapswithme/maps/search/SearchEngine.java @@ -177,7 +177,7 @@ public enum SearchEngine implements NativeSearchListener, @MainThread private static void cancelApiCall() { - if (ParsedMwmRequest.hasRequest()) + if (ParsedMwmRequest.getCurrentRequest() != null) ParsedMwmRequest.setCurrentRequest(null); Framework.nativeClearApiPoints(); } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index d737b46531..741031faa8 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -1,6 +1,8 @@ package com.mapswithme.maps.widget.placepage; +import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.content.res.Resources; import android.content.res.TypedArray; import android.location.Location; @@ -36,6 +38,7 @@ import com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmActivity; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; +import com.mapswithme.maps.api.Const; import com.mapswithme.maps.api.ParsedMwmRequest; import com.mapswithme.maps.bookmarks.data.Bookmark; import com.mapswithme.maps.bookmarks.data.BookmarkManager; @@ -529,16 +532,19 @@ public class PlacePageView extends NestedScrollViewClickFixed return; } - if (ParsedMwmRequest.hasRequest()) + final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); + if (request != null && request.isPickPointMode()) { - ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); - if (ParsedMwmRequest.isPickPointMode()) - request.setPointData(mMapObject.getLat(), mMapObject.getLon(), mMapObject.getTitle(), ""); - - request.sendResponseAndFinish(getActivity(), true); + final Intent result = new Intent(); + result.putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LAT, mMapObject.getLat()) + .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_LON, mMapObject.getLon()) + .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_NAME, mMapObject.getTitle()) + .putExtra(Const.EXTRA_MWM_RESPONSE_POINT_ID, mMapObject.getApiId()) + .putExtra(Const.EXTRA_MWM_RESPONSE_ZOOM, Framework.nativeGetDrawScale()); + getActivity().setResult(Activity.RESULT_OK, result); + ParsedMwmRequest.setCurrentRequest(null); } - else - getActivity().finish(); + getActivity().finish(); } private void onRouteFromBtnClicked() @@ -1139,7 +1145,8 @@ public class PlacePageView extends NestedScrollViewClickFixed return; } - if (showBackButton || ParsedMwmRequest.isPickPointMode()) + final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); + if (showBackButton || (request != null && request.isPickPointMode())) buttons.add(PlacePageButtons.Item.BACK); final boolean hasNumber = mapObject.hasPhoneNumber();