SGN5: Долгое нажатие на back должно приводить к появлению меню

Issue #11 resolved
Ольга Першина created an issue

В Galaxy Note 5 и некоторых других смартах нет отдельной кнопки меню, вместо нее предлагают long press кнопки back. Текущая реализация перехватывает нажатие back в своих целях, ломая системе алгоритм анализа long press.

Патч проверен (вывод меню, работоспособность переключателя клавиатуры) на следующих конфигурациях:

  1. SGNote 5 | 5.1.1 | Меню вызывать долгим тапом на сенсоре "Назад".
  2. SGS4 | 5.0.1 | Меню вызывать сенсорной кнопкой "Опции".
  3. Lenovo Yoga 2/10 | 4.4.4 | Планшетная софтовая кнопка опций. Эмулятор работает, но некая дрожь по экрану, видимо есть вопросы при работе с процессором Интел.
  4. ONDA V919 4G | 4.4.4 | Планшетная софтовая кнопка опций.
  5. HTC Desire X | 4.1.1 | Меню вызывать долгим тапом на сенсоре "Программы".
  6. HighScreen Power 4 | 5.1 | Облом. Видимо, разработчики не озаботились. Придется таки адаптировать. Заметьте, в прошивке HighScreen Power 5 уже есть панелька для программной кнопки меню, но в этой модели (4) - нет. Впрочем, не факт, что она рабочая. Так, в SGN5 от аналогичной панели нет прока и после патча.
  7. Fly IQ320 | 4.1.1 | Планшетная софтовая кнопка опций.

Comments (48)

  1. Andrey Dj repo owner

    Смысл в том, что обрабатывалось нажатие кнопки BACK для отображения клавиатуры/джойстика, а надо было обрабатывать отпускание, чтобы системы на некоторых девайсах по длительному зажатию отображали меню.

  2. Ольга Першина reporter

    Однако выявилась еще одна проблема, мешающая показу меню. Проявляется, только если программа запущена не под отладчиком (читай "всегда у пользователей Нотов"). Cистема теперь всегда пытается вывести меню, но иногда его не видно по причине выхода за пределы экрана (при замедленной анимации смены ориентации экрана его наличие за рамкой хорошо видно). Не совсем понятно, когда этот баг исправят. Но можно малой кровью перейти на рекомендованное API appcompat (у меня вроде получилось - см. патч 2, на эмуляторе древнего ведроида тоже работает).

  3. Andrey Dj repo owner

    Накатил патч, собрал, запустил... И у меня вообще исчезла кнопка Menu))) И fullscreen теперь ненастоящий - сверху часы показываются.device-2015-11-30-143755.png

    Nexus 4 Android 5.1.1

  4. Ольга Першина reporter

    Моя вина. Нужно поставить в app/build.cradle targetSdkVersion 10 и в манифесте android:theme="@ style/AppFullScreenTheme" (без пробела), а в новом файле со стилями

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="AppFullScreenTheme" parent="Theme.AppCompat.NoActionBar">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">true</item>
            <item name="android:windowContentOverlay">@null</item>
        </style>
    </resources>
    
  5. Andrey Dj repo owner

    Ага, если target sdk 10, кнопка меню появилась. А куда стили прописывать? в какой "новый файл со стилями" ? :)

  6. Andrey Dj repo owner

    Привет) Получилось что-то вроде такого:

    device-2015-12-01-111607.png device-2015-12-01-111633.png device-2015-12-01-111656.png

    Смущают пропавшие иконки на закладках при открытии файлов и увеличившийся размер приложения (с 1,7 Mb до 8 Mb).

  7. Ольга Першина reporter

    Да, appcompat полон сюрпризов и тоже требует хаков (в одном месте картинки уже возвращались хаком). Может быть, плюнуть на него и использовать в дополнение к OptionsMenu еще какой-нибудь метод вызова обычного PopupMenu c этими же пунктами?

  8. Andrey Dj repo owner

    А с этим AppCompat на всех твоих девайсах работает ОК? Я вот думаю, может его релизить отдельной версией в разделе downloads? Если у кого-то проблемы с обычной версией, вот качайте compat.

  9. Ольга Першина reporter

    AppCompat может быть и правильный путь, но какой-то ущербный. Работать - работает, но некрасивый, жирный и требует патчей под картинки. И ладно бы еще решал проблемы с девайсами типа HighScreen Power Four (где вовсе никакой кнопки меню нет).

    Тем временем мне удалось локализовать дефект, связанный с пропаданием меню опций в выложенном в Google Play варианте программы. Оно пропадает немного не в тех условиях, о которых было написано выше (отключение отладчика). Самое интересное тут в том, что если поменять applicationId с "app.usp" на "app.usp1", то меню перестаёт убегать за пределы экрана. Т.е. стоковая нерутованная система 5.1.1 (или какое-то из приложений) на моем SGN5 как-то запомнила "app.usp" и пакостит ему.

    Хорошо бы на другом ноте проверить (или на Edge 6+). Возможно, для нотов больше ничего сделать нельзя.

    Остался еще сценарий для HighScreen Power Four и можно разрешать запрос.

  10. Ольга Першина reporter

    Ага, вот и S6. Видимо, надо таки второй хак на картинки там сообразить (сам справишься, там что-то надо наверное так же через рефлексию дернуть, как сделано в самом меню?). К слову, мне перезагрузка не помогает - только adb, переустановивший программу (помогает ненадолго) или смена ее идентификатора (надолго или навсегда). Все 4 костыля (reboot, adb, appcompat, app.usp1) никуда не годятся, надо нормальное решение найти (в котором и бескнопочные будут учтены).

    Еще намек в копилку этого бага: если программа закрывается по команде из меню (ф-я finish), а не системой и без участия Process.killProcess, то меню выживает. Т.е. при досрочном завершении программы либо сама программа портит какие-то данные (но не свои, удаление данных и кеша не спасает), либо это делает система. В винде в точности такое поведение дают динамически применяемые заплатки совместимости (shims). Винда следит за старым приложением и если оно (ошибка разработчика этого приложения) ведет себя определенным образом (например, access violation в куче), запоминает его и даёт ему потом "менее капризную" кучу. Ошибка в самом shims (такое бывает крайне редко, у мелкомягких в программисты берут только PhD) дает весьма причудливые побочные эффекты.

  11. Andrey Dj repo owner

    Ого, какие ужасные вещи творятся в этих современных операционных системах)

    Я вот думаю - а что, если в версии compat перейти на уровень API от Android 4 или 5 и прикрутить там новомодный тулбар с этими всеми менюшными кнопками? Ведь глюки вылазят только на последних андроидах? Чтобы не переписывать весь код, а только заменить меню.

  12. Ольга Першина reporter

    После этого называть версию как compat и держать ее не в маркете будет некорректно. Может быть, удастся использовать http://developer.android.com/google/play/publishing/multiple-apks.html ?

    Если для 4.4+ ведроида сделать иммерсивный http://developer.android.com/intl/ru/training/system-ui/immersive.html apk, а для более старых устанавливать текущий, то имхо будет то, что надо.

  13. Ольга Першина reporter

    То ли shim продолжает пакостить, то ли еще что, но меню все равно появляется не так (первые две опции перекрыты, в них никак не попасть и текст налезает на икону): device-2015-12-03-143827.png

    Кроме того, непонятно, как вывести на экран все это великолепие, если нет кнопки меню (свайп сверху не работает).

  14. Andrey Dj repo owner

    Это на каком девайсе? Кнопки, которые вынеслись на ActionBar не нажимаются? У меня работает свайп и сверху и снизу (сбоку в ландшафте). А можешь кинуть скрин без открытого меню?

  15. Ольга Першина reporter

    Последний вариант ведет себя аналогично. Скрин до нажатия на меню такой же, как и обычно был full. При нажатии на меню (SGN5) выезжает сразу синяя полоса и меню выпадает, как на скрине (пункты меню работают). Уезжают тоже совместно (а в скрытые не попасть). Свайпы не работают ни на SGN5, ни на HSP4.

  16. Andrey Dj repo owner

    Я вот не понимаю - ладно там совместимость со 2м андроидом хромает. Но не сделать совместимость с 4.4 immersive. А как работают другие приложения immersive?

  17. Ольга Першина reporter

    Их (кто реагирует на меню) довольно мало. Они работают очень просто: 1. Никаких хаков по поводу иконок в меню. Меню без иконок. Отображается зачастую там же (т.е. перекрывает тулбар) 2. Если нужен сам тулбар, то есть некий способ вызова его (скажем, коротким тапом по полному экрану). Это единственный метод, который подойдет для HSP4.

  18. Andrey Dj repo owner

    1) Та этот хак никак не влияет на работоспособность, просто иконки включает.

    Ок, убрал кнопки из ToolBar, теперь всё будет в меню как раньше.

    2) А как работают immersive приложения на HSP4 и SGN5/6, если свайпы не работают???? Сомневаюсь, что программисты пишут код, который по короткому тапу например в игре выключает полноэкранный режим и активирует тулбары.

    Попробуй после запуска программы и перехода в immersive заблокировать-разблокировать экран. Там должны сверху подсказки рисоваться, типа "для выхода из полноэкранного режима используйте свайпы".

    Вот запусти например эмулятор speccy. Он там тоже использует immersive. https://play.google.com/store/apps/details?id=com.fms.speccy Может там проблемы каким-то магическим образом решены?

  19. Andrey Dj repo owner

    Начал тут смотреть, что можно сделать с TabActivity, и наткнулся на это:

    dont_use_bottom_tabs.png

    А вот дизайн новейшего приложения Google+:

    bottom_tabs_in_g+.png

  20. Andrey Dj repo owner

    Починил иконки на табах, там проблема со стилями была.

  21. Ольга Першина reporter

    Табы теперь в порядке, меню доступно целиком. Осталось с налезанием текста на икону в меню разобраться и беснопочному сделать сценарий вызова меню. Speccy в меню иконки тоже не рисует. А свайпы там работают, и само меню не закрывает тулбар.

  22. Andrey Dj repo owner

    И какие есть идеи, почему там работают свайпы и меню не закрывает тулбар? Может, опять со стилями что-то не то?

  23. Ольга Першина reporter

    Вероятность стилей не исключена. Или же баг по поводу высокого разрешения нота. По свайпу наверное виновато наличие собственного перехвата нажатий на экран (или же для смартфонов следует самим нужный свайп ловить - подсказки-то насчет него нет). Подсмотреть надо у "коллег".

  24. Andrey Dj repo owner

    Я тут немного стили поправил, и заметил, что например, тень от ActionBar и меню отбрасывается только если стоит Target SDK 14 и выше. Вот попробуй еще 2 версии на предмет работоспособности свайпов:

    Это с Target SDK 10: https://bitbucket.org/djdron/unrealspeccyp/downloads/unreal-speccy-portable_0.0.66.6_android_test3.apk

    А это с 19: https://bitbucket.org/djdron/unrealspeccyp/downloads/unreal-speccy-portable_0.0.66.6_android_test4.apk

  25. Ольга Першина reporter

    test3 и test4 на ноте5 ведут себя одинаково - свайп работает, кнопка меню работает, все команды достижимы. В выпадающем меню нет картинок, и не надо. HSP4 тоже ими доволен. Но как сделать, чтобы юзеры догадались про свайп, непонятно - подсказок про иммерсивный режим у обоих нет.

  26. Andrey Dj repo owner

    А как они (test3 и test4) ведут себя на андроидах ниже 4.4 ?

    Я хочу разобраться, как влияет Target API level.

    На счёт догадаться про свайп - так это же все полноэкранные immersive приложения так делают. Там даже когда первый раз в этот режим входишь, показываются подсказки.

  27. Ольга Першина reporter

    Подсказки только на планшетах (4.4+), на телефонах подсказок нет. На Fly IQ320 (4.1.1) test3 работает как прежний (т.е. с красивым меню по 3 точкам в софтпанели кнопок), никаких свайпов и прочей фигни не надо. А test4 не свайпится, но и трех точек нет. Голосую за test3, один только нюанс остался (в новых андроидах, не 4.1.1) - как меню сделать под тулбаром, чтобы не перекрывало тулбар.

  28. Andrey Dj repo owner

    А мне вот чем не нравится test3:

    test3_actionbar.png test3_actionbar_menu.png

    А вот test4:

    test4_actionbar_menu.png

    отличие - только targetSdkVersion 10/19

  29. Ольга Першина reporter

    Тень - это красиво, но как тогда в 4.1.1 добираться до меню? Свайпы не работают, аппаратных кнопок нет - остается только программная кнопка снизу. По поводу перекрытия бара менюшкой - см. http://stackoverflow.com/questions/29445584/how-i-can-place-overflow-menu-below-toolbar-instead-of-overflow-menu-to-overlaps

  30. Ольга Першина reporter

    У них в примере меню не перекрывает другие кнопки, а у нас перекрывает. Если меню открыто кнопкой, то доступна лишь половина команд. Отдельно сделанный свайп снижает фатальность этого момента, но не намного.

  31. Andrey Dj repo owner

    Потому что там меню выпало от фильтров, а не от меню :) а вообще я так понял оно в 4.4 (Holo) было ниже, а в 5.0+ (Material) начало налазить.

  32. Log in to comment