diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 5bc134ec2b..fac5405035 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -143,6 +143,21 @@ android:scheme="mapswithme"/> + + + + + + + + + + + diff --git a/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java index 4cd257c83e..42f0e9d59b 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesLegacyActivity.java @@ -101,7 +101,8 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity new Ge0IntentProcessor(), new MapsWithMeIntentProcessor(), new GoogleMapsIntentProcessor(), - new LeadUrlIntentProcessor(), + new OldLeadUrlIntentProcessor(), + new DeepLinkIntentProcessor(), new OpenCountryTaskProcessor(), new KmzKmlProcessor(), new ShowOnMapProcessor(), @@ -625,7 +626,7 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity } } - private class LeadUrlIntentProcessor implements IntentProcessor + private class OldLeadUrlIntentProcessor implements IntentProcessor { @Override public boolean isSupported(Intent intent) @@ -649,7 +650,48 @@ public class DownloadResourcesLegacyActivity extends BaseMwmFragmentActivity final String url = intent.getData().toString(); LOGGER.i(TAG, "URL = " + url); mMapTaskToForward = new OpenUrlTask(url); - org.alohalytics.Statistics.logEvent("LeadUrlIntentProcessor::process", url); + org.alohalytics.Statistics.logEvent("OldLeadUrlIntentProcessor::process", url); + return true; + } + } + + private class DeepLinkIntentProcessor implements IntentProcessor + { + private static final String SCHEME_HTTP = "http"; + private static final String SCHEME_HTTPS = "https"; + private static final String HOST = "dlink.maps.me"; + private static final String SCHEME_CORE = "mapsme"; + + @Override + public boolean isSupported(Intent intent) + { + final Uri data = intent.getData(); + + if (data == null) + return false; + + String scheme = intent.getScheme(); + String host = data.getHost(); + if (TextUtils.isEmpty(scheme) || TextUtils.isEmpty(host)) + return false; + + return (scheme.equals(SCHEME_HTTP) || scheme.equals(SCHEME_HTTPS)) && HOST.equals(host); + } + + @Override + public boolean process(Intent intent) + { + String url = intent.getData().toString(); + LOGGER.i(TAG, "HTTP deeplink = " + url); + // Transform deeplink to the core expected format, + // i.e http(s)://host/path?query -> mapsme://path?query. + url = url.replace(SCHEME_HTTPS, SCHEME_CORE) + .replace(SCHEME_HTTP, SCHEME_CORE) + .replace(HOST, ""); + + LOGGER.i(TAG, "MAPSME URL = " + url); + mMapTaskToForward = new OpenUrlTask(url); + org.alohalytics.Statistics.logEvent(this.getClass().getSimpleName() + "::process", url); return true; } } diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 54a9bb0d4d..da46274982 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -1525,6 +1525,7 @@ public class MwmActivity extends BaseMwmFragmentActivity return true; case ParsedUrlMwmRequest.RESULT_SEARCH: final ParsedSearchRequest request = Framework.nativeGetParsedSearchRequest(); + SearchActivity.start(target, request.mQuery, request.mLocale, request.mIsSearchOnMap, null); return true; case ParsedUrlMwmRequest.RESULT_LEAD: return true; diff --git a/android/src/com/mapswithme/maps/search/SearchActivity.java b/android/src/com/mapswithme/maps/search/SearchActivity.java index de3ec43937..ebbab0e43a 100644 --- a/android/src/com/mapswithme/maps/search/SearchActivity.java +++ b/android/src/com/mapswithme/maps/search/SearchActivity.java @@ -18,13 +18,23 @@ import com.mapswithme.util.ThemeUtils; public class SearchActivity extends BaseMwmFragmentActivity implements CustomNavigateUpListener { public static final String EXTRA_QUERY = "search_query"; + public static final String EXTRA_LOCALE = "locale"; + public static final String EXTRA_SEARCH_ON_MAP = "search_on_map"; public static final String EXTRA_HOTELS_FILTER = "hotels_filter"; public static void start(@NonNull Activity activity, @Nullable String query, @Nullable HotelsFilter filter) + { + start(activity, query, null /* locale */, false /* isSearchOnMap */, filter); + } + + public static void start(@NonNull Activity activity, @Nullable String query, @Nullable String locale, + boolean isSearchOnMap, @Nullable HotelsFilter filter) { final Intent i = new Intent(activity, SearchActivity.class); i.putExtra(EXTRA_QUERY, query); + i.putExtra(EXTRA_LOCALE, locale); + i.putExtra(EXTRA_SEARCH_ON_MAP, isSearchOnMap); i.putExtra(EXTRA_HOTELS_FILTER, filter); activity.startActivity(i); activity.overridePendingTransition(R.anim.search_fade_in, R.anim.search_fade_out); diff --git a/android/src/com/mapswithme/maps/search/SearchEngine.java b/android/src/com/mapswithme/maps/search/SearchEngine.java index 727b349806..85f199bd27 100644 --- a/android/src/com/mapswithme/maps/search/SearchEngine.java +++ b/android/src/com/mapswithme/maps/search/SearchEngine.java @@ -109,14 +109,21 @@ public enum SearchEngine implements NativeSearchListener, return false; } - public static void searchInteractive(String query, long timestamp, boolean isMapAndTable, @Nullable HotelsFilter hotelsFilter) + public static void searchInteractive(@NonNull String query, @NonNull String locale, long timestamp, + boolean isMapAndTable, @Nullable HotelsFilter hotelsFilter) { try { - nativeRunInteractiveSearch(query.getBytes("utf-8"), Language.getKeyboardLocale(), timestamp, isMapAndTable, hotelsFilter); + nativeRunInteractiveSearch(query.getBytes("utf-8"), locale, timestamp, isMapAndTable, hotelsFilter); } catch (UnsupportedEncodingException ignored) { } } + public static void searchInteractive(@NonNull String query, long timestamp, boolean isMapAndTable, + @Nullable HotelsFilter hotelsFilter) + { + searchInteractive(query, Language.getKeyboardLocale(), timestamp, isMapAndTable, hotelsFilter); + } + public static void searchMaps(String query, long timestamp) { try diff --git a/android/src/com/mapswithme/maps/search/SearchFragment.java b/android/src/com/mapswithme/maps/search/SearchFragment.java index 419f71b909..4b945a58fe 100644 --- a/android/src/com/mapswithme/maps/search/SearchFragment.java +++ b/android/src/com/mapswithme/maps/search/SearchFragment.java @@ -179,6 +179,9 @@ public class SearchFragment extends BaseMwmFragment private boolean mSearchRunning; private String mInitialQuery; @Nullable + private String mInitialLocale; + private boolean mInitialSearchOnMap = false; + @Nullable private HotelsFilter mInitialHotelsFilter; private final LocationListener mLocationListener = new LocationListener.Simple() @@ -379,6 +382,9 @@ public class SearchFragment extends BaseMwmFragment mToolbarController.deactivate(); } }); + + if (mInitialSearchOnMap) + showAllResultsOnMap(); } @Override @@ -432,6 +438,8 @@ public class SearchFragment extends BaseMwmFragment return; mInitialQuery = arguments.getString(SearchActivity.EXTRA_QUERY); + mInitialLocale = arguments.getString(SearchActivity.EXTRA_LOCALE); + mInitialSearchOnMap = arguments.getBoolean(SearchActivity.EXTRA_SEARCH_ON_MAP); mInitialHotelsFilter = arguments.getParcelable(SearchActivity.EXTRA_HOTELS_FILTER); } @@ -502,7 +510,9 @@ public class SearchFragment extends BaseMwmFragment hotelsFilter = mFilterController.getFilter(); SearchEngine.searchInteractive( - query, mLastQueryTimestamp, false /* isMapAndTable */, hotelsFilter); + query, !TextUtils.isEmpty(mInitialLocale) + ? mInitialLocale : com.mapswithme.util.Language.getKeyboardLocale(), + mLastQueryTimestamp, false /* isMapAndTable */, hotelsFilter); SearchEngine.showAllResults(query); Utils.navigateToParent(getActivity());