diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index 4bbaad7639..1435d4153b 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -808,8 +808,8 @@
-
diff --git a/android/src/com/androidAuto/AndroidAutoService.java b/android/src/com/androidAuto/AndroidAutoService.java
new file mode 100644
index 0000000000..9ac9b85218
--- /dev/null
+++ b/android/src/com/androidAuto/AndroidAutoService.java
@@ -0,0 +1,51 @@
+package com.androidAuto;
+
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarAppService;
+import androidx.car.app.Screen;
+import androidx.car.app.Session;
+import androidx.car.app.validation.HostValidator;
+
+public final class AndroidAutoService extends CarAppService
+{
+
+ public AndroidAutoService()
+ {
+ // Exported services must have an empty public constructor.
+ }
+
+ @Override
+ @NonNull
+ public Session onCreateSession()
+ {
+ return new Session()
+ {
+ @Override
+ @NonNull
+ public Screen onCreateScreen(@Nullable Intent intent)
+ {
+ return new MainScreen(getCarContext());
+ }
+ };
+ }
+
+ @NonNull
+ @Override
+ public HostValidator createHostValidator()
+ {
+ if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0)
+ {
+ return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
+ }
+ else
+ {
+ return new HostValidator.Builder(getApplicationContext())
+ .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
+ .build();
+ }
+ }
+}
diff --git a/android/src/com/androidAuto/MainScreen.java b/android/src/com/androidAuto/MainScreen.java
new file mode 100644
index 0000000000..cc97e223c1
--- /dev/null
+++ b/android/src/com/androidAuto/MainScreen.java
@@ -0,0 +1,197 @@
+package com.androidAuto;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.Log;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.AppManager;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.SurfaceCallback;
+import androidx.car.app.SurfaceContainer;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.Template;
+import androidx.car.app.navigation.NavigationManager;
+import androidx.car.app.navigation.model.NavigationTemplate;
+import androidx.core.graphics.drawable.IconCompat;
+import com.mapswithme.maps.BuildConfig;
+import com.mapswithme.maps.MapFragment;
+import com.mapswithme.maps.MwmApplication;
+import com.mapswithme.maps.R;
+
+import java.io.IOException;
+
+public class MainScreen extends Screen implements SurfaceCallback
+{
+ private static final String TAG = MainScreen.class.getSimpleName();
+ @Nullable
+ private MapFragment mMapFragment;
+ private SurfaceCallback mSurfaceCallback;
+
+ public MainScreen(@NonNull CarContext carContext)
+ {
+ super(carContext);
+
+ MwmApplication cat = MwmApplication.from(carContext);
+ try
+ {
+ cat.init();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return;
+ }
+
+ carContext.getCarService(AppManager.class).setSurfaceCallback(this);
+ }
+
+ @NonNull
+ @Override
+ public Template onGetTemplate()
+ {
+ Log.e("Show Up", "Shows Up");
+ NavigationTemplate.Builder builder = new NavigationTemplate.Builder();
+ ActionStrip.Builder actionStripBuilder = new ActionStrip.Builder();
+ actionStripBuilder.addAction(new Action.Builder().setTitle("Exit")
+ .setOnClickListener(this::exit)
+ .build());
+
+ Action panAction = new Action.Builder(Action.PAN).build();
+ Action zoomIn = new Action.Builder().setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_zoom_in)).build())
+ .setOnClickListener(this::zoomIn)
+ .build();
+ Action zoomOut = new Action.Builder().setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_zoom_out)).build())
+ .setOnClickListener(this::zoomOut)
+ .build();
+
+ Action openMic = new Action.Builder().setIcon(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_booking)).build())
+ .setOnClickListener(this::zoomOut)
+ .build();
+
+ ActionStrip mapActionStrip = new ActionStrip.Builder().addAction(zoomIn)
+ .addAction(zoomOut)
+ .addAction(panAction).addAction(openMic)
+ .build();
+ builder.setMapActionStrip(mapActionStrip);
+ builder.setActionStrip(actionStripBuilder.build());
+ NavigationManager navigationManager = getCarContext().getCarService(NavigationManager.class);
+ return builder.build();
+ }
+
+ private void zoomOut()
+ {
+ MapFragment.nativeScaleMinus();
+ }
+
+ private void zoomIn()
+ {
+ MapFragment.nativeScalePlus();
+ }
+
+ private void exit()
+ {
+ getCarContext().finishCarApp();
+ MapFragment.nativeDetachSurface(true);
+ }
+
+ @Override
+ public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer)
+ {
+ Log.i(TAG, "Surface available " + surfaceContainer);
+
+ final Surface surface = surfaceContainer.getSurface();
+ if (surface == null)
+ {
+ Log.e(TAG, "Surface is NULL");
+ return;
+ }
+
+
+
+ if (MapFragment.nativeIsEngineCreated()){
+ MapFragment.nativeDetachSurface(true);
+ }
+
+
+ if (MapFragment.nativeIsEngineCreated())
+ {
+ if (!MapFragment.nativeAttachSurface(surface))
+ {
+ reportUnsupported();
+ return;
+ }
+ MapFragment.nativeResumeSurfaceRendering();
+ return;
+ }
+
+ final int WIDGET_COPYRIGHT = 0x04;
+ MapFragment.nativeSetupWidget(WIDGET_COPYRIGHT, 0.0f, 0.0f, 0);
+
+ if (!MapFragment.nativeCreateEngine(surface, surfaceContainer.getDpi(), true, false, BuildConfig.VERSION_CODE))
+ {
+ reportUnsupported();
+ return;
+ }
+
+ MapFragment.nativeResumeSurfaceRendering();
+ }
+
+ @Override
+ public void onVisibleAreaChanged(@NonNull Rect visibleArea)
+ {
+ SurfaceCallback.super.onVisibleAreaChanged(visibleArea);
+ Log.e("Something", "Lets see");
+ }
+
+ @Override
+ public void onStableAreaChanged(@NonNull Rect stableArea)
+ {
+ SurfaceCallback.super.onStableAreaChanged(stableArea);
+ }
+
+ @Override
+ public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer)
+ {
+ SurfaceCallback.super.onSurfaceDestroyed(surfaceContainer);
+ MapFragment.nativeDetachSurface(true);
+ Log.i(TAG, "Surface destroyed");
+ }
+
+ @Override
+ public void onScroll(float distanceX, float distanceY)
+ {
+ SurfaceCallback.super.onScroll(distanceX, distanceY);
+ Log.i("Scroll", "Scrolled ");
+ }
+
+ @Override
+ public void onFling(float velocityX, float velocityY)
+ {
+ SurfaceCallback.super.onFling(velocityX, velocityY);
+ Log.i("Fling", "Flinged");
+ }
+
+ @Override
+ public void onScale(float focusX, float focusY, float scaleFactor)
+ {
+ SurfaceCallback.super.onScale(focusX, focusY, scaleFactor);
+ }
+
+ @Override
+ public void onClick(float x, float y)
+ {
+ SurfaceCallback.super.onClick(x, y);
+ }
+
+ private void reportUnsupported()
+ {
+ final Context context = getCarContext();
+ Log.e(TAG, context.getString(R.string.unsupported_phone));
+ }
+}
\ No newline at end of file
diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java
index 76a4b37372..c0adeffd21 100644
--- a/android/src/com/mapswithme/maps/MapFragment.java
+++ b/android/src/com/mapswithme/maps/MapFragment.java
@@ -5,6 +5,7 @@ import android.content.DialogInterface;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
@@ -153,7 +154,12 @@ public class MapFragment extends BaseMwmFragment
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder)
{
- /*
+
+ if (MapFragment.nativeIsEngineCreated())
+ {
+ nativeDetachSurface(true);
+ }
+
if (isThemeChangingProcess())
{
Logger.d(TAG, "Activity is being recreated due theme changing, skip 'surfaceCreated' callback");
@@ -209,7 +215,6 @@ public class MapFragment extends BaseMwmFragment
nativeResumeSurfaceRendering();
if (mMapRenderingListener != null)
mMapRenderingListener.onRenderingCreated();
- */
}
@Override
@@ -335,6 +340,7 @@ public class MapFragment extends BaseMwmFragment
@Override
public boolean onTouch(View view, MotionEvent event)
{
+ Log.i("MOTION EVENT",event.toString());
final int count = event.getPointerCount();
if (count == 0)
@@ -386,8 +392,8 @@ public class MapFragment extends BaseMwmFragment
}
static native void nativeCompassUpdated(double north, boolean forceRedraw);
- static native void nativeScalePlus();
- static native void nativeScaleMinus();
+ public static native void nativeScalePlus();
+ public static native void nativeScaleMinus();
public static native boolean nativeShowMapForUrl(String url);
public static native boolean nativeIsEngineCreated();
static native boolean nativeDestroySurfaceOnDetach();
@@ -396,7 +402,7 @@ public class MapFragment extends BaseMwmFragment
boolean isLaunchByDeepLink,
int appVersionCode);
public static native boolean nativeAttachSurface(Surface surface);
- private static native void nativeDetachSurface(boolean destroySurface);
+ public static native void nativeDetachSurface(boolean destroySurface);
private static native void nativePauseSurfaceRendering();
public static native void nativeResumeSurfaceRendering();
private static native void nativeSurfaceChanged(Surface surface, int w, int h);
diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java
index 70d5df0536..3a51ee6a58 100644
--- a/android/src/com/mapswithme/maps/MwmApplication.java
+++ b/android/src/com/mapswithme/maps/MwmApplication.java
@@ -106,6 +106,7 @@ public class MwmApplication extends Application implements AppBackgroundTracker.
Logger.i(TAG, "Initializing application");
LogsManager.INSTANCE.initFileLogging(this);
+
// Set configuration directory as early as possible.
// Other methods may explicitly use Config, which requires settingsDir to be set.
final String settingsPath = StorageUtils.getSettingsPath(this);