diff --git a/android/jni/app/organicmaps/SearchEngine.cpp b/android/jni/app/organicmaps/SearchEngine.cpp index 1096a39e59..72dbb410f7 100644 --- a/android/jni/app/organicmaps/SearchEngine.cpp +++ b/android/jni/app/organicmaps/SearchEngine.cpp @@ -287,7 +287,7 @@ extern "C" JNIEXPORT void JNICALL Java_app_organicmaps_search_SearchEngine_nativeRunInteractiveSearch( JNIEnv * env, jclass clazz, jbyteArray bytes, jboolean isCategory, - jstring lang, jlong timestamp, jboolean isMapAndTable) + jstring lang, jlong timestamp, jboolean isMapAndTable, jboolean hasPosition, jdouble lat, jdouble lon) { search::ViewportSearchParams vparams{ jni::ToNativeString(env, bytes), @@ -310,8 +310,7 @@ extern "C" std::move(vparams.m_inputLocale), {}, // default timeout static_cast(isCategory), - bind(&OnResults, _1, _2, timestamp, isMapAndTable, - false /* hasPosition */, 0.0 /* lat */, 0.0 /* lon */) + bind(&OnResults, _1, _2, timestamp, isMapAndTable, hasPosition, lat, lon) }; if (g_framework->NativeFramework()->GetSearchAPI().SearchEverywhere(std::move(eparams))) diff --git a/android/src/app/organicmaps/MwmActivity.java b/android/src/app/organicmaps/MwmActivity.java index 9ca5131b9f..5edc39d4ca 100644 --- a/android/src/app/organicmaps/MwmActivity.java +++ b/android/src/app/organicmaps/MwmActivity.java @@ -19,7 +19,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StyleRes; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; @@ -275,11 +274,6 @@ public class MwmActivity extends BaseMwmFragmentActivity mPanelAnimator.show(fragmentClass, args, completionListener); } - public boolean containsFragment(@NonNull Class fragmentClass) - { - return mIsTabletLayout && getFragment(fragmentClass) != null; - } - private void showBookmarks() { BookmarkCategoriesActivity.start(this); @@ -287,7 +281,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void showHelp() { - Intent intent = new Intent(requireActivity(), HelpActivity.class); + Intent intent = new Intent(this, HelpActivity.class); startActivity(intent); } @@ -605,12 +599,6 @@ public class MwmActivity extends BaseMwmFragmentActivity } } - public boolean isMapAttached() - { - return mMapFragment != null && mMapFragment.isAdded(); - } - - private void initNavigationButtons() { initNavigationButtons(mCurrentLayoutMode); @@ -889,12 +877,8 @@ public class MwmActivity extends BaseMwmFragmentActivity if (resultCode != Activity.RESULT_OK) return; - switch (requestCode) - { - case REQ_CODE_DRIVING_OPTIONS: - rebuildLastRoute(); - break; - } + if (requestCode == REQ_CODE_DRIVING_OPTIONS) + rebuildLastRoute(); } private void rebuildLastRoute() @@ -1247,13 +1231,6 @@ public class MwmActivity extends BaseMwmFragmentActivity mMapFragment.updateMyPositionRoutingOffset(offsetY); } - @Override - @NonNull - public AppCompatActivity requireActivity() - { - return this; - } - @Override public void showSearch() { @@ -1468,7 +1445,7 @@ public class MwmActivity extends BaseMwmFragmentActivity public void showNavigation(boolean show) { // TODO: -// mPlacePage.refreshViews(); + // mPlacePage.refreshViews(); mNavigationController.show(show); if (mOnmapDownloader != null) mOnmapDownloader.updateState(false); @@ -1603,6 +1580,52 @@ public class MwmActivity extends BaseMwmFragmentActivity .show(); } + @Override + public void onShowDisclaimer() + { + final StringBuilder builder = new StringBuilder(); + for (int resId : new int[] { R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision, + R.string.dialog_routing_disclaimer_recommendations, R.string.dialog_routing_disclaimer_borders, + R.string.dialog_routing_disclaimer_beware }) + builder.append(MwmApplication.from(this).getString(resId)).append("\n\n"); + + new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog) + .setTitle(R.string.dialog_routing_disclaimer_title) + .setMessage(builder.toString()) + .setCancelable(false) + .setNegativeButton(R.string.decline, null) + .setPositiveButton(R.string.accept, (dlg, which) -> { + Config.acceptRoutingDisclaimer(); + RoutingController.get().prepare(); + }) + .show(); + } + + @Override + public void onSuggestRebuildRoute() + { + final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this) + .setMessage(R.string.p2p_reroute_from_current) + .setCancelable(false) + .setNegativeButton(R.string.cancel, null); + + final TextView titleView = (TextView)View.inflate(this, R.layout.dialog_suggest_reroute_title, null); + titleView.setText(R.string.p2p_only_from_current); + builder.setCustomTitle(titleView); + + if (MapObject.isOfType(MapObject.MY_POSITION, RoutingController.get().getEndPoint())) + builder.setPositiveButton(R.string.ok, (dialog, which) -> RoutingController.get().swapPoints()); + else + { + if (LocationHelper.INSTANCE.getMyPosition() == null) + builder.setMessage(null).setNegativeButton(null, null); + + builder.setPositiveButton(R.string.ok, (dialog, which) -> RoutingController.get().setStartFromMyPosition()); + } + + builder.show(); + } + @Override public void onMyPositionModeChanged(int newMode) { @@ -1772,9 +1795,9 @@ public class MwmActivity extends BaseMwmFragmentActivity public void onSettingsOptionSelected() { - Intent intent = new Intent(requireActivity(), SettingsActivity.class); + Intent intent = new Intent(this, SettingsActivity.class); closeFloatingPanels(); - requireActivity().startActivity(intent); + startActivity(intent); } public void onShareLocationOptionSelected() diff --git a/android/src/app/organicmaps/bookmarks/data/MapObject.java b/android/src/app/organicmaps/bookmarks/data/MapObject.java index aaf779a95a..b1bcc04c98 100644 --- a/android/src/app/organicmaps/bookmarks/data/MapObject.java +++ b/android/src/app/organicmaps/bookmarks/data/MapObject.java @@ -265,7 +265,7 @@ public class MapObject implements PopularityProvider, PlacePageData public boolean hasMetadata() { - return !mMetadata.isEmpty(); + return mMetadata != null && !mMetadata.isEmpty(); } @MapObjectType diff --git a/android/src/app/organicmaps/routing/RoutingController.java b/android/src/app/organicmaps/routing/RoutingController.java index 37b05471b5..7a4e0498f2 100644 --- a/android/src/app/organicmaps/routing/RoutingController.java +++ b/android/src/app/organicmaps/routing/RoutingController.java @@ -1,23 +1,17 @@ package app.organicmaps.routing; import android.content.Context; -import android.content.DialogInterface; import android.text.SpannableStringBuilder; import android.text.TextUtils; -import android.view.View; -import android.widget.TextView; import androidx.annotation.DimenRes; import androidx.annotation.IntRange; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.core.util.Pair; -import androidx.fragment.app.FragmentActivity; import app.organicmaps.Framework; -import app.organicmaps.MwmApplication; import app.organicmaps.R; import app.organicmaps.base.Initializable; import app.organicmaps.bookmarks.data.FeatureId; @@ -29,7 +23,6 @@ import app.organicmaps.util.StringUtils; import app.organicmaps.util.Utils; import app.organicmaps.util.concurrency.UiThread; import app.organicmaps.util.log.Logger; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.Calendar; import java.util.concurrent.TimeUnit; @@ -47,7 +40,7 @@ public class RoutingController implements Initializable NAVIGATION } - enum BuildState + public enum BuildState { NONE, BUILDING, @@ -57,30 +50,31 @@ public class RoutingController implements Initializable public interface Container { - FragmentActivity requireActivity(); - void showSearch(); - void showRoutePlan(boolean show, @Nullable Runnable completionListener); - void showNavigation(boolean show); - void showDownloader(boolean openDownloaded); - void updateMenu(); - void onNavigationCancelled(); - void onNavigationStarted(); - void onPlanningCancelled(); - void onPlanningStarted(); - void onAddedStop(); - void onRemovedStop(); - void onResetToPlanningState(); - void onBuiltRoute(); - void onDrivingOptionsWarning(); - boolean isSubwayEnabled(); - void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps); - void onDrivingOptionsBuildError(); + default void showSearch() {} + default void showRoutePlan(boolean show, @Nullable Runnable completionListener) {} + default void showNavigation(boolean show) {} + default void showDownloader(boolean openDownloaded) {} + default void updateMenu() {} + default void onNavigationCancelled() {} + default void onNavigationStarted() {} + default void onPlanningCancelled() {} + default void onPlanningStarted() {} + default void onAddedStop() {} + default void onRemovedStop() {} + default void onResetToPlanningState() {} + default void onBuiltRoute() {} + default void onDrivingOptionsWarning() {} + default boolean isSubwayEnabled() { return false; } + default void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps) {} + default void onDrivingOptionsBuildError() {} + default void onShowDisclaimer() {} + default void onSuggestRebuildRoute() {} /** * @param progress progress to be displayed. * */ - void updateBuildProgress(@IntRange(from = 0, to = 100) int progress, @Framework.RouterType int router); - void onStartRouteBuilding(); + default void updateBuildProgress(@IntRange(from = 0, to = 100) int progress, @Framework.RouterType int router) {} + default void onStartRouteBuilding() {} } private static final int NO_WAITING_POI_PICK = -1; @@ -170,7 +164,7 @@ public class RoutingController implements Initializable private final Framework.RoutingLoadPointsListener mRoutingLoadPointsListener = success -> { if (success) - prepare(getStartPoint(), getEndPoint()); + prepare(); }; public static RoutingController get() @@ -331,31 +325,6 @@ public class RoutingController implements Initializable Framework.nativeBuildRoute(); } - private void showDisclaimer(final MapObject startPoint, final MapObject endPoint, - final boolean fromApi) - { - if (mContainer == null) - return; - - FragmentActivity activity = mContainer.requireActivity(); - StringBuilder builder = new StringBuilder(); - for (int resId : new int[] { R.string.dialog_routing_disclaimer_priority, R.string.dialog_routing_disclaimer_precision, - R.string.dialog_routing_disclaimer_recommendations, R.string.dialog_routing_disclaimer_borders, - R.string.dialog_routing_disclaimer_beware }) - builder.append(MwmApplication.from(activity.getApplicationContext()).getString(resId)).append("\n\n"); - - new MaterialAlertDialogBuilder(activity, R.style.MwmTheme_AlertDialog) - .setTitle(R.string.dialog_routing_disclaimer_title) - .setMessage(builder.toString()) - .setCancelable(false) - .setNegativeButton(R.string.decline, null) - .setPositiveButton(R.string.accept, (dlg, which) -> { - Config.acceptRoutingDisclaimer(); - prepare(startPoint, endPoint, fromApi); - }) - .show(); - } - public void restoreRoute() { Framework.nativeLoadRoutePoints(); @@ -384,6 +353,11 @@ public class RoutingController implements Initializable prepare(getStartPoint(), getEndPoint(), false); } + public void prepare() + { + prepare(getStartPoint(), getEndPoint()); + } + public void prepare(@Nullable MapObject startPoint, @Nullable MapObject endPoint) { prepare(startPoint, endPoint, false); @@ -395,12 +369,13 @@ public class RoutingController implements Initializable if (!Config.isRoutingDisclaimerAccepted()) { - showDisclaimer(startPoint, endPoint, fromApi); + if (mContainer != null) + mContainer.onShowDisclaimer(); return; } initLastRouteType(startPoint, endPoint, fromApi); - prepare(startPoint, endPoint, mLastRouterType, fromApi); + prepare(startPoint, endPoint, mLastRouterType); } private void initLastRouteType(@Nullable MapObject startPoint, @Nullable MapObject endPoint, @@ -424,12 +399,6 @@ public class RoutingController implements Initializable public void prepare(final @Nullable MapObject startPoint, final @Nullable MapObject endPoint, @Framework.RouterType int routerType) - { - prepare(startPoint, endPoint, routerType, false); - } - - public void prepare(final @Nullable MapObject startPoint, final @Nullable MapObject endPoint, - @Framework.RouterType int routerType, boolean fromApi) { cancel(); setState(State.PREPARE); @@ -455,7 +424,8 @@ public class RoutingController implements Initializable if (my == null || !MapObject.isOfType(MapObject.MY_POSITION, getStartPoint())) { - suggestRebuildRoute(); + if (mContainer != null) + mContainer.onSuggestRebuildRoute(); return; } @@ -511,11 +481,6 @@ public class RoutingController implements Initializable return false; } - private void removeIntermediatePoints() - { - Framework.nativeRemoveIntermediateRoutePoints(); - } - @NonNull private MapObject toMapObject(@NonNull RouteMarkData point) { @@ -534,49 +499,6 @@ public class RoutingController implements Initializable return mapObject.getRoutePointInfo() != null; } - private void suggestRebuildRoute() - { - if (mContainer == null) - return; - - final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(mContainer.requireActivity()) - .setMessage(R.string.p2p_reroute_from_current) - .setCancelable(false) - .setNegativeButton(R.string.cancel, null); - - TextView titleView = (TextView)View.inflate(mContainer.requireActivity(), R.layout.dialog_suggest_reroute_title, null); - titleView.setText(R.string.p2p_only_from_current); - builder.setCustomTitle(titleView); - - if (MapObject.isOfType(MapObject.MY_POSITION, getEndPoint())) - { - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - swapPoints(); - } - }); - } - else - { - if (LocationHelper.INSTANCE.getMyPosition() == null) - builder.setMessage(null).setNegativeButton(null, null); - - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - setStartFromMyPosition(); - } - }); - } - - builder.show(); - } - private void updatePlan() { updateProgress(); @@ -676,12 +598,12 @@ public class RoutingController implements Initializable return mState == State.PREPARE; } - boolean isTransitType() + public boolean isTransitType() { return mLastRouterType == Framework.ROUTER_TYPE_TRANSIT; } - boolean isVehicleRouterType() + public boolean isVehicleRouterType() { return mLastRouterType == Framework.ROUTER_TYPE_VEHICLE; } @@ -720,7 +642,7 @@ public class RoutingController implements Initializable return mWaitingPoiPickType != NO_WAITING_POI_PICK; } - BuildState getBuildState() + public BuildState getBuildState() { return mBuildState; } @@ -771,13 +693,13 @@ public class RoutingController implements Initializable } @Nullable - RoutingInfo getCachedRoutingInfo() + public RoutingInfo getCachedRoutingInfo() { return mCachedRoutingInfo; } @Nullable - TransitRouteInfo getCachedTransitInfo() + public TransitRouteInfo getCachedTransitInfo() { return mCachedTransitRouteInfo; } @@ -801,7 +723,7 @@ public class RoutingController implements Initializable mContainer.updateMenu(); } - void checkAndBuildRoute() + public void checkAndBuildRoute() { if (isWaitingPoiPick()) showRoutePlan(); @@ -810,7 +732,7 @@ public class RoutingController implements Initializable build(); } - private boolean setStartFromMyPosition() + public boolean setStartFromMyPosition() { Logger.d(TAG, "setStartFromMyPosition"); @@ -958,7 +880,7 @@ public class RoutingController implements Initializable return new Pair<>(title, subtitle); } - private void swapPoints() + public void swapPoints() { Logger.d(TAG, "swapPoints"); diff --git a/android/src/app/organicmaps/search/NativeSearchListener.java b/android/src/app/organicmaps/search/NativeSearchListener.java index f90e41038a..01ddde1c14 100644 --- a/android/src/app/organicmaps/search/NativeSearchListener.java +++ b/android/src/app/organicmaps/search/NativeSearchListener.java @@ -12,10 +12,10 @@ public interface NativeSearchListener * @param results Search results. * @param timestamp Timestamp of search request. */ - void onResultsUpdate(@NonNull SearchResult[] results, long timestamp); + default void onResultsUpdate(@NonNull SearchResult[] results, long timestamp) {} /** * @param timestamp Timestamp of search request. */ - void onResultsEnd(long timestamp); + default void onResultsEnd(long timestamp) {} } diff --git a/android/src/app/organicmaps/search/SearchAdapter.java b/android/src/app/organicmaps/search/SearchAdapter.java index 36497b536f..050e7f37d0 100644 --- a/android/src/app/organicmaps/search/SearchAdapter.java +++ b/android/src/app/organicmaps/search/SearchAdapter.java @@ -2,18 +2,11 @@ package app.organicmaps.search; import android.content.Context; import android.content.res.Resources; -import android.graphics.Typeface; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.style.ForegroundColorSpan; -import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.AttrRes; -import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; @@ -23,7 +16,6 @@ import app.organicmaps.R; import app.organicmaps.util.Graphics; import app.organicmaps.util.ThemeUtils; import app.organicmaps.util.UiUtils; -import app.organicmaps.util.Utils; class SearchAdapter extends RecyclerView.Adapter { @@ -64,34 +56,10 @@ class SearchAdapter extends RecyclerView.Adapter