diff --git a/android/app/src/main/cpp/app/organicmaps/Framework.cpp b/android/app/src/main/cpp/app/organicmaps/Framework.cpp index bf58b55cb3..3212543824 100644 --- a/android/app/src/main/cpp/app/organicmaps/Framework.cpp +++ b/android/app/src/main/cpp/app/organicmaps/Framework.cpp @@ -858,7 +858,15 @@ Java_app_organicmaps_Framework_nativeGetParsedSearchRequest(JNIEnv * env, jclass JNIEXPORT jstring JNICALL Java_app_organicmaps_Framework_nativeGetParsedAppName(JNIEnv * env, jclass) { - return jni::ToJavaString(env, frm()->GetParsedAppName()); + std::string const & appName = frm()->GetParsedAppName(); + return (appName.empty()) ? nullptr : jni::ToJavaString(env, appName); +} + +JNIEXPORT jstring JNICALL +Java_app_organicmaps_Framework_nativeGetParsedBackUrl(JNIEnv * env, jclass) +{ + std::string const & backUrl = frm()->GetParsedBackUrl(); + return (backUrl.empty()) ? nullptr : jni::ToJavaString(env, backUrl); } JNIEXPORT jdoubleArray JNICALL diff --git a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java index 52eeaf0b3c..3ec75c2a02 100644 --- a/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java +++ b/android/app/src/main/java/app/organicmaps/DownloadResourcesLegacyActivity.java @@ -21,13 +21,10 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.StyleRes; -import app.organicmaps.api.ParsedMwmRequest; import app.organicmaps.base.BaseMwmFragmentActivity; import app.organicmaps.downloader.CountryItem; import app.organicmaps.downloader.MapManager; import app.organicmaps.intent.Factory; -import app.organicmaps.intent.IntentProcessor; -import app.organicmaps.intent.MapTask; import app.organicmaps.location.LocationHelper; import app.organicmaps.location.LocationListener; import app.organicmaps.util.Config; @@ -35,7 +32,6 @@ import app.organicmaps.util.ConnectionState; import app.organicmaps.util.StringUtils; import app.organicmaps.util.UiUtils; import app.organicmaps.util.Utils; -import app.organicmaps.util.log.Logger; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.List; @@ -45,8 +41,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity { private static final String TAG = DownloadResourcesLegacyActivity.class.getSimpleName(); - public static final String EXTRA_COUNTRY = "country"; - // Error codes, should match the same codes in JNI private static final int ERR_DOWNLOAD_SUCCESS = 0; private static final int ERR_DISK_ERROR = -1; @@ -62,8 +56,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity private CheckBox mChbDownloadCountry; private String mCurrentCountry; - @Nullable - private MapTask mMapTaskToForward; @Nullable private Dialog mAlertDialog; @@ -98,15 +90,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity void onFinish(int errorCode); } - @NonNull - private final IntentProcessor[] mIntentProcessors = { - new Factory.GeoIntentProcessor(), - new Factory.HttpGeoIntentProcessor(), - new Factory.HttpMapsIntentProcessor(), - new Factory.OpenCountryTaskProcessor(), - new Factory.KmzKmlProcessor(this), - }; - private final LocationListener mLocationListener = new LocationListener() { @Override @@ -221,7 +204,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity return; } - mMapTaskToForward = processIntent(); showMap(); } @@ -371,19 +353,14 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity // Disable animation because MwmActivity should appear exactly over this one intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_CLEAR_TOP); - // Add saved task to forward to map activity. - if (mMapTaskToForward != null) + // See {@link SplashActivity.processNavigation()} + final Intent initialIntent = getIntent(); + intent.putExtra(SplashActivity.EXTRA_INITIAL_INTENT, initialIntent); + if (Factory.isStartedForApiResult(initialIntent)) { - 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. - mApiRequest.launch(intent); - return; - } + // Wait for the result from MwmActivity for API callers. + mApiRequest.launch(intent); + return; } startActivity(intent); @@ -412,7 +389,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity else { mAreResourcesDownloaded = true; - mMapTaskToForward = processIntent(); showMap(); } } @@ -422,26 +398,6 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity } } - @Nullable - private MapTask processIntent() - { - final Intent intent = getIntent(); - if (intent == null) - return null; - - String msg = "Incoming intent uri: " + intent; - Logger.i(TAG, msg); - - MapTask mapTaskToForward; - for (IntentProcessor ip : mIntentProcessors) - { - if ((mapTaskToForward = ip.process(intent)) != null) - return mapTaskToForward; - } - - return null; - } - private void showErrorDialog(int result) { if (mAlertDialog != null && mAlertDialog.isShowing()) diff --git a/android/app/src/main/java/app/organicmaps/Framework.java b/android/app/src/main/java/app/organicmaps/Framework.java index c5f7277883..8d4fa657db 100644 --- a/android/app/src/main/java/app/organicmaps/Framework.java +++ b/android/app/src/main/java/app/organicmaps/Framework.java @@ -230,9 +230,10 @@ public class Framework public static native ParsingResult nativeParseAndSetApiUrl(String url); public static native ParsedRoutingData nativeGetParsedRoutingData(); public static native ParsedSearchRequest nativeGetParsedSearchRequest(); - public static native String nativeGetParsedAppName(); + public static native @Nullable String nativeGetParsedAppName(); @Size(2) public static native double[] nativeGetParsedCenterLatLon(); + public static native @Nullable String nativeGetParsedBackUrl(); public static native void nativeDeactivatePopup(); diff --git a/android/app/src/main/java/app/organicmaps/MapPlaceholderActivity.java b/android/app/src/main/java/app/organicmaps/MapPlaceholderActivity.java index 344dcc0451..44fb128a20 100644 --- a/android/app/src/main/java/app/organicmaps/MapPlaceholderActivity.java +++ b/android/app/src/main/java/app/organicmaps/MapPlaceholderActivity.java @@ -34,7 +34,7 @@ public class MapPlaceholderActivity extends BaseMwmFragmentActivity implements D public void onDisplayChangedToDevice(@NonNull Runnable onTaskFinishedCallback) { mRemoveDisplayListener = false; - startActivity(new Intent(this, MwmActivity.class).putExtra(MwmActivity.EXTRA_UPDATE_THEME, true)); + startActivity(new Intent(this, MwmActivity.class)); finish(); onTaskFinishedCallback.run(); } diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index ce6d7b6866..115707a5eb 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -34,6 +34,7 @@ import androidx.annotation.UiThread; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; +import androidx.core.content.IntentCompat; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; @@ -66,7 +67,7 @@ import app.organicmaps.editor.FeatureCategoryActivity; import app.organicmaps.editor.ReportFragment; import app.organicmaps.help.HelpActivity; import app.organicmaps.intent.Factory; -import app.organicmaps.intent.MapTask; +import app.organicmaps.intent.IntentProcessor; import app.organicmaps.location.LocationHelper; import app.organicmaps.location.LocationListener; import app.organicmaps.location.LocationState; @@ -115,12 +116,12 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.ArrayList; import java.util.Objects; -import java.util.Stack; import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.POST_NOTIFICATIONS; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static app.organicmaps.SplashActivity.EXTRA_INITIAL_INTENT; import static app.organicmaps.location.LocationState.FOLLOW; import static app.organicmaps.location.LocationState.FOLLOW_AND_ROTATE; import static app.organicmaps.location.LocationState.LOCATION_TAG; @@ -144,10 +145,10 @@ public class MwmActivity extends BaseMwmFragmentActivity { private static final String TAG = MwmActivity.class.getSimpleName(); - public static final String EXTRA_TASK = "map_task"; - public static final String EXTRA_LAUNCH_BY_DEEP_LINK = "launch_by_deep_link"; - public static final String EXTRA_BACK_URL = "backurl"; - public static final String EXTRA_UPDATE_THEME = "update_theme"; + public static final String EXTRA_COUNTRY_ID = "country_id"; + public static final String EXTRA_CATEGORY_ID = "category_id"; + public static final String EXTRA_BOOKMARK_ID = "bookmark_id"; + public static final String EXTRA_TRACK_ID = "track_id"; private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed"; private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(), @@ -161,9 +162,6 @@ public class MwmActivity extends BaseMwmFragmentActivity private static final String MAIN_MENU_ID = "MAIN_MENU_BOTTOM_SHEET"; private static final String LAYERS_MENU_ID = "LAYERS_MENU_BOTTOM_SHEET"; - // Map tasks that we run AFTER rendering initialized - private final Stack mTasks = new Stack<>(); - @Nullable private MapFragment mMapFragment; @@ -236,7 +234,13 @@ public class MwmActivity extends BaseMwmFragmentActivity public static Intent createShowMapIntent(@NonNull Context context, @Nullable String countryId) { return new Intent(context, DownloadResourcesLegacyActivity.class) - .putExtra(DownloadResourcesLegacyActivity.EXTRA_COUNTRY, countryId); + .putExtra(EXTRA_COUNTRY_ID, countryId); + } + + @Override + public void onRenderingRestored() + { + processIntent(); } @Override @@ -245,25 +249,78 @@ public class MwmActivity extends BaseMwmFragmentActivity checkMeasurementSystem(); } - @Override - public void onRenderingRestored() - { - runTasks(); - } - // Called from JNI. @Override @Keep @SuppressWarnings("unused") public void onRenderingInitializationFinished() { - runTasks(); + ThemeSwitcher.INSTANCE.restart(true); + + autostartLocation(); + + if (RoutingController.get().isPlanning()) + onPlanningStarted(); + else if (RoutingController.get().isNavigating()) + onNavigationStarted(); + else if (RoutingController.get().hasSavedRoute()) + RoutingController.get().restoreRoute(); + + processIntent(); } - private void runTasks() + /** + * Process intents AFTER rendering is initialized. + */ + private void processIntent() { - while (!mTasks.isEmpty()) - mTasks.pop().run(this); + if (!isMapRendererActive()) + throw new AssertionError("Must be called when rendering is active"); + + final Intent intent = getIntent(); + if (intent == null || intent.getBooleanExtra(EXTRA_CONSUMED, false)) + return; + intent.putExtra(EXTRA_CONSUMED, true); + + final long categoryId = intent.getLongExtra(EXTRA_CATEGORY_ID, -1); + final long bookmarkId = intent.getLongExtra(EXTRA_BOOKMARK_ID, -1); + final long trackId = intent.getLongExtra(EXTRA_TRACK_ID, -1); + if (bookmarkId != -1) + { + Objects.requireNonNull(BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId)); + BookmarkManager.INSTANCE.showBookmarkOnMap(bookmarkId); + return; + } + else if (trackId != -1) + { + Objects.requireNonNull(BookmarkManager.INSTANCE.getTrack(trackId)); + Framework.nativeShowTrackRect(trackId); + return; + } + else if (categoryId != -1) + { + BookmarkManager.INSTANCE.showBookmarkCategoryOnMap(categoryId); + return; + } + + final String countryId = intent.getStringExtra(EXTRA_COUNTRY_ID); + if (countryId != null) + { + Framework.nativeShowCountry(countryId, false); + return; + } + + final IntentProcessor[] mIntentProcessors = { + new Factory.GeoIntentProcessor(), + new Factory.HttpGeoIntentProcessor(), + new Factory.HttpMapsIntentProcessor(), + new Factory.KmzKmlProcessor(), + }; + for (IntentProcessor ip : mIntentProcessors) + { + if (ip.process(intent, this)) + break; + } } private static void checkMeasurementSystem() @@ -443,7 +500,8 @@ public class MwmActivity extends BaseMwmFragmentActivity mDisplayManager = DisplayManager.from(this); mDisplayManager.addListener(DisplayType.Device, this); - boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false); + final Intent intent = getIntent(); + boolean isLaunchByDeepLink = intent != null && !intent.hasCategory(Intent.CATEGORY_LAUNCHER); initViews(isLaunchByDeepLink); updateViewsInsets(); @@ -454,25 +512,6 @@ public class MwmActivity extends BaseMwmFragmentActivity this::onLocationResolutionResult); mPostNotificationPermissionRequest = registerForActivityResult(new ActivityResultContracts.RequestPermission(), this::onPostNotificationPermissionResult); - - boolean isConsumed = savedInstanceState == null && processIntent(getIntent()); - // If the map activity is launched by any incoming intent (deeplink, update maps event, etc) - // or it's the first launch (onboarding) we haven't to try restoring the route, - // showing the tips, etc. - if (isConsumed || Config.isFirstLaunch(this)) - return; - - if (RoutingController.get().isPlanning()) - onPlanningStarted(); - else if (RoutingController.get().isNavigating()) - onNavigationStarted(); - else if (savedInstanceState == null && RoutingController.get().hasSavedRoute()) - addTask(new Factory.RestoreRouteTask()); - - autostartLocation(); - - if (getIntent().getBooleanExtra(EXTRA_UPDATE_THEME, false)) - ThemeSwitcher.INSTANCE.restart(isMapRendererActive()); } private void refreshLightStatusBar() @@ -601,7 +640,7 @@ public class MwmActivity extends BaseMwmFragmentActivity mSearchController.show(); } - public void showPositionChooserForAPI(String appName) + public void showPositionChooserForAPI(@Nullable String appName) { showPositionChooser(Framework.ChoosePositionMode.API, false, false); if (!TextUtils.isEmpty(appName)) @@ -970,43 +1009,16 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); + // {@link see BaseMwmFragmentActivity.onCreate()} + final Intent initialIntent = IntentCompat.getParcelableExtra(intent, EXTRA_INITIAL_INTENT, Intent.class); + if (initialIntent != null) + intent = initialIntent; setIntent(intent); - processIntent(intent); + super.onNewIntent(intent); + if (isMapRendererActive()) + processIntent(); } - private boolean processIntent(Intent intent) - { - if (intent == null) - return false; - - if (intent.hasExtra(EXTRA_TASK)) - { - addTask(intent); - return true; - } - - return false; - } - - private void addTask(Intent intent) - { - if (intent != null && - !intent.getBooleanExtra(EXTRA_CONSUMED, false) && - intent.hasExtra(EXTRA_TASK) && - ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)) - { - final MapTask mapTask = (MapTask) intent.getSerializableExtra(EXTRA_TASK); - mTasks.add(mapTask); - intent.removeExtra(EXTRA_TASK); - - if (isMapRendererActive()) - runTasks(); - - // mark intent as consumed - intent.putExtra(EXTRA_CONSUMED, true); - } - } private boolean isMapRendererActive() { @@ -1014,13 +1026,6 @@ public class MwmActivity extends BaseMwmFragmentActivity && mMapFragment.isContextCreated(); } - private void addTask(MapTask task) - { - mTasks.add(task); - if (isMapRendererActive()) - runTasks(); - } - @CallSuper @Override protected void onResume() @@ -1097,6 +1102,10 @@ public class MwmActivity extends BaseMwmFragmentActivity IsolinesManager.from(getApplicationContext()).detach(); mSearchController.detach(); Utils.keepScreenOn(false, getWindow()); + + final String backUrl = Framework.nativeGetParsedBackUrl(); + if (!TextUtils.isEmpty(backUrl)) + Utils.openUri(this, Uri.parse(backUrl)); } @CallSuper @@ -1413,7 +1422,7 @@ public class MwmActivity extends BaseMwmFragmentActivity if (height != 0) offset = height; } - adjustCompassAndTraffic(offset); + updateCompassOffset(offset); } @Override @@ -1442,7 +1451,7 @@ public class MwmActivity extends BaseMwmFragmentActivity else { if (mIsTabletLayout && mCurrentWindowInsets != null) - adjustCompassAndTraffic(mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top); + updateCompassOffset(mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top); else if (!mIsTabletLayout) mRoutingPlanInplaceController.show(false); @@ -1453,21 +1462,6 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - private void adjustCompassAndTraffic(final int offsetY) - { - addTask(new MapTask() - { - private static final long serialVersionUID = 9177064181621376624L; - - @Override - public boolean run(@NonNull MwmActivity target) - { - updateCompassOffset(offsetY); - return true; - } - }); - } - @Override public void showNavigation(boolean show) { @@ -1826,6 +1820,9 @@ public class MwmActivity extends BaseMwmFragmentActivity */ private void autostartLocation() { + if (!isMapRendererActive()) + throw new AssertionError("Must be called when rendering is active"); + if (LocationState.nativeGetMode() == LocationState.NOT_FOLLOW_NO_POSITION) { Logger.i(LOCATION_TAG, "Location updates are stopped by the user manually."); @@ -2100,43 +2097,19 @@ public class MwmActivity extends BaseMwmFragmentActivity Map.zoomIn(); return true; case KeyEvent.KEYCODE_ESCAPE: - Intent currIntent = getIntent(); - if (currIntent == null || !currIntent.hasExtra(EXTRA_BACK_URL)) - return super.onKeyUp(keyCode, event); - - String backUrl = currIntent.getStringExtra(EXTRA_BACK_URL); - if (TextUtils.isEmpty(backUrl)) - return super.onKeyUp(keyCode, event); - - Uri back_uri = Uri.parse(backUrl); - if (back_uri == null) - return super.onKeyUp(keyCode, event); - - return Utils.openUri(this, back_uri); + final Intent currIntent = getIntent(); + final String backUrl = Framework.nativeGetParsedBackUrl(); + if (TextUtils.isEmpty(backUrl) || (currIntent != null && Factory.isStartedForApiResult(currIntent))) + { + finish(); + return true; + } + return super.onKeyUp(keyCode, event); default: return super.onKeyUp(keyCode, event); } } - public void showTrackOnMap(long trackId) - { - Track track = BookmarkManager.INSTANCE.getTrack(trackId); - Objects.requireNonNull(track); - Framework.nativeShowTrackRect(trackId); - } - - public void showBookmarkOnMap(long bookmarkId) - { - BookmarkInfo info = BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId); - Objects.requireNonNull(info); - BookmarkManager.INSTANCE.showBookmarkOnMap(bookmarkId); - } - - public void showBookmarkCategoryOnMap(long categoryId) - { - BookmarkManager.INSTANCE.showBookmarkCategoryOnMap(categoryId); - } - public void onAddPlaceOptionSelected() { closeFloatingPanels(); diff --git a/android/app/src/main/java/app/organicmaps/SplashActivity.java b/android/app/src/main/java/app/organicmaps/SplashActivity.java index a6fc6267f2..82affdb722 100644 --- a/android/app/src/main/java/app/organicmaps/SplashActivity.java +++ b/android/app/src/main/java/app/organicmaps/SplashActivity.java @@ -15,8 +15,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.IntentCompat; import app.organicmaps.display.DisplayManager; +import app.organicmaps.intent.Factory; import app.organicmaps.location.LocationHelper; import app.organicmaps.util.Config; import app.organicmaps.util.LocationUtils; @@ -190,12 +192,11 @@ public class SplashActivity extends AppCompatActivity } Intent initialIntent = input.hasExtra(EXTRA_INITIAL_INTENT) ? - input.getParcelableExtra(EXTRA_INITIAL_INTENT) : + IntentCompat.getParcelableExtra(input, EXTRA_INITIAL_INTENT, Intent.class) : input; result.putExtra(EXTRA_INITIAL_INTENT, initialIntent); - if (!initialIntent.hasCategory(Intent.CATEGORY_LAUNCHER)) + if (Factory.isStartedForApiResult(initialIntent)) { - /// @todo Is it ok that we don't call setFirstStartDialogSeen here? // Wait for the result from MwmActivity for API callers. mApiRequest.launch(result); return; diff --git a/android/app/src/main/java/app/organicmaps/api/ParsedMwmRequest.java b/android/app/src/main/java/app/organicmaps/api/ParsedMwmRequest.java deleted file mode 100644 index b86f0f1373..0000000000 --- a/android/app/src/main/java/app/organicmaps/api/ParsedMwmRequest.java +++ /dev/null @@ -1,35 +0,0 @@ -package app.organicmaps.api; - -import android.content.Intent; - -public class ParsedMwmRequest -{ - - private static volatile ParsedMwmRequest sCurrentRequest; - - // pick point mode - private boolean mPickPoint; - - public boolean isPickPointMode() { return mPickPoint; } - - public static ParsedMwmRequest getCurrentRequest() { return sCurrentRequest; } - - public static void setCurrentRequest(ParsedMwmRequest request) { sCurrentRequest = request; } - - /** - * Build request from intent extras. - */ - public static ParsedMwmRequest extractFromIntent(Intent data) - { - final ParsedMwmRequest request = new ParsedMwmRequest(); - - request.mPickPoint = data.getBooleanExtra(Const.EXTRA_PICK_POINT, false); - - return request; - } - - /** - * Do not use constructor externally. Use {@link ParsedMwmRequest#extractFromIntent(android.content.Intent)} instead. - */ - private ParsedMwmRequest() {} -} diff --git a/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java b/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java index af4c9a2fa3..af33425a51 100644 --- a/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java +++ b/android/app/src/main/java/app/organicmaps/base/BaseMwmFragmentActivity.java @@ -1,5 +1,7 @@ package app.organicmaps.base; +import static app.organicmaps.SplashActivity.EXTRA_INITIAL_INTENT; + import android.content.Context; import android.content.Intent; import android.media.AudioManager; @@ -12,6 +14,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StyleRes; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.content.IntentCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentFactory; import androidx.fragment.app.FragmentManager; @@ -65,9 +68,13 @@ public abstract class BaseMwmFragmentActivity extends AppCompatActivity // An intent that was skipped due to core wasn't initialized has to be used // as a target intent for this activity, otherwise all input extras will be lost // in a splash activity loop. - Intent initialIntent = getIntent().getParcelableExtra(SplashActivity.EXTRA_INITIAL_INTENT); - if (initialIntent != null) - setIntent(initialIntent); + final Intent intent = getIntent(); + if (intent != null) + { + final Intent initialIntent = IntentCompat.getParcelableExtra(intent, EXTRA_INITIAL_INTENT, Intent.class); + if (initialIntent != null) + setIntent(initialIntent); + } if (!MwmApplication.from(this).arePlatformAndCoreInitialized()) { diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java index 906c6935c9..451a004a4b 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/BookmarksListFragment.java @@ -236,8 +236,7 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment { final Intent i = makeMwmActivityIntent(); - i.putExtra(MwmActivity.EXTRA_TASK, - new Factory.ShowBookmarkCategoryTask(mCategoryDataSource.getData().getId())); + i.putExtra(MwmActivity.EXTRA_CATEGORY_ID, mCategoryDataSource.getData().getId()); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); }); @@ -563,16 +562,16 @@ public class BookmarksListFragment extends BaseMwmRecyclerFragment { BookmarkManager.INSTANCE.importBookmarksFile(resolver, uri, tempDir); - mActivity.runOnUiThread(mActivity::showMap); }); - return null; + return false; } } - abstract static class UrlTaskWithStatistics implements MapTask + private static class OpenUrlTask { - private static final long serialVersionUID = -8661639898700431066L; - @NonNull - private final String mUrl; - - UrlTaskWithStatistics(@NonNull String url) - { - Utils.checkNotNull(url); - mUrl = url; - } - - @NonNull - String getUrl() - { - return mUrl; - } - } - - public static class OpenHttpMapsUrlTask extends UrlTaskWithStatistics - { - OpenHttpMapsUrlTask(@NonNull String url) - { - super(url); - } - - @Override - public boolean run(@NonNull MwmActivity target) - { - return Map.showMapForUrl(getUrl()); - } - } - - public static class OpenUrlTask extends UrlTaskWithStatistics - { - private static final long serialVersionUID = -7257820771228127413L; private static final int SEARCH_IN_VIEWPORT_ZOOM = 16; - OpenUrlTask(@NonNull String url) + // TODO: will be merged into HttpMapsIntentProcessor later. + public static boolean run(@NonNull String url, @NonNull MwmActivity target) { - super(url); - } + SearchEngine.INSTANCE.cancelInteractiveSearch(); - @Override - public boolean run(@NonNull MwmActivity target) - { - final ParsingResult result = Framework.nativeParseAndSetApiUrl(getUrl()); - - final Uri uri = Uri.parse(getUrl()); - if (uri.isHierarchical()) - { - final String backUrl = uri.getQueryParameter("backurl"); - if (!TextUtils.isEmpty(backUrl)) - { - final Intent intent = target.getIntent(); - if (intent != null) - intent.putExtra(MwmActivity.EXTRA_BACK_URL, backUrl); - } - } + final ParsingResult result = Framework.nativeParseAndSetApiUrl(url); // TODO: Kernel recognizes "om://", "mapsme://", "mwm://" and "mapswithme://" schemas only!!! if (result.getUrlType() == ParsingResult.TYPE_INCORRECT) - return Map.showMapForUrl(getUrl()); + return Map.showMapForUrl(url); if (!result.isSuccess()) return false; @@ -230,7 +153,7 @@ public class Factory return false; case ParsingResult.TYPE_MAP: - return Map.showMapForUrl(getUrl()); + return Map.showMapForUrl(url); case ParsingResult.TYPE_ROUTE: final ParsedRoutingData data = Framework.nativeGetParsedRoutingData(); @@ -276,97 +199,4 @@ public class Factory return false; } } - - public static class ShowCountryTask implements MapTask { - private static final long serialVersionUID = 256630934543189768L; - private final String mCountryId; - - public ShowCountryTask(String countryId) - { - mCountryId = countryId; - } - - @Override - public boolean run(@NonNull MwmActivity target) - { - Framework.nativeShowCountry(mCountryId, false); - return true; - } - } - - public static class ShowBookmarkCategoryTask implements MapTask - { - private static final long serialVersionUID = 8285565041410550281L; - final long mCategoryId; - - public ShowBookmarkCategoryTask(long categoryId) - { - mCategoryId = categoryId; - } - - public boolean run(@NonNull MwmActivity target) - { - target.showBookmarkCategoryOnMap(mCategoryId); - return true; - } - } - - static abstract class BaseUserMarkTask implements MapTask - { - private static final long serialVersionUID = -3348320422813422144L; - final long mCategoryId; - final long mId; - - BaseUserMarkTask(long categoryId, long id) - { - mCategoryId = categoryId; - mId = id; - } - } - - public static class ShowBookmarkTask extends BaseUserMarkTask - { - private static final long serialVersionUID = 7582931785363515736L; - - public ShowBookmarkTask(long categoryId, long bookmarkId) - { - super(categoryId, bookmarkId); - } - - @Override - public boolean run(@NonNull MwmActivity target) - { - target.showBookmarkOnMap(mId); - return true; - } - } - - public static class ShowTrackTask extends BaseUserMarkTask - { - private static final long serialVersionUID = 1091286722919338991L; - - public ShowTrackTask(long categoryId, long trackId) - { - super(categoryId, trackId); - } - - @Override - public boolean run(@NonNull MwmActivity target) - { - target.showTrackOnMap(mId); - return true; - } - } - - public static class RestoreRouteTask implements MapTask - { - private static final long serialVersionUID = 6123893958975977040L; - - @Override - public boolean run(@NonNull MwmActivity target) - { - RoutingController.get().restoreRoute(); - return true; - } - } } diff --git a/android/app/src/main/java/app/organicmaps/intent/IntentProcessor.java b/android/app/src/main/java/app/organicmaps/intent/IntentProcessor.java index c6fb9199d6..9795f7be48 100644 --- a/android/app/src/main/java/app/organicmaps/intent/IntentProcessor.java +++ b/android/app/src/main/java/app/organicmaps/intent/IntentProcessor.java @@ -5,8 +5,10 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import app.organicmaps.MwmActivity; + public interface IntentProcessor { @Nullable - MapTask process(@NonNull Intent intent); + boolean process(@NonNull Intent intent, @NonNull MwmActivity activity); } diff --git a/android/app/src/main/java/app/organicmaps/intent/MapTask.java b/android/app/src/main/java/app/organicmaps/intent/MapTask.java deleted file mode 100644 index d17d090dc8..0000000000 --- a/android/app/src/main/java/app/organicmaps/intent/MapTask.java +++ /dev/null @@ -1,12 +0,0 @@ -package app.organicmaps.intent; - -import androidx.annotation.NonNull; - -import app.organicmaps.MwmActivity; - -import java.io.Serializable; - -public interface MapTask extends Serializable -{ - boolean run(@NonNull MwmActivity target); -} diff --git a/android/app/src/main/java/app/organicmaps/search/SearchEngine.java b/android/app/src/main/java/app/organicmaps/search/SearchEngine.java index ff21e5edb7..ddae8e7a88 100644 --- a/android/app/src/main/java/app/organicmaps/search/SearchEngine.java +++ b/android/app/src/main/java/app/organicmaps/search/SearchEngine.java @@ -6,7 +6,6 @@ import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import app.organicmaps.Framework; -import app.organicmaps.api.ParsedMwmRequest; import app.organicmaps.util.Language; import app.organicmaps.util.Listeners; import app.organicmaps.util.concurrency.UiThread; @@ -184,8 +183,6 @@ public enum SearchEngine implements NativeSearchListener, @MainThread private static void cancelApiCall() { - if (ParsedMwmRequest.getCurrentRequest() != null) - ParsedMwmRequest.setCurrentRequest(null); Framework.nativeClearApiPoints(); } diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java index ed9a2555c5..4d62cdefa5 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java @@ -5,6 +5,7 @@ import android.app.Activity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -25,10 +26,10 @@ import app.organicmaps.Framework; import app.organicmaps.MwmActivity; import app.organicmaps.R; import app.organicmaps.api.Const; -import app.organicmaps.api.ParsedMwmRequest; import app.organicmaps.bookmarks.data.BookmarkManager; import app.organicmaps.bookmarks.data.MapObject; import app.organicmaps.bookmarks.data.RoadWarningMarkType; +import app.organicmaps.intent.Factory; import app.organicmaps.routing.RoutingController; import app.organicmaps.settings.RoadType; import app.organicmaps.util.ThemeUtils; @@ -418,18 +419,13 @@ public class PlacePageController extends Fragment implements { if (mMapObject == null) return; - final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); - if (request != null && request.isPickPointMode()) - { - final Intent result = new Intent(); - result.putExtra(Const.EXTRA_POINT_LAT, mMapObject.getLat()) - .putExtra(Const.EXTRA_POINT_LON, mMapObject.getLon()) - .putExtra(Const.EXTRA_POINT_NAME, mMapObject.getTitle()) - .putExtra(Const.EXTRA_POINT_ID, mMapObject.getApiId()) - .putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale()); - requireActivity().setResult(Activity.RESULT_OK, result); - ParsedMwmRequest.setCurrentRequest(null); - } + final Intent result = new Intent(); + result.putExtra(Const.EXTRA_POINT_LAT, mMapObject.getLat()) + .putExtra(Const.EXTRA_POINT_LON, mMapObject.getLon()) + .putExtra(Const.EXTRA_POINT_NAME, mMapObject.getTitle()) + .putExtra(Const.EXTRA_POINT_ID, mMapObject.getApiId()) + .putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale()); + requireActivity().setResult(Activity.RESULT_OK, result); requireActivity().finish(); } @@ -550,8 +546,7 @@ public class PlacePageController extends Fragment implements } else { - final ParsedMwmRequest request = ParsedMwmRequest.getCurrentRequest(); - if (showBackButton || (request != null && request.isPickPointMode())) + if (showBackButton) buttons.add(PlacePageButtons.ButtonType.BACK); boolean needToShowRoutingButtons = RoutingController.get().isPlanning() || showRoutingButton; @@ -583,6 +578,10 @@ public class PlacePageController extends Fragment implements @Override public void onChanged(@Nullable MapObject mapObject) { + final Activity activity = requireActivity(); + final Intent intent = activity.getIntent(); + final boolean showBackButton = (intent != null && (Factory.isStartedForApiResult(intent) || + !TextUtils.isEmpty(Framework.nativeGetParsedBackUrl()))); mMapObject = mapObject; if (mapObject != null) { @@ -594,7 +593,7 @@ public class PlacePageController extends Fragment implements createPlacePageFragments(); updateButtons( mapObject, - mMapObject.isApiPoint(), + showBackButton, !mMapObject.isMyPosition()); } else diff --git a/map/framework.cpp b/map/framework.cpp index 076ef75a0a..b6b9c6eed1 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1873,6 +1873,11 @@ std::string const & Framework::GetParsedAppName() const return m_parsedMapApi.GetAppName(); } +std::string const & Framework::GetParsedBackUrl() const +{ + return m_parsedMapApi.GetGlobalBackUrl(); +} + ms::LatLon Framework::GetParsedCenterLatLon() const { return m_parsedMapApi.GetCenterLatLon(); diff --git a/map/framework.hpp b/map/framework.hpp index 25366623cc..f407d25653 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -563,6 +563,7 @@ public: ParsedRoutingData GetParsedRoutingData() const; url_scheme::SearchRequest GetParsedSearchRequest() const; std::string const & GetParsedAppName() const; + std::string const & GetParsedBackUrl() const; ms::LatLon GetParsedCenterLatLon() const; using FeatureMatcher = std::function;