diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index b5854aa0a6..4b5ffdacc6 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -519,8 +519,8 @@ public class MwmActivity extends BaseMwmFragmentActivity setContentView(R.layout.activity_map); - mPlacePageController = PlacePageFactory.createPlacePageController(this, this, this, this); - mPlacePageController.initialize(); + mPlacePageController = PlacePageFactory.createPlacePageController(this, this, this); + mPlacePageController.initialize(this); mPlacePageController.onActivityCreated(this, savedInstanceState); mChartController = new ChartController(this); @@ -535,7 +535,7 @@ public class MwmActivity extends BaseMwmFragmentActivity mSearchController.setVisibilityListener(this); SearchEngine.INSTANCE.addListener(this); - SharingHelper.INSTANCE.initialize(); + SharingHelper.INSTANCE.initialize(null); initControllersAndValidatePurchases(savedInstanceState); diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 4e2d1de3ef..c9204f122f 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -5,9 +5,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Handler; import android.os.Message; + import androidx.annotation.NonNull; import androidx.multidex.MultiDex; - import com.appsflyer.AppsFlyerLib; import com.mapswithme.maps.analytics.ExternalLibrariesMediator; import com.mapswithme.maps.background.AppBackgroundTracker; @@ -283,16 +283,16 @@ public class MwmApplication extends Application implements AppBackgroundTracker. MapManager.nativeSubscribe(mStorageCallbacks); initNativeStrings(); - SearchEngine.INSTANCE.initialize(); + SearchEngine.INSTANCE.initialize(null); BookmarkManager.loadBookmarks(); - TtsPlayer.INSTANCE.init(this); + TtsPlayer.INSTANCE.initialize(this); ThemeSwitcher.restart(false); - LocationHelper.INSTANCE.initialize(); - RoutingController.get().initialize(); - TrafficManager.INSTANCE.initialize(); - SubwayManager.from(this).initialize(); - IsolinesManager.from(this).initialize(); - mPurchaseOperationObservable.initialize(); + LocationHelper.INSTANCE.initialize(null); + RoutingController.get().initialize(null); + TrafficManager.INSTANCE.initialize(null); + SubwayManager.from(this).initialize(null); + IsolinesManager.from(this).initialize(null); + mPurchaseOperationObservable.initialize(null); mBackgroundTracker.addListener(this); mFrameworkInitialized = true; } diff --git a/android/src/com/mapswithme/maps/PurchaseOperationObservable.java b/android/src/com/mapswithme/maps/PurchaseOperationObservable.java index 7ea85eb8cb..ad65204049 100644 --- a/android/src/com/mapswithme/maps/PurchaseOperationObservable.java +++ b/android/src/com/mapswithme/maps/PurchaseOperationObservable.java @@ -1,9 +1,11 @@ package com.mapswithme.maps; import android.content.Context; -import androidx.annotation.NonNull; import android.util.Base64; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.purchase.CoreStartTransactionObserver; import com.mapswithme.maps.purchase.CoreValidationObserver; import com.mapswithme.maps.purchase.PurchaseUtils; @@ -17,7 +19,8 @@ import java.util.List; import java.util.Map; public class PurchaseOperationObservable implements Framework.PurchaseValidationListener, - Framework.StartTransactionListener + Framework.StartTransactionListener, + Initializable { private static final String TAG = PurchaseOperationObservable.class.getSimpleName(); @NonNull @@ -42,7 +45,8 @@ public class PurchaseOperationObservable implements Framework.PurchaseValidation return application.getPurchaseOperationObservable(); } - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { mLogger = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.BILLING); mLogger.i(TAG, "Initializing purchase operation observable..."); @@ -50,6 +54,12 @@ public class PurchaseOperationObservable implements Framework.PurchaseValidation Framework.nativeStartPurchaseTransactionListener(this); } + @Override + public void destroy() + { + // No op. + } + @Override public void onValidatePurchase(int code, @NonNull String serverId, @NonNull String vendorId, @NonNull String encodedPurchaseData) diff --git a/android/src/com/mapswithme/maps/base/Initializable.java b/android/src/com/mapswithme/maps/base/Initializable.java index 976ddc2664..e32fff43b4 100644 --- a/android/src/com/mapswithme/maps/base/Initializable.java +++ b/android/src/com/mapswithme/maps/base/Initializable.java @@ -1,7 +1,9 @@ package com.mapswithme.maps.base; -public interface Initializable +import androidx.annotation.Nullable; + +public interface Initializable { - void initialize(); + void initialize(@Nullable T t); void destroy(); } diff --git a/android/src/com/mapswithme/maps/location/LocationHelper.java b/android/src/com/mapswithme/maps/location/LocationHelper.java index 40a78ccf7a..9b0591b65b 100644 --- a/android/src/com/mapswithme/maps/location/LocationHelper.java +++ b/android/src/com/mapswithme/maps/location/LocationHelper.java @@ -10,6 +10,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.bookmarks.data.FeatureId; import com.mapswithme.maps.bookmarks.data.MapObject; import com.mapswithme.maps.routing.RoutingController; @@ -21,7 +22,7 @@ import com.mapswithme.util.Utils; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; -public enum LocationHelper +public enum LocationHelper implements Initializable { INSTANCE; @@ -154,8 +155,8 @@ public enum LocationHelper } }; - @UiThread - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { initProvider(); LocationState.nativeSetListener(mMyPositionModeListener); @@ -163,6 +164,12 @@ public enum LocationHelper MwmApplication.backgroundTracker().addListener(mOnTransition); } + @Override + public void destroy() + { + // No op. + } + private void initProvider() { mLogger.d(TAG, "initProvider", new Throwable()); diff --git a/android/src/com/mapswithme/maps/maplayer/isolines/IsolinesManager.java b/android/src/com/mapswithme/maps/maplayer/isolines/IsolinesManager.java index 98955baa49..de3ae99510 100644 --- a/android/src/com/mapswithme/maps/maplayer/isolines/IsolinesManager.java +++ b/android/src/com/mapswithme/maps/maplayer/isolines/IsolinesManager.java @@ -4,11 +4,13 @@ import android.app.Application; import android.content.Context; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.maplayer.subway.OnIsolinesChangedListener; -public class IsolinesManager +public class IsolinesManager implements Initializable { @NonNull private final OnIsolinesChangedListener mListener; @@ -41,11 +43,18 @@ public class IsolinesManager setEnabled(!isEnabled()); } - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { registerListener(); } + @Override + public void destroy() + { + // No op. + } + @NonNull public static IsolinesManager from(@NonNull Context context) { diff --git a/android/src/com/mapswithme/maps/maplayer/subway/SubwayManager.java b/android/src/com/mapswithme/maps/maplayer/subway/SubwayManager.java index 40f8aa31d6..376289d0b1 100644 --- a/android/src/com/mapswithme/maps/maplayer/subway/SubwayManager.java +++ b/android/src/com/mapswithme/maps/maplayer/subway/SubwayManager.java @@ -2,12 +2,14 @@ package com.mapswithme.maps.maplayer.subway; import android.app.Application; import android.content.Context; -import androidx.annotation.NonNull; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.base.Initializable; -public class SubwayManager +public class SubwayManager implements Initializable { @NonNull private final OnTransitSchemeChangedListener mSchemeChangedListener; @@ -35,11 +37,18 @@ public class SubwayManager setEnabled(!isEnabled()); } - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { registerListener(); } + @Override + public void destroy() + { + // No op. + } + private void registerListener() { nativeAddListener(mSchemeChangedListener); diff --git a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java index 7b43a332b2..542283a49f 100644 --- a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java +++ b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java @@ -2,7 +2,8 @@ package com.mapswithme.maps.maplayer.traffic; import androidx.annotation.MainThread; import androidx.annotation.NonNull; - +import androidx.annotation.Nullable; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; @@ -10,7 +11,7 @@ import java.util.ArrayList; import java.util.List; @MainThread -public enum TrafficManager +public enum TrafficManager implements Initializable { INSTANCE; private final static String TAG = TrafficManager.class.getSimpleName(); @@ -28,13 +29,20 @@ public enum TrafficManager private boolean mInitialized = false; - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { mLogger.d(TAG, "Initialization of traffic manager and setting the listener for traffic state changes"); TrafficState.nativeSetListener(mStateChangeListener); mInitialized = true; } + @Override + public void destroy() + { + // No op. + } + public void toggle() { checkInitialization(); diff --git a/android/src/com/mapswithme/maps/purchase/AbstractPurchaseController.java b/android/src/com/mapswithme/maps/purchase/AbstractPurchaseController.java index 75c31e4507..3649cb65eb 100644 --- a/android/src/com/mapswithme/maps/purchase/AbstractPurchaseController.java +++ b/android/src/com/mapswithme/maps/purchase/AbstractPurchaseController.java @@ -2,9 +2,9 @@ package com.mapswithme.maps.purchase; import android.app.Activity; import android.os.Bundle; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.android.billingclient.api.BillingClient; import com.android.billingclient.api.Purchase; import com.android.billingclient.api.SkuDetails; @@ -40,8 +40,11 @@ abstract class AbstractPurchaseController extends Savable +public interface PurchaseController extends Savable, Initializable { - /** - * Initializes the controller. - * @param activity the activity which controller serves. - */ - void initialize(@NonNull Activity activity); - - /** - * Destroys the controller. - */ - void destroy(); - /** * Indicates whether the purchase flow is supported by this device or not. */ diff --git a/android/src/com/mapswithme/maps/routing/RoutingController.java b/android/src/com/mapswithme/maps/routing/RoutingController.java index d8ebf76d7c..922bc6735b 100644 --- a/android/src/com/mapswithme/maps/routing/RoutingController.java +++ b/android/src/com/mapswithme/maps/routing/RoutingController.java @@ -1,27 +1,26 @@ package com.mapswithme.maps.routing; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; -import androidx.annotation.DimenRes; -import androidx.annotation.IntRange; -import androidx.annotation.MainThread; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; -import androidx.core.util.Pair; -import androidx.appcompat.app.AlertDialog; 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 com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.bookmarks.data.FeatureId; import com.mapswithme.maps.bookmarks.data.MapObject; -import com.mapswithme.maps.downloader.MapManager; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.taxi.TaxiInfo; import com.mapswithme.maps.taxi.TaxiInfoError; @@ -44,7 +43,7 @@ import static com.mapswithme.util.statistics.Statistics.EventName.ROUTING_POINT_ import static com.mapswithme.util.statistics.Statistics.EventName.ROUTING_POINT_REMOVE; @androidx.annotation.UiThread -public class RoutingController implements TaxiManager.TaxiListener +public class RoutingController implements TaxiManager.TaxiListener, Initializable { private static final String TAG = RoutingController.class.getSimpleName(); @@ -280,7 +279,8 @@ public class RoutingController implements TaxiManager.TaxiListener mContainer = container; } - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { mLastRouterType = Framework.nativeGetLastUsedRouter(); mInvalidRoutePointsTransactionId = Framework.nativeInvalidRoutePointsTransactionId(); @@ -293,6 +293,12 @@ public class RoutingController implements TaxiManager.TaxiListener TaxiManager.INSTANCE.setTaxiListener(this); } + @Override + public void destroy() + { + // No op. + } + public void detach() { mContainer = null; diff --git a/android/src/com/mapswithme/maps/search/SearchEngine.java b/android/src/com/mapswithme/maps/search/SearchEngine.java index 6f1994a136..56ac886336 100644 --- a/android/src/com/mapswithme/maps/search/SearchEngine.java +++ b/android/src/com/mapswithme/maps/search/SearchEngine.java @@ -3,7 +3,6 @@ package com.mapswithme.maps.search; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.mapswithme.maps.Framework; import com.mapswithme.maps.api.ParsedMwmRequest; import com.mapswithme.maps.base.Initializable; @@ -20,7 +19,7 @@ public enum SearchEngine implements NativeSearchListener, NativeMapSearchListener, NativeBookmarkSearchListener, NativeBookingFilterListener, - Initializable + Initializable { INSTANCE; @@ -252,7 +251,7 @@ public enum SearchEngine implements NativeSearchListener, } @Override - public void initialize() + public void initialize(@Nullable Void aVoid) { nativeInit(); } @@ -260,7 +259,7 @@ public enum SearchEngine implements NativeSearchListener, @Override public void destroy() { - // Do nothing. + // No op. } /** diff --git a/android/src/com/mapswithme/maps/sound/TtsPlayer.java b/android/src/com/mapswithme/maps/sound/TtsPlayer.java index 6bbc08be05..ed7a394c57 100644 --- a/android/src/com/mapswithme/maps/sound/TtsPlayer.java +++ b/android/src/com/mapswithme/maps/sound/TtsPlayer.java @@ -3,13 +3,14 @@ package com.mapswithme.maps.sound; import android.content.Context; import android.content.res.Resources; import android.speech.tts.TextToSpeech; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.text.TextUtils; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.mapswithme.maps.Framework; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.base.MediaPlayerWrapper; import com.mapswithme.util.Config; import com.mapswithme.util.log.Logger; @@ -35,7 +36,7 @@ import java.util.Locale; *

* If no core supported languages can be used by the system, TTS is locked down and can not be enabled and used. */ -public enum TtsPlayer +public enum TtsPlayer implements Initializable { INSTANCE; @@ -136,7 +137,8 @@ public enum TtsPlayer setEnabled(false); } - public void init(Context context) + @Override + public void initialize(@Nullable Context context) { if (mTts != null || mInitializing || mUnavailable) return; @@ -162,6 +164,12 @@ public enum TtsPlayer }); } + @Override + public void destroy() + { + // No op. + } + public boolean isSpeaking() { return mTts != null && mTts.isSpeaking(); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java index 95bc25ab51..dc7b53e8e2 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java @@ -1,5 +1,6 @@ package com.mapswithme.maps.widget.placepage; +import android.app.Activity; import android.app.Application; import android.os.Bundle; @@ -8,7 +9,7 @@ import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.base.Savable; import com.mapswithme.maps.base.Supportable; -public interface PlacePageController extends Initializable, Savable, +public interface PlacePageController extends Initializable, Savable, Application.ActivityLifecycleCallbacks, Supportable { diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java index 46a3204927..0c8f84525d 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageControllerComposite.java @@ -13,8 +13,6 @@ import java.util.List; class PlacePageControllerComposite implements PlacePageController { - @NonNull - private final Activity mActivity; @NonNull private final AdsRemovalPurchaseControllerProvider mAdsProvider; @NonNull @@ -27,12 +25,10 @@ class PlacePageControllerComposite implements PlacePageController @NonNull private PlacePageController mActiveController; - PlacePageControllerComposite(@NonNull Activity activity, - @NonNull AdsRemovalPurchaseControllerProvider adsProvider, + PlacePageControllerComposite(@NonNull AdsRemovalPurchaseControllerProvider adsProvider, @NonNull SlideListener slideListener, @Nullable RoutingModeListener routingModeListener) { - mActivity = activity; mAdsProvider = adsProvider; mSlideListener = slideListener; mRoutingModeListener = routingModeListener; @@ -112,19 +108,19 @@ class PlacePageControllerComposite implements PlacePageController } @Override - public void initialize() + public void initialize(@Nullable Activity activity) { if (!mControllers.isEmpty()) throw new AssertionError("Place page controllers already initialized!"); PlacePageController richController = - createRichPlacePageController(mActivity, mAdsProvider, mSlideListener, mRoutingModeListener); - richController.initialize(); + createRichPlacePageController(mAdsProvider, mSlideListener, mRoutingModeListener); + richController.initialize(activity); mControllers.add(richController); PlacePageController simpleController = - createSimplePlacePageController(mActivity, mSlideListener); - simpleController.initialize(); + createSimplePlacePageController(mSlideListener); + simpleController.initialize(activity); mControllers.add(simpleController); mActiveController = richController; @@ -136,6 +132,9 @@ class PlacePageControllerComposite implements PlacePageController if (mControllers.isEmpty()) throw new AssertionError("Place page controllers already destroyed!"); + for (PlacePageController controller: mControllers) + controller.destroy(); + mControllers.clear(); } @@ -178,17 +177,17 @@ class PlacePageControllerComposite implements PlacePageController @NonNull private static PlacePageController createRichPlacePageController( - @NonNull Activity activity, @NonNull AdsRemovalPurchaseControllerProvider provider, + @NonNull AdsRemovalPurchaseControllerProvider provider, @NonNull PlacePageController.SlideListener listener, @Nullable RoutingModeListener routingModeListener) { - return new RichPlacePageController(activity, provider, listener, routingModeListener); + return new RichPlacePageController(provider, listener, routingModeListener); } @NonNull private static PlacePageController createSimplePlacePageController( - @NonNull Activity activity, @NonNull PlacePageController.SlideListener listener) + @NonNull PlacePageController.SlideListener listener) { - return new SimplePlacePageController(activity, listener); + return new SimplePlacePageController(listener); } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageFactory.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageFactory.java index 1ef9963421..4cf343e65d 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageFactory.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageFactory.java @@ -10,10 +10,10 @@ public class PlacePageFactory { @NonNull public static PlacePageController createPlacePageController( - @NonNull Activity activity, @NonNull AdsRemovalPurchaseControllerProvider provider, + @NonNull AdsRemovalPurchaseControllerProvider provider, @NonNull PlacePageController.SlideListener slideListener, @NonNull RoutingModeListener routingModeListener) { - return new PlacePageControllerComposite(activity, provider, slideListener, routingModeListener); + return new PlacePageControllerComposite(provider, slideListener, routingModeListener); } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java index b94c468fec..3622944d31 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java @@ -21,6 +21,7 @@ import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; import com.mapswithme.maps.ads.CompoundNativeAdLoader; import com.mapswithme.maps.ads.DefaultAdTracker; +import com.mapswithme.maps.ads.Factory; import com.mapswithme.maps.ads.MwmNativeAd; import com.mapswithme.maps.bookmarks.data.MapObject; import com.mapswithme.maps.bookmarks.data.RoadWarningMarkType; @@ -47,8 +48,6 @@ public class RichPlacePageController implements PlacePageController, private static final String TAG = RichPlacePageController.class.getSimpleName(); private static final int ANIM_BANNER_APPEARING_MS = 300; private static final int ANIM_CHANGE_PEEK_HEIGHT_MS = 100; - @NonNull - private final Activity mActivity; @SuppressWarnings("NullableProblems") @NonNull private AnchorBottomSheetBehavior mPlacePageBehavior; @@ -81,8 +80,9 @@ public class RichPlacePageController implements PlacePageController, private final AdsRemovalPurchaseControllerProvider mPurchaseControllerProvider; @NonNull private final SlideListener mSlideListener; + @SuppressWarnings("NullableProblems") @NonNull - private final GestureDetectorCompat mGestureDetector; + private GestureDetectorCompat mGestureDetector; @Nullable private final RoutingModeListener mRoutingModeListener; @NonNull @@ -196,30 +196,33 @@ public class RichPlacePageController implements PlacePageController, return height - mPlacePageBehavior.getPeekHeight(); } - RichPlacePageController(@NonNull Activity activity, - @NonNull AdsRemovalPurchaseControllerProvider provider, + RichPlacePageController(@NonNull AdsRemovalPurchaseControllerProvider provider, @NonNull SlideListener listener, @Nullable RoutingModeListener routingModeListener) { - mActivity = activity; mPurchaseControllerProvider = provider; mSlideListener = listener; - mGestureDetector = new GestureDetectorCompat(activity, new PlacePageGestureListener()); mRoutingModeListener = routingModeListener; } @SuppressLint("ClickableViewAccessibility") @Override - public void initialize() + public void initialize(@Nullable Activity activity) { - Resources res = mActivity.getResources(); + if (activity == null) + throw new AssertionError("Activity must be non-null!"); + + + mGestureDetector = new GestureDetectorCompat(activity, new PlacePageGestureListener()); + + Resources res = activity.getResources(); mViewportMinHeight = res.getDimensionPixelSize(R.dimen.viewport_min_height); mOpenBannerTouchSlop = res.getDimensionPixelSize(R.dimen.placepage_banner_open_touch_slop); - mToolbar = mActivity.findViewById(R.id.pp_toolbar); + mToolbar = activity.findViewById(R.id.pp_toolbar); UiUtils.extendViewWithStatusBar(mToolbar); UiUtils.showHomeUpButton(mToolbar); mToolbar.setNavigationOnClickListener(v -> close(true)); - mPlacePage = mActivity.findViewById(R.id.placepage); + mPlacePage = activity.findViewById(R.id.placepage); mPlacePageBehavior = AnchorBottomSheetBehavior.from(mPlacePage); mPlacePageBehavior.addBottomSheetCallback(mSheetCallback); mPlacePage.setOnTouchListener((v, event) -> mGestureDetector.onTouchEvent(event)); @@ -229,16 +232,16 @@ public class RichPlacePageController implements PlacePageController, ViewGroup bannerContainer = mPlacePage.findViewById(R.id.banner_container); DefaultAdTracker tracker = new DefaultAdTracker(); - CompoundNativeAdLoader loader = com.mapswithme.maps.ads.Factory.createCompoundLoader(tracker, - tracker); + CompoundNativeAdLoader loader = Factory.createCompoundLoader(tracker, + tracker); mBannerController = new BannerController(bannerContainer, loader, tracker, mPurchaseControllerProvider, this, this); - mButtonsLayout = mActivity.findViewById(R.id.pp_buttons_layout); + mButtonsLayout = activity.findViewById(R.id.pp_buttons_layout); ViewGroup buttons = mButtonsLayout.findViewById(R.id.container); mPlacePage.initButtons(buttons); UiUtils.bringViewToFrontOf(mButtonsLayout, mPlacePage); - UiUtils.bringViewToFrontOf(mActivity.findViewById(R.id.app_bar), mPlacePage); + UiUtils.bringViewToFrontOf(activity.findViewById(R.id.app_bar), mPlacePage); mPlacePageTracker = new PlacePageTracker(mPlacePage, mButtonsLayout); LocationHelper.INSTANCE.addListener(this); } diff --git a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java index e5fbdba04b..f24d1a91a7 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java @@ -1,6 +1,7 @@ package com.mapswithme.maps.widget.placepage; import android.app.Activity; +import android.app.Application; import android.os.Bundle; import android.view.View; @@ -14,8 +15,9 @@ import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; public class SimplePlacePageController implements PlacePageController { + @SuppressWarnings("NullableProblems") @NonNull - private final Activity mActivity; + private Application mApplication; @SuppressWarnings("NullableProblems") @NonNull private View mSheet; @@ -40,7 +42,7 @@ public class SimplePlacePageController implements PlacePageController @Override public void onSheetDirectionIconChange() { - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) return; PlacePageUtils.setPullDrawable(mSheetBehavior, mSheet, R.id.pull_icon); @@ -49,21 +51,21 @@ public class SimplePlacePageController implements PlacePageController @Override public void onSheetDetailsOpened() { - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); } @Override public void onSheetCollapsed() { - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); } @Override public void onSheetSliding(int top) { - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) return; mSlideListener.onPlacePageSlide(top); @@ -72,7 +74,7 @@ public class SimplePlacePageController implements PlacePageController @Override public void onSheetSlideFinish() { - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) return; PlacePageUtils.moveViewportUp(mSheet, mViewportMinHeight); @@ -84,10 +86,8 @@ public class SimplePlacePageController implements PlacePageController private boolean mDeactivateMapSelection = true; - SimplePlacePageController(@NonNull Activity activity, - @NonNull SlideListener slideListener) + SimplePlacePageController(@NonNull SlideListener slideListener) { - mActivity = activity; mSlideListener = slideListener; } @@ -157,9 +157,12 @@ public class SimplePlacePageController implements PlacePageController } @Override - public void initialize() + public void initialize(@Nullable Activity activity) { - mSheet = mActivity.findViewById(R.id.elevation_profile); + if (activity == null) + throw new AssertionError("Activity must be non-null"); + mApplication = activity.getApplication(); + mSheet = activity.findViewById(R.id.elevation_profile); mViewportMinHeight = mSheet.getResources().getDimensionPixelSize(R.dimen.viewport_min_height); mViewPortMinWidth = mSheet.getResources().getDimensionPixelSize(R.dimen.viewport_min_width); mSheetBehavior = AnchorBottomSheetBehavior.from(mSheet); @@ -195,7 +198,7 @@ public class SimplePlacePageController implements PlacePageController return; mMapObject = object; - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) { // In case when bottom sheet was collapsed for vertical orientation then after rotation // we should expand bottom sheet forcibly for horizontal orientation. It's by design. @@ -214,7 +217,7 @@ public class SimplePlacePageController implements PlacePageController if (mDeactivateMapSelection) Framework.nativeDeactivatePopup(); mDeactivateMapSelection = true; - if (UiUtils.isLandscape(mActivity)) + if (UiUtils.isLandscape(mApplication)) { PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); return; diff --git a/android/src/com/mapswithme/util/sharing/SharingHelper.java b/android/src/com/mapswithme/util/sharing/SharingHelper.java index d3ca13b897..439a613660 100644 --- a/android/src/com/mapswithme/util/sharing/SharingHelper.java +++ b/android/src/com/mapswithme/util/sharing/SharingHelper.java @@ -8,20 +8,21 @@ import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.text.TextUtils; + import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; -import android.text.TextUtils; - import com.cocosw.bottomsheet.BottomSheet; import com.google.gson.Gson; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; +import com.mapswithme.maps.base.Initializable; import com.mapswithme.maps.bookmarks.data.BookmarkManager; import com.mapswithme.maps.bookmarks.data.BookmarkSharingResult; -import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.maps.dialog.DialogUtils; +import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.concurrency.ThreadPool; import com.mapswithme.util.concurrency.UiThread; import com.mapswithme.util.log.Logger; @@ -36,7 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -public enum SharingHelper +public enum SharingHelper implements Initializable { INSTANCE; @@ -53,7 +54,8 @@ public enum SharingHelper @Nullable private ProgressDialog mProgressDialog; - public void initialize() + @Override + public void initialize(@Nullable Void aVoid) { ThreadPool.getStorage().execute( () -> @@ -70,6 +72,12 @@ public enum SharingHelper }); } + @Override + public void destroy() + { + // No op. + } + private static SharingTarget[] parse(String json) { if (TextUtils.isEmpty(json))