Landscape режим экрана
Портирование ОС Андроид 4.x (CyanogenMod 9) на Toshiba AC100
В наш динамичный век развития информационных технологий и новинок рынка связанного с ними, многие могут не заметить по настоящему интересные вещи которые появляются благодаря творческим отступлениям некторых производителей, они сгорают как искры в пучине пламени ширпотреба, остаются игрушками энтузиастов и некторых счастливчиков которые не знают, что держат в руках. По нашему мнению смартбук Toshiba AC100/Dynabook AZ яркий тому пример. Наша цель дать вторую молодость этому интересному своей конвергенцией и оригинальными находками устройству, брошенному на произвол производителем и вендорами.
Для тех кто первый раз слышит о таком будут интересны обзоры этого устройсва (линки на обзоры), но сей труд о другом, о том какой тернистый путь ожидает того кто захочет сделать для нашего героя работающий Андроид последней версии.
Ниже идет одна из серии статей посвященных проблемам портирования операционной системы Андроид версии 4.x в варианте от всем известного CyanogenMod (линк)
Часть 1. Изменение режима экрана по умолчанию на ландшафтный
Суть проблемы
При старте ос экран находится в ландшафтном состоянии, но через секунду поворачивается в портретный режим и не выходит из него. Только приложения которые настаивают на ландшафте вроде Camera могут его на время заставить вернутся в ландшафтный режим.
Что мы имеем
- Разрешение экрана Toshiba AC100 1024 на 600
- Используем ядро 3.1 вот код драйвера экрана https://gitorious.org/~zombah/ac100/zombahs-marvin24s-kernel/blobs/linux-tegra-nv-ac100-3.1-exp/arch/arm/mach-tegra/board-paz00-panel.c
- В устройстве нет сенсоров, в частности акселерометра. Нету режимов в машине (car) или подключения к док станции.
Чего нам хочется
- Чтобы экран был всегда в ландшафтном состоянии и не переключался из него.
- В крайнем случае если приложение перевернуло его или оно только портретное иметь возможность перевернуть обратно в
ландшафт.
- Иметь выше описанные возможности прям из коробки при сборке дистрибутива ос, а не используя сторонние приложения.
- Только опенсоурс варианты, того требует лицензия Cyanogenmod.
Что мы пробовали
- Вывод логката http://pastebin.com/avkywrcK
- Поиск нужной переменной для файла BoadrConfig.mk который используется для сборки ос Андроид под определенное
устройство:
- Не понятно что искать
- Поиск по ключевым словам в мейк файлах андроида ничего не дал
find . -name "Android.mk" -exec egrep 'ROTATE|ORIENT' {} \;
- Пробовали разные переменные конфигурации в xml файлах overlay'ев- не помогают
- frameworks/base/core/res/res/values/config.xml
<bool name="config_allowAllRotations">false</bool>
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<bool name="def_accelerometer_rotation">false</bool> <integer name="def_user_rotation">0</integer>
Поиск с помощью resgrep по всем переменным конфигурации не дал еще вариантов.
- Использовать properties найденные в сети
- ro.sf.hwrotation = 0никакого эффекта не дает, видимо от кастом сборки или старое.
- Как оказалось работает со значением переменной 270
- ro.sf.hwrotation = 0никакого эффекта не дает, видимо от кастом сборки или старое.
- Использовать libsensors
- Использовать kbdsensorsиз android-x86 сорцы тут http://android-x86.git.sourceforge.net/git/gitweb.cgi?p=android-x86/x86_hardware_libsensors.git;a=blob;f=kbdsensor.cpp;h=bdbc463d2e3913581fa3b063ad80571daeb42dd7;hb=refs/heads/ics-x86
- <range type="comment" id="514639">Работать отказывается у нас.</range id="514639">
- Использовать kbdsensorsиз android-x86 сорцы тут http://android-x86.git.sourceforge.net/git/gitweb.cgi?p=android-x86/x86_hardware_libsensors.git;a=blob;f=kbdsensor.cpp;h=bdbc463d2e3913581fa3b063ad80571daeb42dd7;hb=refs/heads/ics-x86
D/SensorService( 170): nuSensorService starting... E/SensorService( 170): couldn't load sensors module (No such file or directory)
* Нужен програмист разобраться в нем, что ему не нравится или дописать
- Написать свой dummy libsensors который будет эмулировать акселерометр, например постоянно сообщая что нужно перевернуться
в ладшафтный режим
- Крайнее средство: Можно поправить исходники ос Андроид.
- Насколько я понял по описаню хаков поворота от старых андройдов (2.х) рыть надо здесь
- https://github.com/CyanogenMod/android_frameworks_base/blob/304af0cfe13649d7078d4c72455f7f58a63bbc12/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
- В этом пути есть минусы. Сложно поддерживать при переходах на новую версию ос, можно больше поломать чем сделать и нет
программиста кто бы мог понять как это работает.
Результат
На текущий момент единственное рабочее решение которое было найдено установка ro.sf.hwrotation=270, имеет массу недостатков:
- bootanimation перевернут
- приложения которые переворачивают экран, теперь дают вообще адские перевороты, например кверх ногами
Заключение
Вот бы узнать почему у нас экран запускает в портретном режиме и найти правильное и красивое решение чтобы он работал в ландшафте.
Решение
Решение найдено в оверлеях frameworks/base/core/res/res/values/config.xml
<!-- The number of degrees to rotate the display when the keyboard is open. --> <integer name="config_lidOpenRotation">0</integer>
Нерабочее средство: It's possible to override the default screen orientation by disabling accelerometer rotation and setting user rotation in the system settings database. The phone/tablet needs to be rooted to do this. The change is applied after the phone/tablet is rebooted. On the console:
su sqlite3 /data/data/com.android.providers.settings/databases/settings.db insert into system (name,value) values('accelerometer_rotation',0); insert into system (name,value) values('user_rotation',3); .exit
- user_rotation 0 -> ROTATION_0
- user_rotation 1 -> ROTATION_180
- user_rotation 2 -> ROTATION_270
- user_rotation 3 -> ROTATION_90
See http://developer.android.com/reference/android/provider/Settings.System.html#USER_ROTATION for more details