henryblue / TvRecyclerView

A custom RecyclerView for Android TV end
Apache License 2.0
7 stars 4 forks source link

Focus Issue on Android 5.1 devices #22

Open kingargyle opened 6 years ago

kingargyle commented 6 years ago

So this one is an odd one. On an Amazon Fire TV device, after reaching the edge of a screen and moving to the next item... the screen scrolls and repositions, however, the focus box Shows around the previous item, but the focus changed event and focus true event was sent to the next item. When you try to move back and forth, you get stuck between these two items and can't get off them. Focus box keeps jumping back to the previous item.

I don't see this in the Android TV Emulator or on an Android TV 8.0 device, but only on an Amazon Fire TV.

Is there a way to disable the center scroll option, and just do a normal scroll without the repositioning to the center?

kingargyle commented 6 years ago

This happens with version 1.1.3 and 1.1.4. I'm willing to put some break points and logging information in for you to help debug this, just let me know where.

I did try your sample project on an Amazon Fire TV and none of the ones you had displayed the issue I'm seeing. I'm wondering if it has to do with how the screen is updating after I handle the onFocusChanged events, causing it to try and redraw or layout.

henryblue commented 6 years ago

I will add the sliding mode attribute and the necessary log in the next version soon. I can't test here about the problem of sliding on Amazon Fire TV(No equipment).

kingargyle commented 6 years ago

Yeah, if we can get some extra log info into the next version I can at least send you that information to help debug what is happening. I did some more experimentation last night, before going to bed, and turned off the autofocusmode, and scrolling worked as expected, but of course I loose all of the other focus ability and state information.

Also, I think the disabling of the scrolling tweaks will allow for a few different LayoutManagers to be used that handle scroll state themselves, and different effects. I've noticed this appears to be what widgets like DiscretteScrollView do under the covers,

https://github.com/yarolegovich/DiscreteScrollView/blob/master/library/src/main/java/com/yarolegovich/discretescrollview/DiscreteScrollLayoutManager.java

kingargyle commented 6 years ago

@henryblue I've managed to repeat this issue in an Android Emulator. It appears to be an Android 5.1 issue, which the Amazon Fire OS 5 is based on. So if you wanted to try to replicate create an Android TV emulator based off Android 5.1.

kingargyle commented 6 years ago

Also here is some log output from the FocusBorderView that might help things. At the end of the log you can see where it repeats itself and gets stuck in a loop of selecting the previous item to get the focus when you try to move to the right.

10-12 09:18:48.572 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:48.591 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:48.724 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:48.790 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:48.940 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:49.091 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:49.156 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:49.273 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:49.325 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===60===itemLocationY==455 drawFocus: ======itemPositionX=====45.399998===itemPositionY===432.5 drawFocus: ===drawPositionX==45.399998===drawPositionY===432.5 10-12 09:18:53.038 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/5895a44366f31c3ccfad52349dcacf1e/Images/Backdrop 10-12 09:18:53.039 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/5895a44366f31c3ccfad52349dcacf1e/Images/Backdrop 10-12 09:18:53.052 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===226===itemLocationY==455 drawFocus: ======itemPositionX=====211.4===itemPositionY===432.5 drawFocus: ===drawPositionX==211.4===drawPositionY===432.5 10-12 09:18:53.061 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===226===itemLocationY==455 drawFocus: ======itemPositionX=====211.4===itemPositionY===432.5 drawFocus: ===drawPositionX==211.4===drawPositionY===432.5 10-12 09:18:53.076 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===226===itemLocationY==455 drawFocus: ======itemPositionX=====211.4===itemPositionY===432.5 drawFocus: ===drawPositionX==211.4===drawPositionY===432.5 10-12 09:18:53.855 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/4531c11a7f21e79a21b93f48e294090e/Images/Backdrop 10-12 09:18:53.857 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/4531c11a7f21e79a21b93f48e294090e/Images/Backdrop 10-12 09:18:53.867 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===392===itemLocationY==455 drawFocus: ======itemPositionX=====377.4===itemPositionY===432.5 drawFocus: ===drawPositionX==377.4===drawPositionY===432.5 10-12 09:18:53.877 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===392===itemLocationY==455 drawFocus: ======itemPositionX=====377.4===itemPositionY===432.5 drawFocus: ===drawPositionX==377.4===drawPositionY===432.5 10-12 09:18:53.878 2033-2392/com.google.android.gms I/ClearcutLoggerApiImpl: disconnect managed GoogleApiClient 10-12 09:18:53.892 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===392===itemLocationY==455 drawFocus: ======itemPositionX=====377.4===itemPositionY===432.5 drawFocus: ===drawPositionX==377.4===drawPositionY===432.5 10-12 09:18:54.905 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/92d220433f26cf655ead05df3c3f0b44/Images/Backdrop 10-12 09:18:54.907 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/92d220433f26cf655ead05df3c3f0b44/Images/Backdrop 10-12 09:18:54.917 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===558===itemLocationY==455 drawFocus: ======itemPositionX=====543.4===itemPositionY===432.5 drawFocus: ===drawPositionX==543.4===drawPositionY===432.5 10-12 09:18:54.927 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===558===itemLocationY==455 drawFocus: ======itemPositionX=====543.4===itemPositionY===432.5 drawFocus: ===drawPositionX==543.4===drawPositionY===432.5 10-12 09:18:54.943 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===558===itemLocationY==455 drawFocus: ======itemPositionX=====543.4===itemPositionY===432.5 drawFocus: ===drawPositionX==543.4===drawPositionY===432.5 10-12 09:18:55.905 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/10f67b1becb8edd7a09f9111c818e116/Images/Backdrop 10-12 09:18:55.906 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/10f67b1becb8edd7a09f9111c818e116/Images/Backdrop 10-12 09:18:55.915 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===724===itemLocationY==455 drawFocus: ======itemPositionX=====709.4===itemPositionY===432.5 drawFocus: ===drawPositionX==709.4===drawPositionY===432.5 10-12 09:18:55.928 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===724===itemLocationY==455 drawFocus: ======itemPositionX=====709.4===itemPositionY===432.5 drawFocus: ===drawPositionX==709.4===drawPositionY===432.5 10-12 09:18:55.942 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===724===itemLocationY==455 drawFocus: ======itemPositionX=====709.4===itemPositionY===432.5 drawFocus: ===drawPositionX==709.4===drawPositionY===432.5 10-12 09:18:56.855 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/2cdd7a7d5a349c652978d6dcb19b71f1/Images/Backdrop 10-12 09:18:56.857 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/2cdd7a7d5a349c652978d6dcb19b71f1/Images/Backdrop 10-12 09:18:56.867 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===890===itemLocationY==455 drawFocus: ======itemPositionX=====875.4===itemPositionY===432.5 drawFocus: ===drawPositionX==875.4===drawPositionY===432.5 10-12 09:18:56.877 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===890===itemLocationY==455 drawFocus: ======itemPositionX=====875.4===itemPositionY===432.5 drawFocus: ===drawPositionX==875.4===drawPositionY===432.5 10-12 09:18:56.892 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===890===itemLocationY==455 drawFocus: ======itemPositionX=====875.4===itemPositionY===432.5 drawFocus: ===drawPositionX==875.4===drawPositionY===432.5 10-12 09:18:57.906 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/db9955a3d5ec712576a3a8c5e855e0f9/Images/Backdrop 10-12 09:18:57.907 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/db9955a3d5ec712576a3a8c5e855e0f9/Images/Backdrop 10-12 09:18:57.919 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===1056===itemLocationY==455 drawFocus: ======itemPositionX=====1041.4===itemPositionY===432.5 drawFocus: ===drawPositionX==1041.4===drawPositionY===432.5 10-12 09:18:57.926 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===1056===itemLocationY==455 drawFocus: ======itemPositionX=====1041.4===itemPositionY===432.5 drawFocus: ===drawPositionX==1041.4===drawPositionY===432.5 10-12 09:18:57.942 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===1056===itemLocationY==455 drawFocus: ======itemPositionX=====1041.4===itemPositionY===432.5 drawFocus: ===drawPositionX==1041.4===drawPositionY===432.5 10-12 09:18:59.256 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop Generated Image Url: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop 10-12 09:18:59.266 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===649===itemLocationY==455 drawFocus: ======itemPositionX=====634.4===itemPositionY===432.5 drawFocus: ===drawPositionX==634.4===drawPositionY===432.5 10-12 09:18:59.277 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===476===itemLocationY==455 drawFocus: ======itemPositionX=====461.4===itemPositionY===432.5 drawFocus: ===drawPositionX==461.4===drawPositionY===432.5 10-12 09:18:59.291 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===471===itemLocationY==455 drawFocus: ======itemPositionX=====456.4===itemPositionY===432.5 drawFocus: ===drawPositionX==456.4===drawPositionY===432.5 10-12 09:18:59.308 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===468===itemLocationY==455 drawFocus: ======itemPositionX=====453.4===itemPositionY===432.5 drawFocus: ===drawPositionX==453.4===drawPositionY===432.5 10-12 09:18:59.324 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===465===itemLocationY==455 drawFocus: ======itemPositionX=====450.4===itemPositionY===432.5 drawFocus: ===drawPositionX==450.4===drawPositionY===432.5 10-12 09:18:59.341 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===464===itemLocationY==455 drawFocus: ======itemPositionX=====449.4===itemPositionY===432.5 drawFocus: ===drawPositionX==449.4===drawPositionY===432.5 10-12 09:18:59.359 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===462===itemLocationY==455 drawFocus: ======itemPositionX=====447.4===itemPositionY===432.5 drawFocus: ===drawPositionX==447.4===drawPositionY===432.5 10-12 09:18:59.373 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===462===itemLocationY==455 drawFocus: ======itemPositionX=====447.4===itemPositionY===432.5 drawFocus: ===drawPositionX==447.4===drawPositionY===432.5 10-12 09:18:59.390 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.407 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.425 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.443 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.458 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.475 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.492 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:18:59.508 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:19:01.089 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop 10-12 09:19:01.090 2916-2916/us.nineworlds.serenity D/TimberLogger: Generated Image Url: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop 10-12 09:19:01.099 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===627===itemLocationY==455 drawFocus: ======itemPositionX=====612.4===itemPositionY===432.5 drawFocus: ===drawPositionX==612.4===drawPositionY===432.5 10-12 09:19:01.110 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:19:01.125 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 10-12 09:19:01.126 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:23:26.538 2916-2916/us.nineworlds.serenity D/TimberLogger: Background ImageUrl: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop Generated Image Url: http://192.168.86.93:8096/emby/Items/9ed875db0df0ecd036582efacd4c0a6e/Images/Backdrop 10-12 09:23:26.546 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===627===itemLocationY==455 drawFocus: ======itemPositionX=====612.4===itemPositionY===432.5 drawFocus: ===drawPositionX==612.4===drawPositionY===432.5 10-12 09:23:26.563 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5 10-12 09:23:26.574 2916-2916/us.nineworlds.serenity I/FocusBorderView: drawFocus: ===itemLocationX===461===itemLocationY==455 drawFocus: ======itemPositionX=====446.4===itemPositionY===432.5 drawFocus: ===drawPositionX==446.4===drawPositionY===432.5

henryblue commented 6 years ago

Thanks, but I did not find this problem on the 5.1 device, I release 1.1.5 version (add some log), you can try with log. Maybe you can cut a picture/video so that I can analyze the reason intuitively.

kingargyle commented 6 years ago

Sure. It will be a bit before I get a chance to test this though.. Due to the issues I was experiencing I went ahead and implemented just a standard recyclerview, and added onFocusChange listeners to the views in the viewholder. This seems to be working pretty well, and except for a very minor issue of maintaining a selection state things are working well. I'll try and get to looking at 1.1.5 and getting you a video. As I said it doesn't appear to happen with your sample app.