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