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] [android] integrated proxy in Android Signed-off-by: Kartikay --- 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 { + 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 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