Landscape режим экрана

Материал из Toshiba AC100 wiki
Перейти к: навигация, поиск

Портирование ОС Андроид 4.x (CyanogenMod 9) на Toshiba AC100

Ac100.jpg В наш динамичный век развития информационных технологий и новинок рынка связанного с ними, многие могут не заметить по настоящему интересные вещи которые появляются благодаря творческим отступлениям некторых производителей, они сгорают как искры в пучине пламени ширпотреба, остаются игрушками энтузиастов и некторых счастливчиков которые не знают, что держат в руках. По нашему мнению смартбук Toshiba AC100/Dynabook AZ яркий тому пример. Наша цель дать вторую молодость этому интересному своей конвергенцией и оригинальными находками устройству, брошенному на произвол производителем и вендорами.

Для тех кто первый раз слышит о таком будут интересны обзоры этого устройсва (линки на обзоры), но сей труд о другом, о том какой тернистый путь ожидает того кто захочет сделать для нашего героя работающий Андроид последней версии.

Ниже идет одна из серии статей посвященных проблемам портирования операционной системы Андроид версии 4.x в варианте от всем известного CyanogenMod (линк)

Часть 1. Изменение режима экрана по умолчанию на ландшафтный

Суть проблемы

При старте ос экран находится в ландшафтном состоянии, но через секунду поворачивается в портретный режим и не выходит из него. Только приложения которые настаивают на ландшафте вроде Camera могут его на время заставить вернутся в ландшафтный режим.

Что мы имеем

Чего нам хочется

  • Чтобы экран был всегда в ландшафтном состоянии и не переключался из него.
  • В крайнем случае если приложение перевернуло его или оно только портретное иметь возможность перевернуть обратно в

ландшафт.

  • Иметь выше описанные возможности прям из коробки при сборке дистрибутива ос, а не используя сторонние приложения.
  • Только опенсоурс варианты, того требует лицензия 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
D/SensorService(  170): nuSensorService starting...
E/SensorService(  170): couldn't load sensors module (No such file or directory)

* Нужен програмист разобраться в нем, что ему не нравится или дописать

    • Написать свой dummy libsensors который будет эмулировать акселерометр, например постоянно сообщая что нужно перевернуться

в ладшафтный режим

программиста кто бы мог понять как это работает.

Результат

На текущий момент единственное рабочее решение которое было найдено установка 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