Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Making the screen mirror size as big as the navigation map? #14

Closed
DrTermi opened this issue Oct 31, 2022 · 37 comments
Closed

Making the screen mirror size as big as the navigation map? #14

DrTermi opened this issue Oct 31, 2022 · 37 comments

Comments

@DrTermi
Copy link

DrTermi commented Oct 31, 2022

Hello,
First of all thanks for the app, i wanted to know is there a way to make the screen mirror size as big as the navigation map? As you can see in the pictures i will post, the screen mirror has a lot of bottom margins left without use while the navigation app is full screen and very beautiful.
If there is a way, if you could just give me a hint of which part of the code i have to change for this?
Thanks

IMG_20221029_094439
photo_2022-10-28_19-56-31

@hufman
Copy link
Collaborator

hufman commented Nov 2, 2022

Very interesting, they generally have the same logic and so it should work the same.
I see a faint black outline around the screen mirroring, indicating that the app knows that the screen is supposed to be wider, but the height isn't as tall as it should be.
What phone do you have, what is its screen dimensions?

@DrTermi
Copy link
Author

DrTermi commented Nov 2, 2022

I have Xiaomi Redmi note 10 pro and the screen is 6.67inch (dimensions of the phone are 164 x 76.5 mm )
btw in the picture it's not very clear but not only there is a little black corner at the left of the screen mirror but also the whole screen mirror + black corner is still smaller than the BMW's screen size unlike the navigation map app. (the navigation map app pîcture i posted its in dark and not very clear but the map completely fill the bmw's screen)

@sbour015
Copy link

Hi, I have the same issue with a Evo idrive 5 and a Samsung Galaxy S10

@dvstnl
Copy link

dvstnl commented Feb 11, 2023

PXL_20230217_203225356
I've a pixel 6 with resolution of 2,400 x 1,080

The screen mirroring is tiny with the black borders

hmi.display-width: 800
hmi.type: MINI ID4++
hmi.version: EntryNav_3D1411_Release 3D1411-490-1428I Build 37 - Rev:127251 2014-08-08 10:14:08

@galenzhao
Copy link

galenzhao commented May 8, 2023

same here,

image

the red area is pure black,

the green area is like dark gray, seems like idrive's background.

apk downloaded from releases, commit: d0a0fa3

Redmi Note 12 Pro is a 6.67" device, with a 1080x2400 120Hz OLED display

hmi.display-height: 480
hmi.display-width: 800
hmi.role: HU
hmi.type: BMW ID6L
hmi.version: EntryEvo_ID5_1907_Release ID5_1907-490-1907O Build 48 - Rev:205692 2019-05-24 09:15:55

@galenzhao
Copy link

I found some logs,
not sure if it helps.

05-09 10:27:46.173  1483  1630 W DisplayManagerService: Display DisplayDeviceInfo{"IDriveVirtualDisplay": uniqueId="virtual:me.hufman.androidautoidrive,10363,IDriveVirtualDisplay,0", 885 x 540, modeId 4, defaultModeId 4, supportedModes [{id=4, width=885, height=540, fps=60.0, alternativeRefreshRates=[]}], colorMode 0, supportedColorModes [0], hdrCapabilities null, allmSupported false, gameContentTypeSupported false, density 250, 250.0 x 250.0 dpi, appVsyncOff 0, presDeadline 16666666, touch NONE, rotation 0, type VIRTUAL, deviceProductInfo null, state ON, owner me.hufman.androidautoidrive (uid 10363), frameRateOverride , brightnessMinimum 0.0, brightnessMaximum 0.0, brightnessDefault 0.0, FLAG_PRIVATE, FLAG_NEVER_BLANK, FLAG_OWN_CONTENT_ONLY} does not support input device matching.
05-09 10:27:46.173  1483  1630 W DisplayManagerService: Display DisplayDeviceInfo{"idrive-screen-mirror": uniqueId="virtual:io.bimmergestalt.idriveconnectaddons.screenmirror,10369,idrive-screen-mirror,0", 672 x 480, modeId 5, defaultModeId 5, supportedModes [{id=5, width=672, height=480, fps=60.0, alternativeRefreshRates=[]}], colorMode 0, supportedColorModes [0], hdrCapabilities null, allmSupported false, gameContentTypeSupported false, density 200, 200.0 x 200.0 dpi, appVsyncOff 0, presDeadline 16666666, touch NONE, rotation 0, type VIRTUAL, deviceProductInfo null, state ON, owner io.bimmergestalt.idriveconnectaddons.screenmirror (uid 10369), frameRateOverride , brightnessMinimum 0.0, brightnessMaximum 0.0, brightnessDefault 0.0, FLAG_PRESENTATION} does not support input device matching.

@galenzhao
Copy link

galenzhao commented May 10, 2023

hardcode some numbers have the image size correct.

        screenMirrorProvider.setSize(980, 540)
        image.setProperty(RHMIProperty.PropertyId.WIDTH, 980)
        image.setProperty(RHMIProperty.PropertyId.HEIGHT, 540)
        image.setProperty(RHMIProperty.PropertyId.POSITION_X, -90)
        image.setProperty(RHMIProperty.PropertyId.POSITION_Y, -67)

the position still needs turning.

image

@dvstnl
Copy link

dvstnl commented May 10, 2023

Cool could you post the updated APK? :)

@galenzhao
Copy link

galenzhao commented May 11, 2023

Cool could you post the updated APK? :)

https://github.com/galenzhao/IDriveConnectAddons/releases/tag/v1

I'll descript how to custom settings later.

first, is impossible to make a real full-screen mirror unless your phone screen is the same aspect ratio as HU's screen.

image

I'll show the custom settings based on my phone and HU.

phone screen: 2400x1080
HU: reported 800x480, but dig into the AAIdrive it should be 980x540

custom mirror setting:
rhmiwidth:974
rhmiHeight:610
marginLeft:90(useless)
marginRight:5(useless)
paddingLeft:181
paddingTop:67
Screenshot_2023-05-11-13-51-19-210_io bimmergestalt idriveconnectaddons screenmirror

when using the screen mirror function.

the app creates a virtual screen to capture screenshot images, you can think it's an image buffer with rhmiWidth and rhmiHeight.

then the phone screenshot image will be placed in the center of the image buffer with a fixed aspect ratio.
like this:
image
around a black background color.

then the image buffer will draw on HU with a default left and top padding.
so we need to set a value for them to make the image move left and up.

my phone's aspect ratio is 2400/1080, which makes the screenshot image covered a little by HU's top-right corner image( like this photo https://user-images.githubusercontent.com/3184101/237265225-524fa6a9-c99b-41e4-9dcb-2c3d7797c085.jpeg).
so I need to move down the buffered image a little, but as I said the image buffer has a black background color,
when I move down the image buffer the HU's screen will show it default background on the top which is not covered by the image buffer.

in this case, I need to change the image buffer's height bigger, to make sure the HU's background is still covered which I can not change the padding-top value. but with a bigger image buffer height, the actual screenshot image will move down by 1/2 height increment.

the final result is like this:
image

so it is based on your phone and HU screen size and custom dimension setting to show a perfect screen mirror.

@galenzhao
Copy link

galenzhao commented May 11, 2023

and here's the code: https://github.com/galenzhao/IDriveConnectAddons/tree/customsettings

it's maybe not beautiful, cuz I'm not an Android developer or understand Kotlin.

for future dev, we may calc these settings by code, cuz we can get the phone's screen size by code.
then set it automatically.

@galenzhao
Copy link

image

@hufman
Copy link
Collaborator

hufman commented May 12, 2023

Thank you @galenzhao for looking into this! I hadn't been able to think of any explanations, so thank you for experimenting and trying to figure it out! AAIdrive's map module and the screen mirroring code use the same logic to figure out the size for the output widget in the car. My only guesses are that the problem is either in code to center the image in the car's display, or the aspect mismatch that you suspect.

Now that you have code for UI settings, perhaps you could experiment with adding different stretch modes? Currently it just sets the virtual display to the same size as the car's output image should be, and the phone automatically adds black bars. Perhaps instead it should match the phone's aspect ratio and stretch the image manually. AAIdrive has an example of using Canvas operations to resize an image, and Matrix has a few different methods to create the resize matrix for different stretch modes.

@galenzhao
Copy link

Thank you @galenzhao for looking into this! I hadn't been able to think of any explanations, so thank you for experimenting and trying to figure it out! AAIdrive's map module and the screen mirroring code use the same logic to figure out the size for the output widget in the car. My only guesses are that the problem is either in code to center the image in the car's display, or the aspect mismatch that you suspect.

Now that you have code for UI settings, perhaps you could experiment with adding different stretch modes? Currently it just sets the virtual display to the same size as the car's output image should be, and the phone automatically adds black bars. Perhaps instead it should match the phone's aspect ratio and stretch the image manually. AAIdrive has an example of using Canvas operations to resize an image, and Matrix has a few different methods to create the resize matrix for different stretch modes.

the mirror addon set a smaller virtual display:

val centeredWidth = rhmiDimensions.rhmiWidth - 2 * (rhmiDimensions.marginLeft)

maybe HU does not scale a small image to a bigger one even if you are setting a bigger width value for the image
so there will be a right black bar on my HU


and for the screenshot image resizing, I think we better keep it aspect and just calc a better position to place.
and make sure all the HU screen is covered by our image, so the HU's ugly default background image will be hidden.

@Staffu11
Copy link

Hello. I have maybe a noob question, but how to add addones to the application?

@hufman
Copy link
Collaborator

hufman commented May 23, 2023

You would install an APK from the repo's Releases page

@Staffu11
Copy link

Staffu11 commented May 23, 2023 via email

@Staffu11
Copy link

Staffu11 commented Jun 12, 2023 via email

@hufman
Copy link
Collaborator

hufman commented Jun 13, 2023

I'm not sure what "dpf regenerating" is, in the context of screen mirroring or navigation.
If it's a piece of car information, the only options are in this api: https://bimmergestalt.github.io/BMWConnectedAnalysis/cds/

@Staffu11
Copy link

Staffu11 commented Jun 13, 2023 via email

@hufman
Copy link
Collaborator

hufman commented Jun 13, 2023

Ah yes, that is not related to this bug report, about screen mirroring being smaller than navigation.
I don't see any related data points in the CDS api, sorry.

@DmiBro
Copy link

DmiBro commented Jul 27, 2023

Hello, I have i3 with NBT EVO with 940x580 resolution and Samsun Flip3 with 2400x1080.
Not able to make screen mirror work on full screen. Followed instruction of @galenzhao above, but it does not help - changing any parameter on the phone does not change anything on the screen.

May be I am using wrong version of Screen mirror?
https://github.com/BimmerGestalt/IDriveConnectAddons/releases is empty, where can I find latest apk?

@hufman
Copy link
Collaborator

hufman commented Jul 27, 2023

Thank you for bringing the empty releases page to my attention! The build failed after a recent Readme update and I needed to fix it.

@DmiBro
Copy link

DmiBro commented Jul 27, 2023

I see now https://github.com/BimmerGestalt/IDriveConnectAddons/releases/download/latest_build/screen_mirror-debug.apk

Problems I described above was with version 1.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.1/screen_mirror-debug.apk, today I downloaded version 2.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.2/screen_mirror-debug.apk

Which app version is the correct one, allowing to change screen size and position?

@hufman
Copy link
Collaborator

hufman commented Jul 27, 2023

I imagine that's the right version, @galenzhao would know better. You should describe what problem you are having, and why the dimension adjustments don't appear to work for you.

@galenzhao
Copy link

galenzhao commented Jul 29, 2023

I see now https://github.com/BimmerGestalt/IDriveConnectAddons/releases/download/latest_build/screen_mirror-debug.apk

Problems I described above was with version 1.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.1/screen_mirror-debug.apk, today I downloaded version 2.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.2/screen_mirror-debug.apk

Which app version is the correct one, allowing to change screen size and position?

the newer ver1.2 fixes some hardcode values,
but from ver >= 1.1 should change the param permanently.

is there any difference on the screen after you change the value?
btw you should change values before clicking 'grant permission'.

@DmiBro
Copy link

DmiBro commented Aug 1, 2023

I see now https://github.com/BimmerGestalt/IDriveConnectAddons/releases/download/latest_build/screen_mirror-debug.apk
Problems I described above was with version 1.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.1/screen_mirror-debug.apk, today I downloaded version 2.1 from https://github.com/galenzhao/IDriveConnectAddons/releases/download/v1.2/screen_mirror-debug.apk
Which app version is the correct one, allowing to change screen size and position?

the newer ver1.2 fixes some hardcode values, but from ver >= 1.1 should change the param permanently.

is there any difference on the screen after you change the value? btw you should change values before clicking 'grant permission'.

Hello, I tried both 1.1 and 1.2 version, behaviour is the same. When I select screen mirroring in the car menu, I got this on the car screen

20230731_192100

and this on the phone

Screenshot_20230731_192032_AAIdrive

It is not possible to change values on the phone before I grant permission, only after. And this does not change anything on the car screen, is always has blank areas on the right, see below

20230731_192130

@hufman
Copy link
Collaborator

hufman commented Aug 1, 2023

Thank you for the screenshot of your phone being mirrored to the car!
What behavior would you like to see changed? Do you want AAIdrive to distort the phone's aspect ratio to fill up the screen, would you like the smaller image to be centered in the middle of the screen (and be cut off when your car is running in split screen), or any other change? Currently AAIdrive is scaling the image to fit in the screen, without changing aspect ratio.

@galenzhao
Copy link

It is not possible to change values on the phone before I grant permission, only after. And this does not change anything on the car screen, is always has blank areas on the right, see below

The value has changed already, but the screen mirroring image is still the wrong size and pos.

how about the map function? does it show the correct image?

change the value in the app before clicking 'grant permission' can be performed by the following,
image

image

@DmiBro
Copy link

DmiBro commented Aug 3, 2023

@hufman @galenzhao thank you for comments. I changed values in Screen Mirror app before granting permission and see now changes on the car screen. Now question is what should be right settings to fill whole screen.

I followed above calculation for my phone ZFlip3 with 2640x1080 screen:

  • 2640/1080=2.44
  • 980/2.44=402
  • 402+67*2=536
  • 402+(540-402)*2=678
  • (536+678)/2=607

Map function shows full screen automatically, see below
20230802_185002

Where should I put 607, and what should be remaining parameters?

@galenzhao
Copy link

I followed above calculation for my phone ZFlip3 with 2640x1080 screen:

  • 2640/1080=2.44
  • 980/2.44=402
  • 402+67*2=536
  • 402+(540-402)*2=678
  • (536+678)/2=607

for pos calc,

  1. scale your phone to fit HU, like:
    image
    your phone screenshot image should be 980x400

  2. then chose an 'offsetY' that you like.
    image

  3. calc max(offsetY,offsetYY)
    image

  4. then your image buffer height should be: height=max(offsetY,offsetYY)*2+phone_height(400)
    image

  5. custom mirror setting:
    rhmiwidth:980
    rhmiHeight:image buffer height
    marginLeft:90(useless)
    marginRight:5(useless)
    paddingLeft:180
    paddingTop:67

@DmiBro
Copy link

DmiBro commented Aug 4, 2023

@galenzhao wow that's very detailed, thanks a lot. Just two questions:

  • what do you mean by "phone_height(400)" in Hello #4?
  • do I get it right that screen mirror will be scaled to buffer size, so It will not be filling whole screen of the car? How then map function is filling whole screen?

@hufman
Copy link
Collaborator

hufman commented Aug 4, 2023

Are you sure about your rhmiWidth (you can check by setting AAIdrive to show Advanced options and looking in Car Information)? Are you able to enable the sidebar? It looks like you have a widescreen car, which would be 1440x540 (which I don't think i3 came in) or 1280x480. Both of which are a wider aspect ratio than your phone, which is why your phone isn't taking up the right side of the screen in your screenshot.
The map can be full screen because it is creating a disconnected virtual display and draws whatever it wants, while screen mirroring creates a virtual display that the phone mirrors its normal screen into.

@hufman hufman closed this as completed in a1c73ba Aug 4, 2023
hufman added a commit that referenced this issue Aug 4, 2023
This is the same method that the AAIdrive map uses, so it should fix #14.
It definitely should help some tall-aspect phones show wider and take up the full vertical height
@hufman
Copy link
Collaborator

hufman commented Aug 4, 2023

I just pushed a new build that reduces the visible margin on the right side. It doesn't change any aspect ratio, so the phone image will try to fill as much as possible but may still show black bars.

@DmiBro
Copy link

DmiBro commented Aug 6, 2023

I just pushed a new build that reduces the visible margin on the right side. It doesn't change any aspect ratio, so the phone image will try to fill as much as possible but may still show black bars.

I was not able to install new build from releases page, it says "application is not installed as it conflicts with other package". Was able before to install version 1.2 over 1.1.

Checked and you are right, looks like my screen has 1280x480 resolution. What is maximum size of the screen I can have with my phone?

@hufman
Copy link
Collaborator

hufman commented Aug 7, 2023

Indeed, you would need to uninstall galenzhao's build to install the main build, Android disallows app updates for the same app name from different authors to prevent data from leaking or being incompatible.
The code is pretty good at maximizing the height, so your 480 high screen and your 2.44 aspect ratio would give a max width of 1171. Although your screenshot shows that it didn't move up to the top of the screen like it's supposed to, not sure what that means.

@DmiBro
Copy link

DmiBro commented Aug 14, 2023

Indeed, you would need to uninstall galenzhao's build to install the main build, Android disallows app updates for the same app name from different authors to prevent data from leaking or being incompatible.
The code is pretty good at maximizing the height, so your 480 high screen and your 2.44 aspect ratio would give a max width of 1171. Although your screenshot shows that it didn't move up to the top of the screen like it's supposed to, not sure what that means.

@hufman Walter,
It helped, now image is almost perfect. On the top Android status bar icons are cut roughly by half, on the right side image is also slightly bigger then screen, on the left size I still can see empty space with arrow from car UI, see below.

How can I modify image size and position in the code to make it perfect, not to disturb you further? Change any parameters in the code, recompile and try again?
image

@hufman
Copy link
Collaborator

hufman commented Aug 14, 2023

The code responsible for moving the image to the left is here. It uses some data about IDrive screen sizes, and so your screen was previously measured as being able to move the image 70 pixels to the left (paddingLeft) and having 64 pixels more on the left where the car doesn't allow the app to draw (marginLeft). You can see this in the map image you showed before. You are free to adjust the POSITION_X and recompile the app, of course, but the marginLeft will prevent the image from taking up the entire screen. @galenzhao's code makes the numbers easily editable, but it would want to be updated to use the new visibleWidth.

I'm glad the new version works better, and matches the map size!

galenzhao pushed a commit to galenzhao/IDriveConnectAddons that referenced this issue Aug 31, 2023
This is the same method that the AAIdrive map uses, so it should fix BimmerGestalt#14.
It definitely should help some tall-aspect phones show wider and take up the full vertical height
galenzhao pushed a commit to galenzhao/IDriveConnectAddons that referenced this issue Jun 20, 2024
This is the same method that the AAIdrive map uses, so it should fix BimmerGestalt#14.
It definitely should help some tall-aspect phones show wider and take up the full vertical height
galenzhao pushed a commit to galenzhao/IDriveConnectAddons that referenced this issue Jun 20, 2024
This is the same method that the AAIdrive map uses, so it should fix BimmerGestalt#14.
It definitely should help some tall-aspect phones show wider and take up the full vertical height
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants