From 5b84fc782b77910b97da1253c6ef52c4c0c26626 Mon Sep 17 00:00:00 2001
From: Altonss <66519591+Altonss@users.noreply.github.com>
Date: Sun, 21 May 2023 16:07:31 +0200
Subject: [PATCH 01/11] [docs] Add TrackerControl for iOS into README

Signed-off-by: Altonss <altonss@tutanota.com>
Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 README.md                           |   7 ++++++-
 docs/privacy/trackercontrol-ios.png | Bin 0 -> 12265 bytes
 2 files changed, 6 insertions(+), 1 deletion(-)
 create mode 100644 docs/privacy/trackercontrol-ios.png

diff --git a/README.md b/README.md
index 94fce71758..be14a61cd5 100644
--- a/README.md
+++ b/README.md
@@ -69,11 +69,16 @@ Organic Maps app is free from trackers and other bad stuff:
 - No crapware
 - ~~No pesticides~~ Purely organic!
 
-The application is verified by <a href="https://reports.exodus-privacy.eu.org/en/reports/app.organicmaps/latest/">Exodus Privacy Project:
+The Android application is verified by <a href="https://reports.exodus-privacy.eu.org/en/reports/app.organicmaps/latest/">Exodus Privacy Project:
 
 <img src="docs/privacy/exodus.png" width="400">
 </a>
 
+The iOS application is verified by <a href="https://ios.trackercontrol.org/app/app.organicmaps">TrackerControl for iOS:
+
+<img src="docs/privacy/trackercontrol-ios.png" width="400">
+</a>
+
 <br/>
 
 Organic Maps doesn't request excessive permissions to spy on you:
diff --git a/docs/privacy/trackercontrol-ios.png b/docs/privacy/trackercontrol-ios.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce4d78e81c3623e646165d450e19fccdb8e012f2
GIT binary patch
literal 12265
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
F{{y(#!}b6G

literal 0
HcmV?d00001

-- 
2.45.3


From 7a532dd871eaa701e055f185f5d05c47a2fa5995 Mon Sep 17 00:00:00 2001
From: Arnaud Vergnet <arnaud.vergnet@mailo.com>
Date: Sat, 18 Mar 2023 23:31:10 +0100
Subject: [PATCH 02/11] [android] improve how pp extends under status bar

Signed-off-by: Arnaud Vergnet <arnaud.vergnet@mailo.com>
Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 .../layout/place_page_container_fragment.xml  |  8 +++
 .../widget/placepage/PlacePageController.java | 54 +++++++++++++++++--
 2 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/android/res/layout/place_page_container_fragment.xml b/android/res/layout/place_page_container_fragment.xml
index f53af67f3a..db75b662e4 100644
--- a/android/res/layout/place_page_container_fragment.xml
+++ b/android/res/layout/place_page_container_fragment.xml
@@ -4,9 +4,17 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
+  <View
+    android:id="@+id/place_page_status_bar_background"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
+    android:layout_gravity="center_horizontal|top"
+    android:background="?ppBackground"
+    android:visibility="gone" />
   <androidx.core.widget.NestedScrollViewClickFixed
     android:id="@+id/placepage"
     style="?attr/bottomSheetStyle"
+    android:elevation="0dp"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:fillViewport="true"
diff --git a/android/src/app/organicmaps/widget/placepage/PlacePageController.java b/android/src/app/organicmaps/widget/placepage/PlacePageController.java
index e0ac913f1a..965eb2b617 100644
--- a/android/src/app/organicmaps/widget/placepage/PlacePageController.java
+++ b/android/src/app/organicmaps/widget/placepage/PlacePageController.java
@@ -11,6 +11,7 @@ import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.core.graphics.Insets;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
 import androidx.core.widget.NestedScrollViewClickFixed;
@@ -31,6 +32,7 @@ import app.organicmaps.bookmarks.data.RoadWarningMarkType;
 import app.organicmaps.routing.RoutingController;
 import app.organicmaps.settings.RoadType;
 import app.organicmaps.util.SharingUtils;
+import app.organicmaps.util.ThemeUtils;
 import app.organicmaps.util.UiUtils;
 import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
 import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
@@ -54,10 +56,12 @@ public class PlacePageController extends Fragment implements
   private BottomSheetBehavior<View> mPlacePageBehavior;
   private NestedScrollViewClickFixed mPlacePage;
   private ViewGroup mPlacePageContainer;
+  private View mPlacePageStatusBarBackground;
   private ViewGroup mCoordinator;
   private int mViewportMinHeight;
   private int mButtonsHeight;
   private int mMaxButtons;
+  private int mRoutingHeaderHeight;
   private PlacePageViewModel mViewModel;
   private int mPreviewHeight;
   private int mFrameHeight;
@@ -72,6 +76,8 @@ public class PlacePageController extends Fragment implements
 
   private ValueAnimator mCustomPeekHeightAnimator;
   private PlacePageRouteSettingsListener mPlacePageRouteSettingsListener;
+  private final Observer<Integer> mPlacePageDistanceToTopObserver = this::updateStatusBarBackground;
+
   private final BottomSheetBehavior.BottomSheetCallback mDefaultBottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback()
   {
     @Override
@@ -114,11 +120,13 @@ public class PlacePageController extends Fragment implements
     mViewportMinHeight = res.getDimensionPixelSize(R.dimen.viewport_min_height);
     mButtonsHeight = (int) res.getDimension(R.dimen.place_page_buttons_height);
     mMaxButtons = res.getInteger(R.integer.pp_buttons_max);
+    mRoutingHeaderHeight = (int) res.getDimension(ThemeUtils.getResource(requireContext(), R.attr.actionBarSize));
 
     mCoordinator = activity.findViewById(R.id.coordinator);
     mPlacePage = view.findViewById(R.id.placepage);
     mPlacePageContainer = view.findViewById(R.id.placepage_container);
     mPlacePageBehavior = BottomSheetBehavior.from(mPlacePage);
+    mPlacePageStatusBarBackground = view.findViewById(R.id.place_page_status_bar_background);
 
     mShouldCollapse = true;
 
@@ -133,6 +141,14 @@ public class PlacePageController extends Fragment implements
 
     ViewCompat.setOnApplyWindowInsetsListener(mPlacePage, (v, windowInsets) -> {
       mCurrentWindowInsets = windowInsets;
+      final Insets insets = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+      final ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) mPlacePageStatusBarBackground.getLayoutParams();
+      // Layout calculations are heavy so we compute them once then move the view from behind the place page to the status bar
+      layoutParams.height = insets.top;
+      layoutParams.width = mPlacePage.getWidth();
+      // Make sure the view is centered within the insets as is the place page
+      layoutParams.setMargins(insets.left, 0, insets.right, 0);
+      mPlacePageStatusBarBackground.setLayoutParams(layoutParams);
       return windowInsets;
     });
   }
@@ -209,14 +225,19 @@ public class PlacePageController extends Fragment implements
   private void setPlacePageHeightBounds()
   {
     final int peekHeight = calculatePeekHeight();
+    final Insets insets = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
     // Make sure the place page can reach the peek height
-    final int height = Math.max(peekHeight, mFrameHeight);
+    final int minHeight = Math.max(peekHeight, mFrameHeight);
+    // Prevent the place page from showing under the status bar
+    // If we are in planning mode, prevent going above the header
+    final int topInsets = insets.top + (RoutingController.get().isPlanning() ? mRoutingHeaderHeight : 0);
+    final int maxHeight = Math.min(minHeight + insets.bottom, mCoordinator.getHeight() - topInsets);
     // Set the minimum height of the place page to prevent jumps when new data results in SMALLER content
     // This cannot be set on the place page itself as it has the fitToContent property set
-    mPlacePageContainer.setMinimumHeight(height);
+    mPlacePageContainer.setMinimumHeight(minHeight);
     // Set the maximum height of the place page to prevent jumps when new data results in BIGGER content
     // It does not take into account the navigation bar height so we need to add it manually
-    mPlacePageBehavior.setMaxHeight(height + mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom);
+    mPlacePageBehavior.setMaxHeight(maxHeight);
   }
 
   /**
@@ -294,6 +315,7 @@ public class PlacePageController extends Fragment implements
     mPreviewHeight = previewHeight;
     mFrameHeight = frameHeight;
     mViewModel.setPlacePageWidth(mPlacePage.getWidth());
+    mPlacePageStatusBarBackground.getLayoutParams().width = mPlacePage.getWidth();
     // Make sure to update the peek height on the UI thread to prevent weird animation jumps
     mPlacePage.post(() -> {
       setPeekHeight();
@@ -568,12 +590,37 @@ public class PlacePageController extends Fragment implements
       close();
   }
 
+  private void updateStatusBarBackground(int distanceToTop)
+  {
+    // This callback may be called before insets are updated when resuming the app
+    if (mCurrentWindowInsets == null)
+      return;
+    final int topInset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
+    // Only animate the status bar background if the place page can reach it
+    if (mCoordinator.getHeight() - mPlacePageContainer.getHeight() < topInset)
+    {
+      final int animationStartHeight = topInset * 3;
+      int newHeight = 0;
+      if (distanceToTop < animationStartHeight)
+        newHeight = Math.min(topInset * (animationStartHeight - distanceToTop) / 100, topInset);
+      if (newHeight > 0)
+      {
+        mPlacePageStatusBarBackground.setTranslationY(distanceToTop - newHeight);
+        if (!UiUtils.isVisible(mPlacePageStatusBarBackground))
+          UiUtils.show(mPlacePageStatusBarBackground);
+      }
+      else if (UiUtils.isVisible(mPlacePageStatusBarBackground))
+        UiUtils.hide(mPlacePageStatusBarBackground);
+    }
+  }
+
   @Override
   public void onStart()
   {
     super.onStart();
     mPlacePageBehavior.addBottomSheetCallback(mDefaultBottomSheetCallback);
     mViewModel.getMapObject().observe(requireActivity(), this);
+    mViewModel.getPlacePageDistanceToTop().observe(requireActivity(), mPlacePageDistanceToTopObserver);
   }
 
   @Override
@@ -590,6 +637,7 @@ public class PlacePageController extends Fragment implements
     super.onStop();
     mPlacePageBehavior.removeBottomSheetCallback(mDefaultBottomSheetCallback);
     mViewModel.getMapObject().removeObserver(this);
+    mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver);
   }
 
   public interface PlacePageRouteSettingsListener
-- 
2.45.3


From 2c3e04f1fe5249a7ba918213122e81ff0cd5e331 Mon Sep 17 00:00:00 2001
From: Kartikay-12 <kartikay_2101ce32@iitp.ac.in>
Date: Fri, 23 Jun 2023 21:36:38 +0530
Subject: [PATCH 03/11] [ios] Integrated url-privacy-proxy.

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 iphone/Maps/Classes/ClipboardMonitor.h  |   8 ++
 iphone/Maps/Classes/ClipboardMonitor.mm | 107 ++++++++++++++++++++++++
 iphone/Maps/Classes/MapsAppDelegate.mm  |  11 +++
 3 files changed, 126 insertions(+)
 create mode 100644 iphone/Maps/Classes/ClipboardMonitor.h
 create mode 100644 iphone/Maps/Classes/ClipboardMonitor.mm

diff --git a/iphone/Maps/Classes/ClipboardMonitor.h b/iphone/Maps/Classes/ClipboardMonitor.h
new file mode 100644
index 0000000000..f0a6c5af6e
--- /dev/null
+++ b/iphone/Maps/Classes/ClipboardMonitor.h
@@ -0,0 +1,8 @@
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+@interface ClipboardWatcher : NSObject
+
+- (void)startWatching:(UIWindow *)window;
+
+@end
diff --git a/iphone/Maps/Classes/ClipboardMonitor.mm b/iphone/Maps/Classes/ClipboardMonitor.mm
new file mode 100644
index 0000000000..6820ade1b7
--- /dev/null
+++ b/iphone/Maps/Classes/ClipboardMonitor.mm
@@ -0,0 +1,107 @@
+#import "MapsAppDelegate.h"
+#import "ClipboardMonitor.h"
+#import "UIKitCategories.h"
+#import "MapsAppDelegate.h"
+#import <CoreApi/DeepLinkParser.h>
+#include <CoreApi/Framework.h>
+#import <CoreApi/DeepLinkData.h>
+#import "UIKitCategories.h"
+#import <CoreApi/DeepLinkSearchData.h>
+
+@interface ClipboardWatcher ()
+
+@property (nonatomic, strong) NSTimer *timer;
+@property (nonatomic, copy) NSString *previousClipboardText;
+@property (nonatomic, assign) BOOL isErrorPromptShown;
+
+@end
+
+@implementation ClipboardWatcher
+
+- (void)startWatching:(UIWindow *)window {
+    NSLog(@"clip watching started");
+
+    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
+    NSString *currentClipboardText = pasteboard.string;
+    NSLog(@"clip clipboard checking for changes %@  and  %@",currentClipboardText, self.previousClipboardText);
+
+    [pasteboard setString:@""];
+    [self checkClipboardWithText:currentClipboardText window:window];
+}
+
+- (void)checkClipboardWithText:(NSString *)copiedText window:(UIWindow *)window {
+    NSLog(@"clip API CALL PROCEEDING %@", copiedText);
+
+    // Check if the copied text is a URL
+    if ([self isURL:copiedText]) {
+
+        dispatch_async(dispatch_get_main_queue(), ^{
+            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Redirecting from copied URL" message:@"Please wait..." preferredStyle:UIAlertControllerStyleAlert];
+            [window.rootViewController presentViewController:alertController animated:YES completion:nil];
+        });
+
+        // Make an API request
+        NSURL *apiURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://url-un.kartikay-2101ce32.workers.dev/search?url=%@", copiedText]];
+        NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:apiURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [window.rootViewController dismissViewControllerAnimated:YES completion:nil];
+            });
+
+            if (error) {
+                NSLog(@"API Request Error: %@", error);
+                NSString *errorMessage = @"Kindly make sure that your internet connection in turned on.";
+                [self displayErrorMessage:errorMessage inWindow:window];
+            } else {
+                NSError *jsonError;
+                NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+                NSLog(@"API Response: %@", responseString);
+                NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
+                if (jsonError) {
+                    NSLog(@"JSON Parsing Error: %@", jsonError);
+                    NSString *errorMessage = @"Kindly make sure that your URL points to an address";
+                  [self displayErrorMessage:errorMessage inWindow:window];
+                } else {
+                    NSDictionary *urlDict = responseDict[@"url"];
+                    NSString *geoURL = urlDict[@"geo"];
+                    if (geoURL) {
+                        NSLog(@"Geo URL: %@", geoURL);
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            GetFramework().ShowMapForURL(geoURL.UTF8String);
+                        });
+                    }
+                }
+            }
+        }];
+        [task resume];
+    }
+}
+
+- (BOOL)isURL:(NSString *)text {
+    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
+    NSArray *matches = [detector matchesInString:text options:0 range:NSMakeRange(0, text.length)];
+
+    for (NSTextCheckingResult *match in matches) {
+        if (match.resultType == NSTextCheckingTypeLink) {
+            return YES;
+        }
+    }
+
+    return NO;
+}
+
+- (void)displayErrorMessage:(NSString *)errorMessage inWindow:(UIWindow *)window {
+    if (!self.isErrorPromptShown) {
+        self.isErrorPromptShown = YES;
+
+        dispatch_async(dispatch_get_main_queue(), ^{
+            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Redirection Failed" message:errorMessage preferredStyle:UIAlertControllerStyleAlert];
+            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+                self.isErrorPromptShown = NO;
+            }];
+            [alertController addAction:okAction];
+            [window.rootViewController presentViewController:alertController animated:YES completion:nil];
+        });
+    }
+}
+
+@end
diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm
index e19490f3dd..0ddce8b603 100644
--- a/iphone/Maps/Classes/MapsAppDelegate.mm
+++ b/iphone/Maps/Classes/MapsAppDelegate.mm
@@ -1,4 +1,7 @@
 #import "MapsAppDelegate.h"
+#import "ClipboardMonitor.h"
+
+#import <UIKit/UIKit.h>
 
 #import "EAGLView.h"
 #import "MWMAuthorizationCommon.h"
@@ -66,6 +69,7 @@ using namespace osm_auth_ios;
 
 @property(nonatomic) NSInteger standbyCounter;
 @property(nonatomic) MWMBackgroundFetchScheduler *backgroundFetchScheduler;
+@property (nonatomic, strong) ClipboardWatcher *clipboardWatcher;
 
 @end
 
@@ -222,12 +226,19 @@ using namespace osm_auth_ios;
     f.OnRecoverSurface(static_cast<int>(objcSize.width), static_cast<int>(objcSize.height),
                        true /* recreateContextDependentResources */);
   }
+  [self startWatchingClipboard];
   [MWMLocationManager applicationDidBecomeActive];
   [MWMSearch addCategoriesToSpotlight];
   [MWMKeyboard applicationDidBecomeActive];
   [MWMTextToSpeech applicationDidBecomeActive];
   LOG(LINFO, ("applicationDidBecomeActive - end"));
 }
+- (void)startWatchingClipboard {
+    NSLog(@"Watching started");
+  ClipboardWatcher *clipboardWatcher = [[ClipboardWatcher alloc] init];
+  UIWindow *targetWindow = [UIApplication sharedApplication].keyWindow;
+  [clipboardWatcher startWatching:targetWindow];
+}
 
 - (BOOL)application:(UIApplication *)application
   continueUserActivity:(NSUserActivity *)userActivity
-- 
2.45.3


From 85341b84bcd1a034dd99dc264559041162f9719d Mon Sep 17 00:00:00 2001
From: Kartikay-12 <kartikay_2101ce32@iitp.ac.in>
Date: Sun, 25 Jun 2023 05:13:01 +0530
Subject: [PATCH 04/11] Changes implemented

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 iphone/Maps/Classes/ClipboardMonitor.h     |  4 +-
 iphone/Maps/Classes/ClipboardMonitor.mm    | 43 +++++++++++++---------
 iphone/Maps/Classes/MapsAppDelegate.mm     | 10 ++---
 iphone/Maps/Maps.xcodeproj/project.pbxproj | 10 ++++-
 4 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/iphone/Maps/Classes/ClipboardMonitor.h b/iphone/Maps/Classes/ClipboardMonitor.h
index f0a6c5af6e..9bb1a2589e 100644
--- a/iphone/Maps/Classes/ClipboardMonitor.h
+++ b/iphone/Maps/Classes/ClipboardMonitor.h
@@ -1,8 +1,8 @@
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
 
-@interface ClipboardWatcher : NSObject
+@interface ClipboardChecker : NSObject
 
-- (void)startWatching:(UIWindow *)window;
+- (void)startChecking:(UIWindow *)window;
 
 @end
diff --git a/iphone/Maps/Classes/ClipboardMonitor.mm b/iphone/Maps/Classes/ClipboardMonitor.mm
index 6820ade1b7..5af247f4e0 100644
--- a/iphone/Maps/Classes/ClipboardMonitor.mm
+++ b/iphone/Maps/Classes/ClipboardMonitor.mm
@@ -8,7 +8,7 @@
 #import "UIKitCategories.h"
 #import <CoreApi/DeepLinkSearchData.h>
 
-@interface ClipboardWatcher ()
+@interface ClipboardChecker ()
 
 @property (nonatomic, strong) NSTimer *timer;
 @property (nonatomic, copy) NSString *previousClipboardText;
@@ -16,49 +16,57 @@
 
 @end
 
-@implementation ClipboardWatcher
-
-- (void)startWatching:(UIWindow *)window {
-    NSLog(@"clip watching started");
+@implementation ClipboardChecker
 
+NSString *privacyProxy = @"https://url-un.kartikay-2101ce32.workers.dev/coordinates?url=%@";
+NSString *localizedStringOk = NSLocalizedString(@"ok", @"");
+- (void)startChecking:(UIWindow *)window {
     UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
     NSString *currentClipboardText = pasteboard.string;
-    NSLog(@"clip clipboard checking for changes %@  and  %@",currentClipboardText, self.previousClipboardText);
 
     [pasteboard setString:@""];
+
+  NSLog(@"Local String%@", localizedStringOk);
     [self checkClipboardWithText:currentClipboardText window:window];
 }
 
 - (void)checkClipboardWithText:(NSString *)copiedText window:(UIWindow *)window {
-    NSLog(@"clip API CALL PROCEEDING %@", copiedText);
+    NSLog(@"PROXY REQUEST PROCEEDING %@", copiedText);
 
     // Check if the copied text is a URL
-    if ([self isURL:copiedText]) {
-
+  NSURL* url = [NSURL URLWithString:copiedText];
+  NSString* hostName = url.host;
+    if ([self isURL:copiedText] && ( [hostName isEqualToString:@"google"] || [hostName isEqualToString:@"www.google.com"] ||
+        [hostName isEqualToString:@"maps.app.goo.gl"] ||
+        [hostName isEqualToString:@"goo.gl"])) {
+      NSLog(privacyProxy,copiedText);
         dispatch_async(dispatch_get_main_queue(), ^{
-            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Redirecting from copied URL" message:@"Please wait..." preferredStyle:UIAlertControllerStyleAlert];
+          NSString *message = [NSString stringWithFormat:@"Extracting coordinates from %@ using the anonymous proxy...", copiedText];
+            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Please Wait" message:message preferredStyle:UIAlertControllerStyleAlert];
             [window.rootViewController presentViewController:alertController animated:YES completion:nil];
         });
 
         // Make an API request
-        NSURL *apiURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://url-un.kartikay-2101ce32.workers.dev/search?url=%@", copiedText]];
+      NSURL *apiURL = [NSURL URLWithString:[NSString stringWithFormat:privacyProxy, copiedText]];
         NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:apiURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
             dispatch_async(dispatch_get_main_queue(), ^{
                 [window.rootViewController dismissViewControllerAnimated:YES completion:nil];
             });
 
             if (error) {
-                NSLog(@"API Request Error: %@", error);
-                NSString *errorMessage = @"Kindly make sure that your internet connection in turned on.";
+                NSLog(@"Proxy request error: %@", error);
+                NSString *errorMessage = @"Failed to extract coordinates from %url using an anonymous proxy. Please check your Internet connection";
+              errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
                 [self displayErrorMessage:errorMessage inWindow:window];
             } else {
                 NSError *jsonError;
                 NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-                NSLog(@"API Response: %@", responseString);
+                NSLog(@"Proxy response:%@", responseString);
                 NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
                 if (jsonError) {
                     NSLog(@"JSON Parsing Error: %@", jsonError);
-                    NSString *errorMessage = @"Kindly make sure that your URL points to an address";
+                    NSString *errorMessage = @"Can not extract coordinates from %url";
+                  errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
                   [self displayErrorMessage:errorMessage inWindow:window];
                 } else {
                     NSDictionary *urlDict = responseDict[@"url"];
@@ -94,8 +102,9 @@
         self.isErrorPromptShown = YES;
 
         dispatch_async(dispatch_get_main_queue(), ^{
-            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Redirection Failed" message:errorMessage preferredStyle:UIAlertControllerStyleAlert];
-            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+          NSString *title = @"Redirection Failed";
+            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:errorMessage preferredStyle:UIAlertControllerStyleAlert];
+            UIAlertAction *okAction = [UIAlertAction actionWithTitle:localizedStringOk style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                 self.isErrorPromptShown = NO;
             }];
             [alertController addAction:okAction];
diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm
index 0ddce8b603..e613fdcb8c 100644
--- a/iphone/Maps/Classes/MapsAppDelegate.mm
+++ b/iphone/Maps/Classes/MapsAppDelegate.mm
@@ -69,7 +69,7 @@ using namespace osm_auth_ios;
 
 @property(nonatomic) NSInteger standbyCounter;
 @property(nonatomic) MWMBackgroundFetchScheduler *backgroundFetchScheduler;
-@property (nonatomic, strong) ClipboardWatcher *clipboardWatcher;
+@property (nonatomic, strong) ClipboardChecker *clipboardChecker;
 
 @end
 
@@ -226,18 +226,18 @@ using namespace osm_auth_ios;
     f.OnRecoverSurface(static_cast<int>(objcSize.width), static_cast<int>(objcSize.height),
                        true /* recreateContextDependentResources */);
   }
-  [self startWatchingClipboard];
+  [self startCheckingClipboard];
   [MWMLocationManager applicationDidBecomeActive];
   [MWMSearch addCategoriesToSpotlight];
   [MWMKeyboard applicationDidBecomeActive];
   [MWMTextToSpeech applicationDidBecomeActive];
   LOG(LINFO, ("applicationDidBecomeActive - end"));
 }
-- (void)startWatchingClipboard {
+- (void)startCheckingClipboard {
     NSLog(@"Watching started");
-  ClipboardWatcher *clipboardWatcher = [[ClipboardWatcher alloc] init];
+  ClipboardChecker *clipboardChecker = [[ClipboardChecker alloc] init];
   UIWindow *targetWindow = [UIApplication sharedApplication].keyWindow;
-  [clipboardWatcher startWatching:targetWindow];
+  [clipboardChecker startChecking:targetWindow];
 }
 
 - (BOOL)application:(UIApplication *)application
diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj
index 7b93dd8d5b..88dbba305d 100644
--- a/iphone/Maps/Maps.xcodeproj/project.pbxproj
+++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj
@@ -324,6 +324,7 @@
 		6B15907226623AE500944BBA /* 00_NotoSansThai-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B15907026623AE500944BBA /* 00_NotoSansThai-Regular.ttf */; };
 		6B679E89266BFD0A0074AE2A /* 00_NotoNaskhArabic-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B679E88266BFD090074AE2A /* 00_NotoNaskhArabic-Regular.ttf */; };
 		6B9978361C89A316003B8AA0 /* editor.config in Resources */ = {isa = PBXBuildFile; fileRef = 6B9978341C89A316003B8AA0 /* editor.config */; };
+		8FE7398F2A4208CC00DC5837 /* ClipboardMonitor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */; };
 		99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012846243F0D6900C72B10 /* UIViewController+alternative.swift */; };
 		9901284F244732DB00C72B10 /* BottomTabBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012849244732DB00C72B10 /* BottomTabBarPresenter.swift */; };
 		99012851244732DB00C72B10 /* BottomTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9901284B244732DB00C72B10 /* BottomTabBarViewController.swift */; };
@@ -764,7 +765,6 @@
 		3444DFCF1F17620C00E73099 /* MWMMapWidgetsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapWidgetsHelper.h; sourceTree = "<group>"; };
 		3444DFD01F17620C00E73099 /* MWMMapWidgetsHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapWidgetsHelper.mm; sourceTree = "<group>"; };
 		3444DFDC1F18A5AF00E73099 /* SideButtonsArea.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SideButtonsArea.swift; sourceTree = "<group>"; };
-		345050211E028B8000A8DC59 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = "<group>"; };
 		3454D79B1E07F045004AF2AD /* CLLocation+Mercator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CLLocation+Mercator.h"; sourceTree = "<group>"; };
 		3454D79C1E07F045004AF2AD /* CLLocation+Mercator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "CLLocation+Mercator.mm"; sourceTree = "<group>"; };
 		3454D79D1E07F045004AF2AD /* DateComponentsFormatter+ETA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DateComponentsFormatter+ETA.swift"; sourceTree = "<group>"; };
@@ -1135,6 +1135,9 @@
 		6B679E88266BFD090074AE2A /* 00_NotoNaskhArabic-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "00_NotoNaskhArabic-Regular.ttf"; path = "../../data/00_NotoNaskhArabic-Regular.ttf"; sourceTree = "<group>"; };
 		6B9978341C89A316003B8AA0 /* editor.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = editor.config; path = ../../data/editor.config; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* OMaps.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OMaps.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
+		8F71F2442A46035800089B33 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Bridging-Header.h"; path = "../../../../../.Trash/Bridging-Header.h"; sourceTree = "<group>"; };
+		8FE7398D2A4208A100DC5837 /* ClipboardMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClipboardMonitor.h; sourceTree = "<group>"; };
+		8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ClipboardMonitor.mm; sourceTree = "<group>"; };
 		978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
 		97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
 		99012846243F0D6900C72B10 /* UIViewController+alternative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+alternative.swift"; sourceTree = "<group>"; };
@@ -1703,6 +1706,8 @@
 				34FE4C421BCC013500066718 /* Widgets */,
 				FA8E808825F412E2002A1434 /* FirstSession.mm */,
 				FA8E808A25F41337002A1434 /* FirstSession.h */,
+				8FE7398D2A4208A100DC5837 /* ClipboardMonitor.h */,
+				8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */,
 			);
 			path = Classes;
 			sourceTree = "<group>";
@@ -1724,6 +1729,7 @@
 				080E96DDFE201D6D7F000001 /* Classes */,
 				340475141E081A4600C92850 /* Common */,
 				347526FA1DC0B00F00918CF5 /* common-debug.xcconfig */,
+				8F71F2442A46035800089B33 /* Bridging-Header.h */,
 				347526FB1DC0B00F00918CF5 /* common-release.xcconfig */,
 				340475281E081A4600C92850 /* Core */,
 				FA065FC61286143F00FEA989 /* External Resources */,
@@ -1744,7 +1750,6 @@
 		29B97315FDCFA39411CA2CEA /* Other Sources */ = {
 			isa = PBXGroup;
 			children = (
-				345050211E028B8000A8DC59 /* Bridging-Header.h */,
 				29B97316FDCFA39411CA2CEA /* main.mm */,
 				28A0AB4B0D9B1048005BE974 /* Maps_Prefix.pch */,
 			);
@@ -3876,6 +3881,7 @@
 				34AB666E1FC5AA330078E451 /* TransportTransitStepsCollectionView.swift in Sources */,
 				993DF11E23F6BDB100AC231A /* UITextViewRenderer.swift in Sources */,
 				F6E2FF5A1E097BA00083EBEC /* MWMNightModeController.m in Sources */,
+				8FE7398F2A4208CC00DC5837 /* ClipboardMonitor.mm in Sources */,
 				471A7BB8247FE3C300A0D4C1 /* URL+Query.swift in Sources */,
 				47F86D0120C93D8D00FEE291 /* TabViewController.swift in Sources */,
 				99536113235DB86C008B218F /* InsetsLabel.swift in Sources */,
-- 
2.45.3


From 1c9e6d60dd365885a57ff2681abde1c80eb85ee1 Mon Sep 17 00:00:00 2001
From: Kartikay <120778728+kartikaysaxena@users.noreply.github.com>
Date: Sun, 25 Jun 2023 10:18:49 +0530
Subject: [PATCH 05/11] Configuration file update

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 iphone/Maps/Maps.xcodeproj/project.pbxproj | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj
index 88dbba305d..3ff9e3021a 100644
--- a/iphone/Maps/Maps.xcodeproj/project.pbxproj
+++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj
@@ -1135,7 +1135,7 @@
 		6B679E88266BFD090074AE2A /* 00_NotoNaskhArabic-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "00_NotoNaskhArabic-Regular.ttf"; path = "../../data/00_NotoNaskhArabic-Regular.ttf"; sourceTree = "<group>"; };
 		6B9978341C89A316003B8AA0 /* editor.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = editor.config; path = ../../data/editor.config; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* OMaps.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OMaps.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
-		8F71F2442A46035800089B33 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Bridging-Header.h"; path = "../../../../../.Trash/Bridging-Header.h"; sourceTree = "<group>"; };
+		8F71F2442A46035800089B33 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = "<group>"; };
 		8FE7398D2A4208A100DC5837 /* ClipboardMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClipboardMonitor.h; sourceTree = "<group>"; };
 		8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ClipboardMonitor.mm; sourceTree = "<group>"; };
 		978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
-- 
2.45.3


From 02e90147e59860f15dc7bc67015de9b491a972c3 Mon Sep 17 00:00:00 2001
From: Kartikay <120778728+kartikaysaxena@users.noreply.github.com>
Date: Mon, 26 Jun 2023 23:34:30 +0530
Subject: [PATCH 06/11] Further changes implemented

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 iphone/Maps/Classes/ClipboardMonitor.h        |   8 --
 iphone/Maps/Classes/ClipboardMonitor.mm       | 116 ------------------
 .../Maps/Classes/CoordinatesFromClipboard.h   |   8 ++
 .../Maps/Classes/CoordinatesFromClipboard.mm  | 109 ++++++++++++++++
 iphone/Maps/Classes/MapsAppDelegate.mm        |  12 +-
 iphone/Maps/Maps.xcodeproj/project.pbxproj    |  12 +-
 6 files changed, 129 insertions(+), 136 deletions(-)
 delete mode 100644 iphone/Maps/Classes/ClipboardMonitor.h
 delete mode 100644 iphone/Maps/Classes/ClipboardMonitor.mm
 create mode 100644 iphone/Maps/Classes/CoordinatesFromClipboard.h
 create mode 100644 iphone/Maps/Classes/CoordinatesFromClipboard.mm

diff --git a/iphone/Maps/Classes/ClipboardMonitor.h b/iphone/Maps/Classes/ClipboardMonitor.h
deleted file mode 100644
index 9bb1a2589e..0000000000
--- a/iphone/Maps/Classes/ClipboardMonitor.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-@interface ClipboardChecker : NSObject
-
-- (void)startChecking:(UIWindow *)window;
-
-@end
diff --git a/iphone/Maps/Classes/ClipboardMonitor.mm b/iphone/Maps/Classes/ClipboardMonitor.mm
deleted file mode 100644
index 5af247f4e0..0000000000
--- a/iphone/Maps/Classes/ClipboardMonitor.mm
+++ /dev/null
@@ -1,116 +0,0 @@
-#import "MapsAppDelegate.h"
-#import "ClipboardMonitor.h"
-#import "UIKitCategories.h"
-#import "MapsAppDelegate.h"
-#import <CoreApi/DeepLinkParser.h>
-#include <CoreApi/Framework.h>
-#import <CoreApi/DeepLinkData.h>
-#import "UIKitCategories.h"
-#import <CoreApi/DeepLinkSearchData.h>
-
-@interface ClipboardChecker ()
-
-@property (nonatomic, strong) NSTimer *timer;
-@property (nonatomic, copy) NSString *previousClipboardText;
-@property (nonatomic, assign) BOOL isErrorPromptShown;
-
-@end
-
-@implementation ClipboardChecker
-
-NSString *privacyProxy = @"https://url-un.kartikay-2101ce32.workers.dev/coordinates?url=%@";
-NSString *localizedStringOk = NSLocalizedString(@"ok", @"");
-- (void)startChecking:(UIWindow *)window {
-    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
-    NSString *currentClipboardText = pasteboard.string;
-
-    [pasteboard setString:@""];
-
-  NSLog(@"Local String%@", localizedStringOk);
-    [self checkClipboardWithText:currentClipboardText window:window];
-}
-
-- (void)checkClipboardWithText:(NSString *)copiedText window:(UIWindow *)window {
-    NSLog(@"PROXY REQUEST PROCEEDING %@", copiedText);
-
-    // Check if the copied text is a URL
-  NSURL* url = [NSURL URLWithString:copiedText];
-  NSString* hostName = url.host;
-    if ([self isURL:copiedText] && ( [hostName isEqualToString:@"google"] || [hostName isEqualToString:@"www.google.com"] ||
-        [hostName isEqualToString:@"maps.app.goo.gl"] ||
-        [hostName isEqualToString:@"goo.gl"])) {
-      NSLog(privacyProxy,copiedText);
-        dispatch_async(dispatch_get_main_queue(), ^{
-          NSString *message = [NSString stringWithFormat:@"Extracting coordinates from %@ using the anonymous proxy...", copiedText];
-            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Please Wait" message:message preferredStyle:UIAlertControllerStyleAlert];
-            [window.rootViewController presentViewController:alertController animated:YES completion:nil];
-        });
-
-        // Make an API request
-      NSURL *apiURL = [NSURL URLWithString:[NSString stringWithFormat:privacyProxy, copiedText]];
-        NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:apiURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
-            dispatch_async(dispatch_get_main_queue(), ^{
-                [window.rootViewController dismissViewControllerAnimated:YES completion:nil];
-            });
-
-            if (error) {
-                NSLog(@"Proxy request error: %@", error);
-                NSString *errorMessage = @"Failed to extract coordinates from %url using an anonymous proxy. Please check your Internet connection";
-              errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
-                [self displayErrorMessage:errorMessage inWindow:window];
-            } else {
-                NSError *jsonError;
-                NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-                NSLog(@"Proxy response:%@", responseString);
-                NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
-                if (jsonError) {
-                    NSLog(@"JSON Parsing Error: %@", jsonError);
-                    NSString *errorMessage = @"Can not extract coordinates from %url";
-                  errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
-                  [self displayErrorMessage:errorMessage inWindow:window];
-                } else {
-                    NSDictionary *urlDict = responseDict[@"url"];
-                    NSString *geoURL = urlDict[@"geo"];
-                    if (geoURL) {
-                        NSLog(@"Geo URL: %@", geoURL);
-                        dispatch_async(dispatch_get_main_queue(), ^{
-                            GetFramework().ShowMapForURL(geoURL.UTF8String);
-                        });
-                    }
-                }
-            }
-        }];
-        [task resume];
-    }
-}
-
-- (BOOL)isURL:(NSString *)text {
-    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
-    NSArray *matches = [detector matchesInString:text options:0 range:NSMakeRange(0, text.length)];
-
-    for (NSTextCheckingResult *match in matches) {
-        if (match.resultType == NSTextCheckingTypeLink) {
-            return YES;
-        }
-    }
-
-    return NO;
-}
-
-- (void)displayErrorMessage:(NSString *)errorMessage inWindow:(UIWindow *)window {
-    if (!self.isErrorPromptShown) {
-        self.isErrorPromptShown = YES;
-
-        dispatch_async(dispatch_get_main_queue(), ^{
-          NSString *title = @"Redirection Failed";
-            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:errorMessage preferredStyle:UIAlertControllerStyleAlert];
-            UIAlertAction *okAction = [UIAlertAction actionWithTitle:localizedStringOk style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
-                self.isErrorPromptShown = NO;
-            }];
-            [alertController addAction:okAction];
-            [window.rootViewController presentViewController:alertController animated:YES completion:nil];
-        });
-    }
-}
-
-@end
diff --git a/iphone/Maps/Classes/CoordinatesFromClipboard.h b/iphone/Maps/Classes/CoordinatesFromClipboard.h
new file mode 100644
index 0000000000..ed516bae1c
--- /dev/null
+++ b/iphone/Maps/Classes/CoordinatesFromClipboard.h
@@ -0,0 +1,8 @@
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+@interface ClipboardCheck : NSObject
+
+- (void)Check:(UIWindow *)window;
+
+@end
diff --git a/iphone/Maps/Classes/CoordinatesFromClipboard.mm b/iphone/Maps/Classes/CoordinatesFromClipboard.mm
new file mode 100644
index 0000000000..a3e675bd96
--- /dev/null
+++ b/iphone/Maps/Classes/CoordinatesFromClipboard.mm
@@ -0,0 +1,109 @@
+#import "MapsAppDelegate.h"
+#import "CoordinatesFromClipboard.h"
+#import "UIKitCategories.h"
+#include <CoreApi/Framework.h>
+
+@interface ClipboardCheck ()
+
+@property (nonatomic, strong) NSTimer *timer;
+@property (nonatomic, copy) NSString *previousClipboardText;
+@property (nonatomic, assign) BOOL isErrorPromptShown;
+
+@end
+
+@implementation ClipboardCheck
+
+NSString * privacyProxy = @"https://url-un.kartikay-2101ce32.workers.dev/coordinates?url=%@";
+NSString *localizedStringOk = NSLocalizedString(@"ok", @"");
+- (void)Check:(UIWindow *)window {
+  UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
+  NSString *currentClipboardText = pasteboard.string;
+  NSLog(@"Local String%@", localizedStringOk);
+  [self checkClipboardWithText:currentClipboardText window:window];
+}
+- (void)checkClipboardWithText:(NSString *)copiedText window:(UIWindow *)window {
+  NSLog(@"PROXY REQUEST PROCEEDING %@", copiedText);
+  
+  // Check if the copied text is a URL
+  if ([self isURL:copiedText]) {
+    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
+    [pasteboard setString:@""];
+    NSLog(privacyProxy,copiedText);
+    dispatch_async(dispatch_get_main_queue(), ^{
+      NSString *message = [NSString stringWithFormat:@"Extracting coordinates from %@ using the anonymous proxy...", copiedText];
+      UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Please Wait" message:message preferredStyle:UIAlertControllerStyleAlert];
+      [window.rootViewController presentViewController:alertController animated:YES completion:nil];
+    });
+    
+    // Make an API request
+    NSURL *apiURL = [NSURL URLWithString:[NSString stringWithFormat:privacyProxy, copiedText]];
+    NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:apiURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
+      dispatch_async(dispatch_get_main_queue(), ^{
+        [window.rootViewController dismissViewControllerAnimated:YES completion:nil];
+      });
+      
+      if (error) {
+        NSLog(@"Proxy request error: %@", error);
+        NSString *errorMessage = @"Failed to extract coordinates from %url using an anonymous proxy. Please check your Internet connection";
+        errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
+        [self displayErrorMessage:errorMessage inWindow:window];
+      } else {
+        NSError *jsonError;
+        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        NSLog(@"Proxy response:%@", responseString);
+        NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];
+        if (jsonError) {
+          NSLog(@"JSON Parsing Error: %@", jsonError);
+          NSString *errorMessage = @"Can not extract coordinates from %url";
+          errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@"%url" withString:copiedText];
+          [self displayErrorMessage:errorMessage inWindow:window];
+        } else {
+          NSDictionary *urlDict = responseDict[@"url"];
+          NSString *geoURL = urlDict[@"geo"];
+          if (geoURL) {
+            NSLog(@"Geo URL: %@", geoURL);
+            dispatch_async(dispatch_get_main_queue(), ^{
+              GetFramework().ShowMapForURL(geoURL.UTF8String);
+            });
+          }
+        }
+      }
+    }];
+    [task resume];
+  }
+}
+
+- (BOOL)isURL:(NSString *)text {
+  NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
+  NSArray *matches = [detector matchesInString:text options:0 range:NSMakeRange(0, text.length)];
+  
+  NSArray *googleHosts = @[@"google", @"google.com", @"goo.gl", @"maps.app.goo.gl"];
+  
+  for (NSTextCheckingResult *match in matches) {
+    NSURL *url = match.URL;
+    NSString *hostname = url.host;
+    
+    for (NSString *googleHost in googleHosts) {
+      if ([hostname containsString:googleHost]) return YES;
+    }
+  }
+  return NO;
+}
+
+- (void)displayErrorMessage:(NSString *)errorMessage inWindow:(UIWindow *)window {
+  if (!self.isErrorPromptShown) {
+    self.isErrorPromptShown = YES;
+    
+    dispatch_async(dispatch_get_main_queue(), ^{
+      NSString *title = @"Redirection to the coordinates failed";
+      UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:errorMessage preferredStyle:UIAlertControllerStyleAlert];
+      UIAlertAction *okAction = [UIAlertAction actionWithTitle:localizedStringOk style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+        self.isErrorPromptShown = NO;
+      }];
+      [alertController addAction:okAction];
+      [window.rootViewController presentViewController:alertController animated:YES completion:nil];
+    });
+  }
+}
+
+@end
diff --git a/iphone/Maps/Classes/MapsAppDelegate.mm b/iphone/Maps/Classes/MapsAppDelegate.mm
index e613fdcb8c..75c3c5f9a1 100644
--- a/iphone/Maps/Classes/MapsAppDelegate.mm
+++ b/iphone/Maps/Classes/MapsAppDelegate.mm
@@ -1,5 +1,5 @@
 #import "MapsAppDelegate.h"
-#import "ClipboardMonitor.h"
+#import "CoordinatesFromClipboard.h"
 
 #import <UIKit/UIKit.h>
 
@@ -69,7 +69,7 @@ using namespace osm_auth_ios;
 
 @property(nonatomic) NSInteger standbyCounter;
 @property(nonatomic) MWMBackgroundFetchScheduler *backgroundFetchScheduler;
-@property (nonatomic, strong) ClipboardChecker *clipboardChecker;
+@property (nonatomic, strong) ClipboardCheck *clipboardCheck;
 
 @end
 
@@ -226,18 +226,18 @@ using namespace osm_auth_ios;
     f.OnRecoverSurface(static_cast<int>(objcSize.width), static_cast<int>(objcSize.height),
                        true /* recreateContextDependentResources */);
   }
-  [self startCheckingClipboard];
+  [self checkClipboard];
   [MWMLocationManager applicationDidBecomeActive];
   [MWMSearch addCategoriesToSpotlight];
   [MWMKeyboard applicationDidBecomeActive];
   [MWMTextToSpeech applicationDidBecomeActive];
   LOG(LINFO, ("applicationDidBecomeActive - end"));
 }
-- (void)startCheckingClipboard {
+- (void)checkClipboard {
     NSLog(@"Watching started");
-  ClipboardChecker *clipboardChecker = [[ClipboardChecker alloc] init];
+  ClipboardCheck *clipboardCheck = [[ClipboardCheck alloc] init];
   UIWindow *targetWindow = [UIApplication sharedApplication].keyWindow;
-  [clipboardChecker startChecking:targetWindow];
+  [clipboardCheck Check:targetWindow];
 }
 
 - (BOOL)application:(UIApplication *)application
diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj
index 3ff9e3021a..ceba934271 100644
--- a/iphone/Maps/Maps.xcodeproj/project.pbxproj
+++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj
@@ -324,7 +324,7 @@
 		6B15907226623AE500944BBA /* 00_NotoSansThai-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B15907026623AE500944BBA /* 00_NotoSansThai-Regular.ttf */; };
 		6B679E89266BFD0A0074AE2A /* 00_NotoNaskhArabic-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B679E88266BFD090074AE2A /* 00_NotoNaskhArabic-Regular.ttf */; };
 		6B9978361C89A316003B8AA0 /* editor.config in Resources */ = {isa = PBXBuildFile; fileRef = 6B9978341C89A316003B8AA0 /* editor.config */; };
-		8FE7398F2A4208CC00DC5837 /* ClipboardMonitor.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */; };
+		8FE7398F2A4208CC00DC5837 /* CoordinatesFromClipboard.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8FE7398E2A4208CC00DC5837 /* CoordinatesFromClipboard.mm */; };
 		99012847243F0D6900C72B10 /* UIViewController+alternative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012846243F0D6900C72B10 /* UIViewController+alternative.swift */; };
 		9901284F244732DB00C72B10 /* BottomTabBarPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99012849244732DB00C72B10 /* BottomTabBarPresenter.swift */; };
 		99012851244732DB00C72B10 /* BottomTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9901284B244732DB00C72B10 /* BottomTabBarViewController.swift */; };
@@ -1136,8 +1136,8 @@
 		6B9978341C89A316003B8AA0 /* editor.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = editor.config; path = ../../data/editor.config; sourceTree = "<group>"; };
 		8D1107310486CEB800E47090 /* OMaps.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = OMaps.plist; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
 		8F71F2442A46035800089B33 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = "<group>"; };
-		8FE7398D2A4208A100DC5837 /* ClipboardMonitor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ClipboardMonitor.h; sourceTree = "<group>"; };
-		8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ClipboardMonitor.mm; sourceTree = "<group>"; };
+		8FE7398D2A4208A100DC5837 /* CoordinatesFromClipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoordinatesFromClipboard.h; sourceTree = "<group>"; };
+		8FE7398E2A4208CC00DC5837 /* CoordinatesFromClipboard.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CoordinatesFromClipboard.mm; sourceTree = "<group>"; };
 		978D4A30199A11E600D72CA7 /* faq.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = faq.html; path = ../../data/faq.html; sourceTree = "<group>"; };
 		97A5967E19B9CD47007A963F /* copyright.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = copyright.html; path = ../../data/copyright.html; sourceTree = "<group>"; };
 		99012846243F0D6900C72B10 /* UIViewController+alternative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+alternative.swift"; sourceTree = "<group>"; };
@@ -1706,8 +1706,8 @@
 				34FE4C421BCC013500066718 /* Widgets */,
 				FA8E808825F412E2002A1434 /* FirstSession.mm */,
 				FA8E808A25F41337002A1434 /* FirstSession.h */,
-				8FE7398D2A4208A100DC5837 /* ClipboardMonitor.h */,
-				8FE7398E2A4208CC00DC5837 /* ClipboardMonitor.mm */,
+				8FE7398D2A4208A100DC5837 /* CoordinatesFromClipboard.h */,
+				8FE7398E2A4208CC00DC5837 /* CoordinatesFromClipboard.mm */,
 			);
 			path = Classes;
 			sourceTree = "<group>";
@@ -3881,7 +3881,7 @@
 				34AB666E1FC5AA330078E451 /* TransportTransitStepsCollectionView.swift in Sources */,
 				993DF11E23F6BDB100AC231A /* UITextViewRenderer.swift in Sources */,
 				F6E2FF5A1E097BA00083EBEC /* MWMNightModeController.m in Sources */,
-				8FE7398F2A4208CC00DC5837 /* ClipboardMonitor.mm in Sources */,
+				8FE7398F2A4208CC00DC5837 /* CoordinatesFromClipboard.mm in Sources */,
 				471A7BB8247FE3C300A0D4C1 /* URL+Query.swift in Sources */,
 				47F86D0120C93D8D00FEE291 /* TabViewController.swift in Sources */,
 				99536113235DB86C008B218F /* InsetsLabel.swift in Sources */,
-- 
2.45.3


From dd3a7b19e75f626516f9c673038a2be76d885ca0 Mon Sep 17 00:00:00 2001
From: Kartikay <120778728+kartikaysaxena@users.noreply.github.com>
Date: Sun, 9 Jul 2023 04:27:36 +0530
Subject: [PATCH 07/11] [android] integrated proxy in Android

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 android/src/app/organicmaps/Map.java         |   2 +-
 android/src/app/organicmaps/MwmActivity.java | 337 +++++++++++++------
 2 files changed, 227 insertions(+), 112 deletions(-)

diff --git a/android/src/app/organicmaps/Map.java b/android/src/app/organicmaps/Map.java
index a707290ee6..bac0c0c03b 100644
--- a/android/src/app/organicmaps/Map.java
+++ b/android/src/app/organicmaps/Map.java
@@ -348,7 +348,7 @@ public final class Map
   private static native boolean nativeIsEngineCreated();
   private static native void nativeSetRenderingInitializationFinishedListener(
       @Nullable MapRenderingListener listener);
-  private static native boolean nativeShowMapForUrl(String url);
+  public static native boolean nativeShowMapForUrl(String url);
 
   // Surface
   private static native boolean nativeAttachSurface(Surface surface);
diff --git a/android/src/app/organicmaps/MwmActivity.java b/android/src/app/organicmaps/MwmActivity.java
index 5cbe8ec89b..9720622f0d 100644
--- a/android/src/app/organicmaps/MwmActivity.java
+++ b/android/src/app/organicmaps/MwmActivity.java
@@ -2,17 +2,25 @@ package app.organicmaps;
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.ClipData;
+import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.Intent;
 import android.location.Location;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.NonNull;
@@ -26,7 +34,6 @@ import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentFactory;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
-import androidx.lifecycle.LiveData;
 import androidx.lifecycle.ViewModelProvider;
 import app.organicmaps.Framework.PlacePageActivationListener;
 import app.organicmaps.api.Const;
@@ -96,26 +103,33 @@ import app.organicmaps.widget.placepage.PlacePageData;
 import app.organicmaps.widget.placepage.PlacePageViewModel;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Objects;
 import java.util.Stack;
 
 public class MwmActivity extends BaseMwmFragmentActivity
-    implements PlacePageActivationListener,
-               View.OnTouchListener,
-               MapRenderingListener,
-               CustomNavigateUpListener,
-               RoutingController.Container,
-               LocationListener,
-               LocationState.ModeChangeListener,
-               RoutingPlanInplaceController.RoutingPlanListener,
-               RoutingBottomMenuListener,
-               BookmarkManager.BookmarksLoadingListener,
-               FloatingSearchToolbarController.SearchToolbarListener,
-               NoConnectionListener,
-               MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
-               PlacePageController.PlacePageRouteSettingsListener,
-               MapButtonsController.MapButtonClickListener
+        implements PlacePageActivationListener,
+        View.OnTouchListener,
+        MapRenderingListener,
+        CustomNavigateUpListener,
+        RoutingController.Container,
+        LocationListener,
+        LocationState.ModeChangeListener,
+        RoutingPlanInplaceController.RoutingPlanListener,
+        RoutingBottomMenuListener,
+        BookmarkManager.BookmarksLoadingListener,
+        FloatingSearchToolbarController.SearchToolbarListener,
+        NoConnectionListener,
+        MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
+        PlacePageController.PlacePageRouteSettingsListener,
+        MapButtonsController.MapButtonClickListener
 {
   private static final String TAG = MwmActivity.class.getSimpleName();
 
@@ -125,10 +139,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed";
 
   private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(),
-                                                     DownloaderFragment.class.getName(),
-                                                     RoutingPlanFragment.class.getName(),
-                                                     EditorHostFragment.class.getName(),
-                                                     ReportFragment.class.getName() };
+          DownloaderFragment.class.getName(),
+          RoutingPlanFragment.class.getName(),
+          EditorHostFragment.class.getName(),
+          ReportFragment.class.getName() };
 
   public static final int REQ_CODE_ERROR_DRIVING_OPTIONS_DIALOG = 5;
   public static final int REQ_CODE_DRIVING_OPTIONS = 6;
@@ -199,7 +213,7 @@ 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(DownloadResourcesLegacyActivity.EXTRA_COUNTRY, countryId);
   }
 
   @Override
@@ -235,7 +249,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   protected int getFragmentContentResId()
   {
     return (mIsTabletLayout ? R.id.fragment_container
-                            : super.getFragmentContentResId());
+            : super.getFragmentContentResId());
   }
 
   @Nullable
@@ -311,10 +325,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
     }
 
     new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
-        .setMessage(R.string.unknown_current_position)
-        .setCancelable(true)
-        .setPositiveButton(R.string.ok, null)
-        .show();
+            .setMessage(R.string.unknown_current_position)
+            .setCancelable(true)
+            .setPositiveButton(R.string.ok, null)
+            .show();
   }
 
   @Override
@@ -372,7 +386,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
 
     mSearchController = new FloatingSearchToolbarController(this, this);
     mSearchController.getToolbar()
-                     .getViewTreeObserver();
+            .getViewTreeObserver();
 
     boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false);
     initViews(isLaunchByDeepLink);
@@ -393,9 +407,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private void refreshLightStatusBar()
   {
     UiUtils.setLightStatusBar(this, !(
-        ThemeUtils.isNightTheme(this)
-        || RoutingController.get().isPlanning()
-        || Framework.nativeIsInChoosePositionMode()
+            ThemeUtils.isNightTheme(this)
+                    || RoutingController.get().isPlanning()
+                    || Framework.nativeIsInChoosePositionMode()
     ));
   }
 
@@ -429,10 +443,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onNoConnectionError()
   {
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-        .setTitle(R.string.common_check_internet_connection_dialog_title)
-        .setMessage(R.string.common_check_internet_connection_dialog)
-        .setPositiveButton(R.string.ok, null)
-        .show();
+            .setTitle(R.string.common_check_internet_connection_dialog_title)
+            .setMessage(R.string.common_check_internet_connection_dialog)
+            .setPositiveButton(R.string.ok, null)
+            .show();
   }
 
   private void initViews(boolean isLaunchByDeeplink)
@@ -468,35 +482,35 @@ public class MwmActivity extends BaseMwmFragmentActivity
         finish();
     });
     mPointChooser.findViewById(R.id.done).setOnClickListener(
-        v ->
-        {
-          switch (mPointChooserMode)
-          {
-          case API:
-            final Intent apiResult = new Intent();
-            final double[] center = Framework.nativeGetScreenRectCenter();
-            apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
-            apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
-            apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
-            setResult(Activity.RESULT_OK, apiResult);
-            finish();
-            break;
-          case EDITOR:
-            if (Framework.nativeIsDownloadedMapAtScreenCenter())
-              startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
-            else
+            v ->
             {
-                new AlertDialog.Builder(this, R.style.MwmTheme_AlertDialog)
-                    .setTitle(R.string.message_invalid_feature_position)
-                    .setPositiveButton(R.string.ok, null)
-                    .show();
-            }
-            break;
-          case NONE:
-            throw new IllegalStateException("Unexpected mPositionChooserMode");
-          }
-          closePositionChooser();
-        });
+              switch (mPointChooserMode)
+              {
+                case API:
+                  final Intent apiResult = new Intent();
+                  final double[] center = Framework.nativeGetScreenRectCenter();
+                  apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
+                  apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
+                  apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
+                  setResult(Activity.RESULT_OK, apiResult);
+                  finish();
+                  break;
+                case EDITOR:
+                  if (Framework.nativeIsDownloadedMapAtScreenCenter())
+                    startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
+                  else
+                  {
+                    new AlertDialog.Builder(this, R.style.MwmTheme_AlertDialog)
+                            .setTitle(R.string.message_invalid_feature_position)
+                            .setPositiveButton(R.string.ok, null)
+                            .show();
+                  }
+                  break;
+                case NONE:
+                  throw new IllegalStateException("Unexpected mPositionChooserMode");
+              }
+              closePositionChooser();
+            });
     UiUtils.hide(mPointChooser);
   }
 
@@ -574,9 +588,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
       mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName());
       mMapFragment.setArguments(args);
       manager
-          .beginTransaction()
-          .replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
-          .commit();
+              .beginTransaction()
+              .replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
+              .commit();
     }
 
     View container = findViewById(R.id.map_fragment_container);
@@ -597,7 +611,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
     if (mPreviousMapLayoutMode != layoutMode)
     {
       FragmentTransaction transaction = getSupportFragmentManager()
-          .beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
+              .beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
       transaction.commit();
       mPreviousMapLayoutMode = layoutMode;
     }
@@ -648,7 +662,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private boolean closeBottomSheet(String id)
   {
     MenuBottomSheetFragment bottomSheet =
-        (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
+            (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
     if (bottomSheet == null || !bottomSheet.isAdded())
       return false;
     bottomSheet.dismiss();
@@ -885,11 +899,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
     }
 
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-        .setTitle(R.string.downloader_update_maps)
-        .setMessage(R.string.isolines_activation_error_dialog)
-        .setPositiveButton(R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
-        .setNegativeButton(R.string.cancel, null)
-        .show();
+            .setTitle(R.string.downloader_update_maps)
+            .setMessage(R.string.isolines_activation_error_dialog)
+            .setPositiveButton(R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
+            .setNegativeButton(R.string.cancel, null)
+            .show();
   }
 
   @Override
@@ -920,9 +934,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   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))
+            !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);
@@ -939,7 +953,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private boolean isMapRendererActive()
   {
     return mMapFragment != null && Map.isEngineCreated()
-           && mMapFragment.isContextCreated();
+            && mMapFragment.isContextCreated();
   }
 
   private void addTask(MapTask task)
@@ -956,6 +970,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
     super.onResume();
     refreshSearchToolbar();
     setFullscreen(isFullscreen());
+    Handler handler = new Handler(Looper.getMainLooper());
+    handler.postDelayed(new Runnable() {
+      @Override
+      public void run() {
+        checkClipboardForUrl();
+      }
+    }, 1000);
+
     if (Framework.nativeIsInChoosePositionMode())
     {
       UiUtils.show(mPointChooser);
@@ -966,6 +988,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
 
     mNavigationController.onActivityResumed(this);
     refreshLightStatusBar();
+    Log.e("test1","FROM RESUMEEEEEEE");
   }
 
   @Override
@@ -1041,9 +1064,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   {
     RoutingController routingController = RoutingController.get();
     if (!closeBottomSheet(MAIN_MENU_ID) && !closeBottomSheet(LAYERS_MENU_ID) && !collapseNavMenu() &&
-        !closePlacePage() &&!closeSearchToolbar(true, true) &&
-        !closeSidePanel() && !closePositionChooser() &&
-        !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
+            !closePlacePage() &&!closeSearchToolbar(true, true) &&
+            !closeSidePanel() && !closePositionChooser() &&
+            !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
     {
       try
       {
@@ -1076,8 +1099,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
       return;
 
     fm.beginTransaction()
-      .remove(fragment)
-      .commitAllowingStateLoss();
+            .remove(fragment)
+            .commitAllowingStateLoss();
     fm.executePendingTransactions();
   }
 
@@ -1123,7 +1146,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
     if (switchFullScreenMode)
     {
       if ((mPanelAnimator != null && mPanelAnimator.isVisible()) ||
-          UiUtils.isVisible(mSearchController.getToolbar()))
+              UiUtils.isVisible(mSearchController.getToolbar()))
         return;
 
       setFullscreen(!isFullscreen());
@@ -1137,8 +1160,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private void setFullscreen(boolean isFullscreen)
   {
     if (RoutingController.get().isNavigating()
-        || RoutingController.get().isBuilding()
-        || RoutingController.get().isPlanning())
+            || RoutingController.get().isBuilding()
+            || RoutingController.get().isPlanning())
       return;
 
     mMapButtonsViewModel.setButtonsHidden(isFullscreen);
@@ -1549,7 +1572,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps)
   {
     RoutingErrorDialogFragment fragment = RoutingErrorDialogFragment.create(getSupportFragmentManager().getFragmentFactory(),
-                                                                            getApplicationContext(), lastResultCode, lastMissingMaps);
+            getApplicationContext(), lastResultCode, lastMissingMaps);
     fragment.show(getSupportFragmentManager(), RoutingErrorDialogFragment.class.getSimpleName());
   }
 
@@ -1557,11 +1580,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onDrivingOptionsBuildError()
   {
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-        .setTitle(R.string.unable_to_calc_alert_title)
-        .setMessage(R.string.unable_to_calc_alert_subtitle)
-        .setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
-        .setNegativeButton(R.string.cancel, null)
-        .show();
+            .setTitle(R.string.unable_to_calc_alert_title)
+            .setMessage(R.string.unable_to_calc_alert_subtitle)
+            .setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
+            .setNegativeButton(R.string.cancel, null)
+            .show();
   }
 
   @Override
@@ -1569,29 +1592,29 @@ public class MwmActivity extends BaseMwmFragmentActivity
   {
     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 })
+            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(startPoint, endPoint);
-        })
-        .show();
+            .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(startPoint, endPoint);
+            })
+            .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);
+            .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);
@@ -1610,11 +1633,103 @@ public class MwmActivity extends BaseMwmFragmentActivity
     builder.show();
   }
 
+  private class HttpRequestTask extends AsyncTask<String, Void, String> {
+    private Context context;
+    private ProgressDialog progressDialog;
+    public HttpRequestTask(Context context) {
+      this.context = context;
+    }
+    @Override
+    protected void onPreExecute() {
+      super.onPreExecute();
+      // Show the progress dialog
+      progressDialog = ProgressDialog.show(context, "", "Redirecting to URL using the anonymous proxy", true);
+    }
+
+    @Override
+    protected String doInBackground(String... params) {
+      String requestUrl = params[0];
+      try {
+        URL url = new URL(requestUrl);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("GET");
+        connection.connect();
+
+        InputStream inputStream = connection.getInputStream();
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int bytesRead;
+        while ((bytesRead = inputStream.read(buffer)) != -1) {
+          byteArrayOutputStream.write(buffer, 0, bytesRead);
+        }
+        byte[] responseBytes = byteArrayOutputStream.toByteArray();
+        return new String(responseBytes);
+      } catch (Exception e) {
+        Log.e("test1", "Error performing HTTP request: " + e.getMessage());
+        Toast.makeText(context, "Redirection failed, please check your internet connection.", Toast.LENGTH_SHORT).show();
+        return null;
+      }
+    }
+
+    @Override
+    protected void onPostExecute(String response) {
+      if (response != null) {
+        try {
+          JSONObject jsonObject = new JSONObject(response);
+          JSONObject urlObject = jsonObject.getJSONObject("url");
+          String geo = urlObject.getString("geo");
+          Log.e("test1", "Geo: " + geo);
+          Log.e("test1", geo);
+          progressDialog.dismiss();
+          Map.nativeShowMapForUrl(geo);
+          ClipboardManager clipService = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
+          ClipData clipData = ClipData.newPlainText("", "");
+          clipService.setPrimaryClip(clipData);
+          Log.e("test1","finish");
+        } catch (JSONException e) {
+          Log.e("test1", "Error");
+          e.printStackTrace();
+        }
+      } else {
+        Log.e("test1", "HTTP request failed");
+        Toast.makeText(context, "Please check that your URL points to an address.", Toast.LENGTH_SHORT).show();
+      }
+    }
+  }
+public void checkClipboardForUrl() {
+  ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
+  Log.e("test1","clipboard is "+ String.valueOf(clipboard!=null) + "and primary clip" + String.valueOf(clipboard.hasPrimaryClip()));
+  if (clipboard != null ) {
+    Log.e("test1","first");
+    ClipData clipData = clipboard.getPrimaryClip();
+    Log.e("test1","clipdata is "+ String.valueOf(clipData!=null));
+    if (clipData != null && clipData.getItemCount() > 0) {
+      Log.e("test1","second");
+      CharSequence text = clipData.getItemAt(0).getText();
+      String clipboardText = text.toString();
+      Log.e("test1", clipboardText);
+      if (clipboardText.contains("goo.gl") || clipboardText.contains("maps.app.goo.gl") || clipboardText.contains("www.google.com")) {
+        Log.e("test1", "The copied text is from Google");
+        try {
+          String url = clipboardText;
+          String requestUrl = "https://url-un.kartikay-2101ce32.workers.dev/coordinates?url=" + url;
+          Log.e("test1", requestUrl);
+          new HttpRequestTask(this).execute(requestUrl);
+        } catch (Exception e) {
+          Log.e("test1", "Error performing HTTP request: " + e.getMessage());
+        }
+      }
+    }
+  }
+}
+
+
   @Override
   public void onMyPositionModeChanged(int newMode)
   {
     Logger.d(TAG, "location newMode = " + newMode);
     mMapButtonsViewModel.setMyPositionMode(newMode);
+
     RoutingController controller = RoutingController.get();
     if (controller.isPlanning())
       showAddStartOrFinishFrame(controller, true);
@@ -1686,8 +1801,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
   @Override
   public void onBookmarksFileLoaded(boolean success)
   {
-    Utils.showSnackbar(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame),
-                        success ? R.string.load_kmz_successful : R.string.load_kmz_failed);
+    Utils.showSnackbar(this, findViewById(R.id.coordinator),
+            success ? R.string.load_kmz_successful : R.string.load_kmz_failed);
   }
 
   @Override
@@ -1806,10 +1921,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
       ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
       items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
       items.add(new MenuBottomSheetItem(
-          R.string.download_maps,
-          R.drawable.ic_download,
-          getDownloadMapsCounter(),
-          this::onDownloadMapsOptionSelected
+              R.string.download_maps,
+              R.drawable.ic_download,
+              getDownloadMapsCounter(),
+              this::onDownloadMapsOptionSelected
       ));
       mDonatesUrl = Config.getDonateUrl();
       if (!TextUtils.isEmpty(mDonatesUrl))
@@ -1846,4 +1961,4 @@ public class MwmActivity extends BaseMwmFragmentActivity
     if (level >= TRIM_MEMORY_RUNNING_LOW)
       Framework.nativeMemoryWarning();
   }
-}
+}
\ No newline at end of file
-- 
2.45.3


From 687a44cd2cee55fa972525984858ba37d32642fb Mon Sep 17 00:00:00 2001
From: Kartikay <120778728+kartikaysaxena@users.noreply.github.com>
Date: Sun, 9 Jul 2023 22:23:00 +0530
Subject: [PATCH 08/11] Fixed side cases when internet connection is not
 available

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 android/src/app/organicmaps/MwmActivity.java | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/android/src/app/organicmaps/MwmActivity.java b/android/src/app/organicmaps/MwmActivity.java
index 9720622f0d..3628381b4a 100644
--- a/android/src/app/organicmaps/MwmActivity.java
+++ b/android/src/app/organicmaps/MwmActivity.java
@@ -8,6 +8,8 @@ import android.content.ClipboardManager;
 import android.content.Context;
 import android.content.Intent;
 import android.location.Location;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
@@ -102,6 +104,7 @@ import app.organicmaps.widget.placepage.PlacePageController;
 import app.organicmaps.widget.placepage.PlacePageData;
 import app.organicmaps.widget.placepage.PlacePageViewModel;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.android.material.snackbar.Snackbar;
 
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -974,7 +977,12 @@ public class MwmActivity extends BaseMwmFragmentActivity
     handler.postDelayed(new Runnable() {
       @Override
       public void run() {
-        checkClipboardForUrl();
+        try {
+          checkClipboardForUrl();
+        }
+        catch (Exception e) {
+          Log.e("test1","Exception caught");
+        }
       }
     }, 1000);
 
@@ -1665,8 +1673,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
         byte[] responseBytes = byteArrayOutputStream.toByteArray();
         return new String(responseBytes);
       } catch (Exception e) {
+        progressDialog.dismiss();
+        View view = findViewById(android.R.id.content);
+        Snackbar.make(view, "Redirection failed, please check your internet connection.", Snackbar.LENGTH_SHORT).show();
         Log.e("test1", "Error performing HTTP request: " + e.getMessage());
-        Toast.makeText(context, "Redirection failed, please check your internet connection.", Toast.LENGTH_SHORT).show();
         return null;
       }
     }
@@ -1687,12 +1697,14 @@ public class MwmActivity extends BaseMwmFragmentActivity
           clipService.setPrimaryClip(clipData);
           Log.e("test1","finish");
         } catch (JSONException e) {
+          progressDialog.dismiss();
+          View view = findViewById(android.R.id.content);
+          Snackbar.make(view, "Please check that your URL points to an address.", Snackbar.LENGTH_SHORT).show();
           Log.e("test1", "Error");
           e.printStackTrace();
         }
       } else {
         Log.e("test1", "HTTP request failed");
-        Toast.makeText(context, "Please check that your URL points to an address.", Toast.LENGTH_SHORT).show();
       }
     }
   }
-- 
2.45.3


From b8343dcc46750415a26ee6d2ae15c0ff8f56c2cb Mon Sep 17 00:00:00 2001
From: Kartikay <kartikay_2101ce32@iitp.ac.in>
Date: Mon, 10 Jul 2023 19:15:05 +0530
Subject: [PATCH 09/11] Revert "[docs] Add TrackerControl for iOS into README"

This reverts commit 5b84fc782b77910b97da1253c6ef52c4c0c26626.
---
 README.md                           |   7 +------
 docs/privacy/trackercontrol-ios.png | Bin 12265 -> 0 bytes
 2 files changed, 1 insertion(+), 6 deletions(-)
 delete mode 100644 docs/privacy/trackercontrol-ios.png

diff --git a/README.md b/README.md
index be14a61cd5..94fce71758 100644
--- a/README.md
+++ b/README.md
@@ -69,16 +69,11 @@ Organic Maps app is free from trackers and other bad stuff:
 - No crapware
 - ~~No pesticides~~ Purely organic!
 
-The Android application is verified by <a href="https://reports.exodus-privacy.eu.org/en/reports/app.organicmaps/latest/">Exodus Privacy Project:
+The application is verified by <a href="https://reports.exodus-privacy.eu.org/en/reports/app.organicmaps/latest/">Exodus Privacy Project:
 
 <img src="docs/privacy/exodus.png" width="400">
 </a>
 
-The iOS application is verified by <a href="https://ios.trackercontrol.org/app/app.organicmaps">TrackerControl for iOS:
-
-<img src="docs/privacy/trackercontrol-ios.png" width="400">
-</a>
-
 <br/>
 
 Organic Maps doesn't request excessive permissions to spy on you:
diff --git a/docs/privacy/trackercontrol-ios.png b/docs/privacy/trackercontrol-ios.png
deleted file mode 100644
index ce4d78e81c3623e646165d450e19fccdb8e012f2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12265
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
F{{y(#!}b6G

-- 
2.45.3


From ea43935a2455eee2e873b9665051175963edf887 Mon Sep 17 00:00:00 2001
From: Kartikay <kartikay_2101ce32@iitp.ac.in>
Date: Mon, 10 Jul 2023 19:17:03 +0530
Subject: [PATCH 10/11] Revert "[android] improve how pp extends under status
 bar"

This reverts commit 7a532dd871eaa701e055f185f5d05c47a2fa5995.

Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
---
 .../layout/place_page_container_fragment.xml  |  8 ---
 .../widget/placepage/PlacePageController.java | 54 ++-----------------
 2 files changed, 3 insertions(+), 59 deletions(-)

diff --git a/android/res/layout/place_page_container_fragment.xml b/android/res/layout/place_page_container_fragment.xml
index db75b662e4..f53af67f3a 100644
--- a/android/res/layout/place_page_container_fragment.xml
+++ b/android/res/layout/place_page_container_fragment.xml
@@ -4,17 +4,9 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
-  <View
-    android:id="@+id/place_page_status_bar_background"
-    android:layout_width="0dp"
-    android:layout_height="0dp"
-    android:layout_gravity="center_horizontal|top"
-    android:background="?ppBackground"
-    android:visibility="gone" />
   <androidx.core.widget.NestedScrollViewClickFixed
     android:id="@+id/placepage"
     style="?attr/bottomSheetStyle"
-    android:elevation="0dp"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:fillViewport="true"
diff --git a/android/src/app/organicmaps/widget/placepage/PlacePageController.java b/android/src/app/organicmaps/widget/placepage/PlacePageController.java
index 965eb2b617..e0ac913f1a 100644
--- a/android/src/app/organicmaps/widget/placepage/PlacePageController.java
+++ b/android/src/app/organicmaps/widget/placepage/PlacePageController.java
@@ -11,7 +11,6 @@ import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.core.graphics.Insets;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
 import androidx.core.widget.NestedScrollViewClickFixed;
@@ -32,7 +31,6 @@ import app.organicmaps.bookmarks.data.RoadWarningMarkType;
 import app.organicmaps.routing.RoutingController;
 import app.organicmaps.settings.RoadType;
 import app.organicmaps.util.SharingUtils;
-import app.organicmaps.util.ThemeUtils;
 import app.organicmaps.util.UiUtils;
 import app.organicmaps.util.bottomsheet.MenuBottomSheetFragment;
 import app.organicmaps.util.bottomsheet.MenuBottomSheetItem;
@@ -56,12 +54,10 @@ public class PlacePageController extends Fragment implements
   private BottomSheetBehavior<View> mPlacePageBehavior;
   private NestedScrollViewClickFixed mPlacePage;
   private ViewGroup mPlacePageContainer;
-  private View mPlacePageStatusBarBackground;
   private ViewGroup mCoordinator;
   private int mViewportMinHeight;
   private int mButtonsHeight;
   private int mMaxButtons;
-  private int mRoutingHeaderHeight;
   private PlacePageViewModel mViewModel;
   private int mPreviewHeight;
   private int mFrameHeight;
@@ -76,8 +72,6 @@ public class PlacePageController extends Fragment implements
 
   private ValueAnimator mCustomPeekHeightAnimator;
   private PlacePageRouteSettingsListener mPlacePageRouteSettingsListener;
-  private final Observer<Integer> mPlacePageDistanceToTopObserver = this::updateStatusBarBackground;
-
   private final BottomSheetBehavior.BottomSheetCallback mDefaultBottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback()
   {
     @Override
@@ -120,13 +114,11 @@ public class PlacePageController extends Fragment implements
     mViewportMinHeight = res.getDimensionPixelSize(R.dimen.viewport_min_height);
     mButtonsHeight = (int) res.getDimension(R.dimen.place_page_buttons_height);
     mMaxButtons = res.getInteger(R.integer.pp_buttons_max);
-    mRoutingHeaderHeight = (int) res.getDimension(ThemeUtils.getResource(requireContext(), R.attr.actionBarSize));
 
     mCoordinator = activity.findViewById(R.id.coordinator);
     mPlacePage = view.findViewById(R.id.placepage);
     mPlacePageContainer = view.findViewById(R.id.placepage_container);
     mPlacePageBehavior = BottomSheetBehavior.from(mPlacePage);
-    mPlacePageStatusBarBackground = view.findViewById(R.id.place_page_status_bar_background);
 
     mShouldCollapse = true;
 
@@ -141,14 +133,6 @@ public class PlacePageController extends Fragment implements
 
     ViewCompat.setOnApplyWindowInsetsListener(mPlacePage, (v, windowInsets) -> {
       mCurrentWindowInsets = windowInsets;
-      final Insets insets = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
-      final ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) mPlacePageStatusBarBackground.getLayoutParams();
-      // Layout calculations are heavy so we compute them once then move the view from behind the place page to the status bar
-      layoutParams.height = insets.top;
-      layoutParams.width = mPlacePage.getWidth();
-      // Make sure the view is centered within the insets as is the place page
-      layoutParams.setMargins(insets.left, 0, insets.right, 0);
-      mPlacePageStatusBarBackground.setLayoutParams(layoutParams);
       return windowInsets;
     });
   }
@@ -225,19 +209,14 @@ public class PlacePageController extends Fragment implements
   private void setPlacePageHeightBounds()
   {
     final int peekHeight = calculatePeekHeight();
-    final Insets insets = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
     // Make sure the place page can reach the peek height
-    final int minHeight = Math.max(peekHeight, mFrameHeight);
-    // Prevent the place page from showing under the status bar
-    // If we are in planning mode, prevent going above the header
-    final int topInsets = insets.top + (RoutingController.get().isPlanning() ? mRoutingHeaderHeight : 0);
-    final int maxHeight = Math.min(minHeight + insets.bottom, mCoordinator.getHeight() - topInsets);
+    final int height = Math.max(peekHeight, mFrameHeight);
     // Set the minimum height of the place page to prevent jumps when new data results in SMALLER content
     // This cannot be set on the place page itself as it has the fitToContent property set
-    mPlacePageContainer.setMinimumHeight(minHeight);
+    mPlacePageContainer.setMinimumHeight(height);
     // Set the maximum height of the place page to prevent jumps when new data results in BIGGER content
     // It does not take into account the navigation bar height so we need to add it manually
-    mPlacePageBehavior.setMaxHeight(maxHeight);
+    mPlacePageBehavior.setMaxHeight(height + mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom);
   }
 
   /**
@@ -315,7 +294,6 @@ public class PlacePageController extends Fragment implements
     mPreviewHeight = previewHeight;
     mFrameHeight = frameHeight;
     mViewModel.setPlacePageWidth(mPlacePage.getWidth());
-    mPlacePageStatusBarBackground.getLayoutParams().width = mPlacePage.getWidth();
     // Make sure to update the peek height on the UI thread to prevent weird animation jumps
     mPlacePage.post(() -> {
       setPeekHeight();
@@ -590,37 +568,12 @@ public class PlacePageController extends Fragment implements
       close();
   }
 
-  private void updateStatusBarBackground(int distanceToTop)
-  {
-    // This callback may be called before insets are updated when resuming the app
-    if (mCurrentWindowInsets == null)
-      return;
-    final int topInset = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).top;
-    // Only animate the status bar background if the place page can reach it
-    if (mCoordinator.getHeight() - mPlacePageContainer.getHeight() < topInset)
-    {
-      final int animationStartHeight = topInset * 3;
-      int newHeight = 0;
-      if (distanceToTop < animationStartHeight)
-        newHeight = Math.min(topInset * (animationStartHeight - distanceToTop) / 100, topInset);
-      if (newHeight > 0)
-      {
-        mPlacePageStatusBarBackground.setTranslationY(distanceToTop - newHeight);
-        if (!UiUtils.isVisible(mPlacePageStatusBarBackground))
-          UiUtils.show(mPlacePageStatusBarBackground);
-      }
-      else if (UiUtils.isVisible(mPlacePageStatusBarBackground))
-        UiUtils.hide(mPlacePageStatusBarBackground);
-    }
-  }
-
   @Override
   public void onStart()
   {
     super.onStart();
     mPlacePageBehavior.addBottomSheetCallback(mDefaultBottomSheetCallback);
     mViewModel.getMapObject().observe(requireActivity(), this);
-    mViewModel.getPlacePageDistanceToTop().observe(requireActivity(), mPlacePageDistanceToTopObserver);
   }
 
   @Override
@@ -637,7 +590,6 @@ public class PlacePageController extends Fragment implements
     super.onStop();
     mPlacePageBehavior.removeBottomSheetCallback(mDefaultBottomSheetCallback);
     mViewModel.getMapObject().removeObserver(this);
-    mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver);
   }
 
   public interface PlacePageRouteSettingsListener
-- 
2.45.3


From be1c6e3f5bdcfa76517a65cb3662b9f1638e0018 Mon Sep 17 00:00:00 2001
From: Kartikay <kartikay_2101ce32@iitp.ac.in>
Date: Thu, 13 Jul 2023 00:20:20 +0530
Subject: [PATCH 11/11] Reverted to original format

---
 android/src/app/organicmaps/MwmActivity.java | 222 +++++++++----------
 1 file changed, 110 insertions(+), 112 deletions(-)

diff --git a/android/src/app/organicmaps/MwmActivity.java b/android/src/app/organicmaps/MwmActivity.java
index 3628381b4a..ff23790129 100644
--- a/android/src/app/organicmaps/MwmActivity.java
+++ b/android/src/app/organicmaps/MwmActivity.java
@@ -118,21 +118,21 @@ import java.util.Objects;
 import java.util.Stack;
 
 public class MwmActivity extends BaseMwmFragmentActivity
-        implements PlacePageActivationListener,
-        View.OnTouchListener,
-        MapRenderingListener,
-        CustomNavigateUpListener,
-        RoutingController.Container,
-        LocationListener,
-        LocationState.ModeChangeListener,
-        RoutingPlanInplaceController.RoutingPlanListener,
-        RoutingBottomMenuListener,
-        BookmarkManager.BookmarksLoadingListener,
-        FloatingSearchToolbarController.SearchToolbarListener,
-        NoConnectionListener,
-        MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
-        PlacePageController.PlacePageRouteSettingsListener,
-        MapButtonsController.MapButtonClickListener
+    implements PlacePageActivationListener,
+               View.OnTouchListener,
+               MapRenderingListener,
+               CustomNavigateUpListener,
+               RoutingController.Container,
+               LocationListener,
+               LocationState.ModeChangeListener,
+               RoutingPlanInplaceController.RoutingPlanListener,
+               RoutingBottomMenuListener,
+               BookmarkManager.BookmarksLoadingListener,
+               FloatingSearchToolbarController.SearchToolbarListener,
+               NoConnectionListener,
+               MenuBottomSheetFragment.MenuBottomSheetInterfaceWithHeader,
+               PlacePageController.PlacePageRouteSettingsListener,
+               MapButtonsController.MapButtonClickListener
 {
   private static final String TAG = MwmActivity.class.getSimpleName();
 
@@ -142,10 +142,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private static final String EXTRA_CONSUMED = "mwm.extra.intent.processed";
 
   private static final String[] DOCKED_FRAGMENTS = { SearchFragment.class.getName(),
-          DownloaderFragment.class.getName(),
-          RoutingPlanFragment.class.getName(),
-          EditorHostFragment.class.getName(),
-          ReportFragment.class.getName() };
+                                                     DownloaderFragment.class.getName(),
+                                                     RoutingPlanFragment.class.getName(),
+                                                     EditorHostFragment.class.getName(),
+                                                     ReportFragment.class.getName() };
 
   public static final int REQ_CODE_ERROR_DRIVING_OPTIONS_DIALOG = 5;
   public static final int REQ_CODE_DRIVING_OPTIONS = 6;
@@ -216,7 +216,7 @@ 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(DownloadResourcesLegacyActivity.EXTRA_COUNTRY, countryId);
   }
 
   @Override
@@ -252,7 +252,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   protected int getFragmentContentResId()
   {
     return (mIsTabletLayout ? R.id.fragment_container
-            : super.getFragmentContentResId());
+                            : super.getFragmentContentResId());
   }
 
   @Nullable
@@ -328,10 +328,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
     }
 
     new MaterialAlertDialogBuilder(MwmActivity.this, R.style.MwmTheme_AlertDialog)
-            .setMessage(R.string.unknown_current_position)
-            .setCancelable(true)
-            .setPositiveButton(R.string.ok, null)
-            .show();
+        .setMessage(R.string.unknown_current_position)
+        .setCancelable(true)
+        .setPositiveButton(R.string.ok, null)
+        .show();
   }
 
   @Override
@@ -389,7 +389,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
 
     mSearchController = new FloatingSearchToolbarController(this, this);
     mSearchController.getToolbar()
-            .getViewTreeObserver();
+                     .getViewTreeObserver();
 
     boolean isLaunchByDeepLink = getIntent().getBooleanExtra(EXTRA_LAUNCH_BY_DEEP_LINK, false);
     initViews(isLaunchByDeepLink);
@@ -410,9 +410,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private void refreshLightStatusBar()
   {
     UiUtils.setLightStatusBar(this, !(
-            ThemeUtils.isNightTheme(this)
-                    || RoutingController.get().isPlanning()
-                    || Framework.nativeIsInChoosePositionMode()
+        ThemeUtils.isNightTheme(this)
+        || RoutingController.get().isPlanning()
+        || Framework.nativeIsInChoosePositionMode()
     ));
   }
 
@@ -446,10 +446,10 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onNoConnectionError()
   {
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-            .setTitle(R.string.common_check_internet_connection_dialog_title)
-            .setMessage(R.string.common_check_internet_connection_dialog)
-            .setPositiveButton(R.string.ok, null)
-            .show();
+        .setTitle(R.string.common_check_internet_connection_dialog_title)
+        .setMessage(R.string.common_check_internet_connection_dialog)
+        .setPositiveButton(R.string.ok, null)
+        .show();
   }
 
   private void initViews(boolean isLaunchByDeeplink)
@@ -485,35 +485,35 @@ public class MwmActivity extends BaseMwmFragmentActivity
         finish();
     });
     mPointChooser.findViewById(R.id.done).setOnClickListener(
-            v ->
+        v ->
+        {
+          switch (mPointChooserMode)
+          {
+          case API:
+            final Intent apiResult = new Intent();
+            final double[] center = Framework.nativeGetScreenRectCenter();
+            apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
+            apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
+            apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
+            setResult(Activity.RESULT_OK, apiResult);
+            finish();
+            break;
+          case EDITOR:
+            if (Framework.nativeIsDownloadedMapAtScreenCenter())
+              startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
+            else
             {
-              switch (mPointChooserMode)
-              {
-                case API:
-                  final Intent apiResult = new Intent();
-                  final double[] center = Framework.nativeGetScreenRectCenter();
-                  apiResult.putExtra(Const.EXTRA_POINT_LAT, center[0]);
-                  apiResult.putExtra(Const.EXTRA_POINT_LON, center[1]);
-                  apiResult.putExtra(Const.EXTRA_ZOOM_LEVEL, Framework.nativeGetDrawScale());
-                  setResult(Activity.RESULT_OK, apiResult);
-                  finish();
-                  break;
-                case EDITOR:
-                  if (Framework.nativeIsDownloadedMapAtScreenCenter())
-                    startActivity(new Intent(MwmActivity.this, FeatureCategoryActivity.class));
-                  else
-                  {
-                    new AlertDialog.Builder(this, R.style.MwmTheme_AlertDialog)
-                            .setTitle(R.string.message_invalid_feature_position)
-                            .setPositiveButton(R.string.ok, null)
-                            .show();
-                  }
-                  break;
-                case NONE:
-                  throw new IllegalStateException("Unexpected mPositionChooserMode");
-              }
-              closePositionChooser();
-            });
+                new AlertDialog.Builder(this, R.style.MwmTheme_AlertDialog)
+                    .setTitle(R.string.message_invalid_feature_position)
+                    .setPositiveButton(R.string.ok, null)
+                    .show();
+            }
+            break;
+          case NONE:
+            throw new IllegalStateException("Unexpected mPositionChooserMode");
+          }
+          closePositionChooser();
+        });
     UiUtils.hide(mPointChooser);
   }
 
@@ -591,9 +591,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
       mMapFragment = (MapFragment) factory.instantiate(getClassLoader(), MapFragment.class.getName());
       mMapFragment.setArguments(args);
       manager
-              .beginTransaction()
-              .replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
-              .commit();
+          .beginTransaction()
+          .replace(R.id.map_fragment_container, mMapFragment, MapFragment.class.getName())
+          .commit();
     }
 
     View container = findViewById(R.id.map_fragment_container);
@@ -614,7 +614,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
     if (mPreviousMapLayoutMode != layoutMode)
     {
       FragmentTransaction transaction = getSupportFragmentManager()
-              .beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
+          .beginTransaction().replace(R.id.map_buttons, new MapButtonsController());
       transaction.commit();
       mPreviousMapLayoutMode = layoutMode;
     }
@@ -665,7 +665,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private boolean closeBottomSheet(String id)
   {
     MenuBottomSheetFragment bottomSheet =
-            (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
+        (MenuBottomSheetFragment) getSupportFragmentManager().findFragmentByTag(id);
     if (bottomSheet == null || !bottomSheet.isAdded())
       return false;
     bottomSheet.dismiss();
@@ -902,11 +902,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
     }
 
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-            .setTitle(R.string.downloader_update_maps)
-            .setMessage(R.string.isolines_activation_error_dialog)
-            .setPositiveButton(R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
-            .setNegativeButton(R.string.cancel, null)
-            .show();
+        .setTitle(R.string.downloader_update_maps)
+        .setMessage(R.string.isolines_activation_error_dialog)
+        .setPositiveButton(R.string.ok, (dialog, which) -> startActivity(new Intent(this, DownloaderActivity.class)))
+        .setNegativeButton(R.string.cancel, null)
+        .show();
   }
 
   @Override
@@ -937,9 +937,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   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))
+        !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);
@@ -956,7 +956,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private boolean isMapRendererActive()
   {
     return mMapFragment != null && Map.isEngineCreated()
-            && mMapFragment.isContextCreated();
+           && mMapFragment.isContextCreated();
   }
 
   private void addTask(MapTask task)
@@ -996,7 +996,6 @@ public class MwmActivity extends BaseMwmFragmentActivity
 
     mNavigationController.onActivityResumed(this);
     refreshLightStatusBar();
-    Log.e("test1","FROM RESUMEEEEEEE");
   }
 
   @Override
@@ -1072,9 +1071,9 @@ public class MwmActivity extends BaseMwmFragmentActivity
   {
     RoutingController routingController = RoutingController.get();
     if (!closeBottomSheet(MAIN_MENU_ID) && !closeBottomSheet(LAYERS_MENU_ID) && !collapseNavMenu() &&
-            !closePlacePage() &&!closeSearchToolbar(true, true) &&
-            !closeSidePanel() && !closePositionChooser() &&
-            !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
+        !closePlacePage() &&!closeSearchToolbar(true, true) &&
+        !closeSidePanel() && !closePositionChooser() &&
+        !routingController.resetToPlanningStateIfNavigating() && !routingController.cancel())
     {
       try
       {
@@ -1107,8 +1106,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
       return;
 
     fm.beginTransaction()
-            .remove(fragment)
-            .commitAllowingStateLoss();
+      .remove(fragment)
+      .commitAllowingStateLoss();
     fm.executePendingTransactions();
   }
 
@@ -1154,7 +1153,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
     if (switchFullScreenMode)
     {
       if ((mPanelAnimator != null && mPanelAnimator.isVisible()) ||
-              UiUtils.isVisible(mSearchController.getToolbar()))
+          UiUtils.isVisible(mSearchController.getToolbar()))
         return;
 
       setFullscreen(!isFullscreen());
@@ -1168,8 +1167,8 @@ public class MwmActivity extends BaseMwmFragmentActivity
   private void setFullscreen(boolean isFullscreen)
   {
     if (RoutingController.get().isNavigating()
-            || RoutingController.get().isBuilding()
-            || RoutingController.get().isPlanning())
+        || RoutingController.get().isBuilding()
+        || RoutingController.get().isPlanning())
       return;
 
     mMapButtonsViewModel.setButtonsHidden(isFullscreen);
@@ -1580,7 +1579,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onCommonBuildError(int lastResultCode, @NonNull String[] lastMissingMaps)
   {
     RoutingErrorDialogFragment fragment = RoutingErrorDialogFragment.create(getSupportFragmentManager().getFragmentFactory(),
-            getApplicationContext(), lastResultCode, lastMissingMaps);
+                                                                            getApplicationContext(), lastResultCode, lastMissingMaps);
     fragment.show(getSupportFragmentManager(), RoutingErrorDialogFragment.class.getSimpleName());
   }
 
@@ -1588,11 +1587,11 @@ public class MwmActivity extends BaseMwmFragmentActivity
   public void onDrivingOptionsBuildError()
   {
     new MaterialAlertDialogBuilder(this, R.style.MwmTheme_AlertDialog)
-            .setTitle(R.string.unable_to_calc_alert_title)
-            .setMessage(R.string.unable_to_calc_alert_subtitle)
-            .setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
-            .setNegativeButton(R.string.cancel, null)
-            .show();
+        .setTitle(R.string.unable_to_calc_alert_title)
+        .setMessage(R.string.unable_to_calc_alert_subtitle)
+        .setPositiveButton(R.string.settings, (dialog, which) -> DrivingOptionsActivity.start(this))
+        .setNegativeButton(R.string.cancel, null)
+        .show();
   }
 
   @Override
@@ -1600,29 +1599,29 @@ public class MwmActivity extends BaseMwmFragmentActivity
   {
     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 })
+        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(startPoint, endPoint);
-            })
-            .show();
+        .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(startPoint, endPoint);
+        })
+        .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);
+        .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);
@@ -1708,7 +1707,7 @@ public class MwmActivity extends BaseMwmFragmentActivity
       }
     }
   }
-public void checkClipboardForUrl() {
+  public void checkClipboardForUrl() {
   ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
   Log.e("test1","clipboard is "+ String.valueOf(clipboard!=null) + "and primary clip" + String.valueOf(clipboard.hasPrimaryClip()));
   if (clipboard != null ) {
@@ -1741,7 +1740,6 @@ public void checkClipboardForUrl() {
   {
     Logger.d(TAG, "location newMode = " + newMode);
     mMapButtonsViewModel.setMyPositionMode(newMode);
-
     RoutingController controller = RoutingController.get();
     if (controller.isPlanning())
       showAddStartOrFinishFrame(controller, true);
@@ -1813,8 +1811,8 @@ public void checkClipboardForUrl() {
   @Override
   public void onBookmarksFileLoaded(boolean success)
   {
-    Utils.showSnackbar(this, findViewById(R.id.coordinator),
-            success ? R.string.load_kmz_successful : R.string.load_kmz_failed);
+    Utils.showSnackbar(this, findViewById(R.id.coordinator), findViewById(R.id.menu_frame),
+                        success ? R.string.load_kmz_successful : R.string.load_kmz_failed);
   }
 
   @Override
@@ -1933,10 +1931,10 @@ public void checkClipboardForUrl() {
       ArrayList<MenuBottomSheetItem> items = new ArrayList<>();
       items.add(new MenuBottomSheetItem(R.string.placepage_add_place_button, R.drawable.ic_plus, this::onAddPlaceOptionSelected));
       items.add(new MenuBottomSheetItem(
-              R.string.download_maps,
-              R.drawable.ic_download,
-              getDownloadMapsCounter(),
-              this::onDownloadMapsOptionSelected
+          R.string.download_maps,
+          R.drawable.ic_download,
+          getDownloadMapsCounter(),
+          this::onDownloadMapsOptionSelected
       ));
       mDonatesUrl = Config.getDonateUrl();
       if (!TextUtils.isEmpty(mDonatesUrl))
-- 
2.45.3