Как я писал кастомный локер
Привет хабрастарожилам от хабрановичка. Ровно год назад я решил написать кастомный локер (экран блокировки) для моего старичка Samsung Galaxy Gio в стиле популярного тогда Samsung Galaxy s3. Какие причины заставили меня это сделать, писать не буду, но добавлю лишь то, что в Google Play я программу не собирался выкладывать и каким-либо другим способом заработать на ней не планировал. Данный пост посвящен последствиям моего решения.
Начну издалека. Многие хвалят Android за открытость и возможность заменить и настроить встроенные программы под свои нужды. Что тут сказать? В сравнении с другими популярными ОС, это, безусловно, так, но если копнуть глубже в архитектуру Android возникают трудности и вопросы. Локскрин (в Android это называется keyguard) как раз и вызывает вопросы: почему Google не поступили с ним, так как с лаунчерами, почему не сделали диалог со всеми доступными на устройстве локерами и с возможностью выбрать нужный по умолчанию? Где-то в глубине мозга тихим нерешительным голосом кто-то отвечает: может быть Google (Android Ink. если быть точнее) поступил так из соображений безопасности. Этот голос вероятно прав и многим разработчикам локеров и мне (скромность не позволила приписать себя к их числу) пришлось изобретать велосипед, и не один.
Изучаем исходники
Начал я с использования одного из плюсов Android – из изучения исходников. Я один из тех консерваторов, которые уже 2,5 года сидят на стоковой прошивке (2.3.6), поэтому и исходники изучал соответствующие. Классы, отвечающие за блокировку экрана, лежат в android.policy.jar, что в system/framework. Первоначальной целью было найти «точку входа», т.е. где и когда вызывается локер. Искал здесь.
В классе PhoneWindowManager.java есть метод screenTurnedOff(int why), который вызывает одноименный метод класса KeyguardViewMediator. Проследив, кто кого вызывает, я нашел метод в классе KeyguardViewManager, создающий непосредственно View стокового локера.
Что ж, все гениальное – просто. Решил повторить этот код для своего приложения и получил ошибку – нет нужного permission. Немного погуглив, добавил следующие разрешения: SYSTEM_ALERT_WINDOW и INTERNAL_SYSTEM_WINDOW. Это не помогло.
Вернулся к изучению класса PhoneWindowManager.java:
Для требуемого окна TYPE_KEYGUARD нужно второе из моих добавленных разрешений. Задней точкой тела начал ощущать, что не все так просто, как я себе представлял. Решено было посмотреть на описание этого permission. Вот выдержка из AndroidManifest.xml пакета framework-res.apk.
Вот она – черная полоса в жизни. Ведь я понимал, «signature» – это значит, что использовать этот пермишн может только пакет, подписанный тем же ключом, что и пакет, выдавший это разрешение (в нашем случае — framework-res.apk). Ладно, достаем инструменты для изготовления велосипедов.
Версия один
Первым решением было использовать activity в качестве локскрина. На stackoverflow советуют использовать следующий код:
Признаюсь, в первых версиях я использовал этот метод. У него есть существенные недостатки: статусбар не блокируется, начиная с версии API11 этот метод не работает.
Решение первого недостатка (переполнениестека опять помогло) следующее. Поверх статусбара с помощью WindowManager рисуется прозрачный View, который перехватывает все TouchEvent. Вот служба, реализующая это:
Второго недостатка для меня не существовало, на Gingerbread данный код работал превосходно. На 4pda, куда я опрометчиво выложил свое творение, пользователи жаловались, что на многих телефонах мой локер сворачивался как обычное приложение. Для них найдено такое решение. В качестве стандартного лаунчера устанавливается пустышка. При нажатии кнопки HOME система вызывает мой лаунчер-пустышку. Если кастомный локер активен, лаунчер сразу же закрывается в методе onCreate(), т.е. визуально нажатие кнопки HOME ни к чему не приводит. Если кастомный локер не активен, мой лаунчер тут же вызывает другой правильный лаунчер, который пользователь указал в настройках.
Вот код пустышки:
Выглядело это следующим образом:
Эти велосипеды ездили долго и хорошо, пока я не решил сделать «правильный» локскрин, и уже в стиле Samsung Galaxy S4.
Версия два
Когда системе необходимо запускать кастомный локер? Очевидно, что при выключении экрана. Создадим службу, регистрирующую BroadcastReceiver, т.к. из манифеста данный фильтр не работает.
Необходимо учесть две особенности:
1. Служба должна быть запущена в момент загрузки устройства. Создадим BroadcastReseiver с IntentFilter «android.intent.action.BOOT_COMPLETED». Есть одно НО: служба при запуске должна отключить стандартную блокировку экрана. Особенностью Android является то, что стандартное окно ввода PIN-кода является частью стокового экрана блокировки. Поэтому служба должна запускаться только когда PIN буден введен.
Максимум, на что хватило моей фантазии:
2. Проанализировав PhoneWindowManager видно, что в метод screenTurnedOff(int why) передается переменная why, принимающая 3 значения:
— экран выключился по истечению таймаута (в этом случае стоковый локер запускается с задержкой),
— экран выключился при срабатывании сенсора приближения (во время телефонного разговора),
— экран выключился при нажатии кнопки.
В моем случае такого разнообразия нет. Поэтому служба мониторит состояние телефона, и при входящем звонке или во время разговора экран не блокируется.
Вот основной код службы:
Идея не использовать activity, а использовать WindowManager была еще сильна. Из пяти типов окон, использующих разрешение SYSTEM_ALERT_WINDOW, мне подошел TYPE_SYSTEM_ALERT. Причем у него были очевидные достоинства: блокировался статусбар (по крайней мере, на Gingerbread) и перехватывалось нажатие кнопки HOME (работает даже на Jelly Bean).
Промежуточным звеном между службой и KeyguardView является класс KeyguardMediator:
Дальше история становится менее интересной, так сказать, будничной. На мой локер можно добавлять ярлыки приложений (здесь все стандартно и просто) и виджеты (а вот этот момент достоин отдельной статьи).
Теперь все стало выглядеть современней:
Источник
[GUIDE][MOD] jelly bean pattern lock screen customization
Breadcrumb
xd123456ye
Member
This is for sharing what i learned.
I only tested it only on my cm10.1 based rom.(htc desire, jb4.22_VJCM10.1_vijendrahs_20130407)
So this may not work on other rom.
You need to have knowledge of decompiling.
I used APK-Multi-Tool, baksmali and smali to do this.
1. Increase widget maximum size.
Change left, right, top padding and pageSpacing as follows.
2. Disable initial page hint
Remove following red string.
3. Disable white box while scrolling
Change red string to green one as follows
4. Disable page hint when dragging beyond first or last page
Remove red string in the follwing.
5. (similar to 4 but) Only disable white gradiant
Change red string to green one.
6. Only show bounding box boarder
Modify kg_bouncer_bg_white.9.png as follows
7. Remove carrier, emergency call, battery infomation
modify keyguard_emergency_carrier_area.xml as follows (for emergency and carrier removal)
modify keyguard_message_area.xml as follows (for battery stat removal)
8. Change small widget height
small widget height is determined by unlock UI height.
modify keyguard_host_view.xml as follows.
change green number as you want.
If you set larger number, the widget height will be smaller.
9. Change widget inner padding
Add green text and change red number as you want.
you can remove default padding by setting 0.
10. Move pattern input section
You can move pattern input section by setting padding.
Inside KeyguardSecurityContainer element set padding value as you want.
Источник
[APP][2.2+] Holo Locker (Real Jelly Bean lock screen)
Breadcrumb
mobint
Senior Member
Simple and fast lock screen replacement, based on stock Jelly Bean lock screen.
Holo locker is not a theme for Go Locker or others, it is the real Jelly Bean lock screen app.
Basic features:
— Enable/disable Holo Locker
— Support system security lock
— Customizable text color
— Emergency unlock
— Enable/disable vibrator
— Change screen orientation
— Hide status bar
— Disable status bar
Plus features:
* Support alternative wallpaper.
* Option to change background tint.
* Unread count notifications for call, sms, gmail and K-9 mail.
* Customizable notification badge color.
* Left, right, top and bottom shortcuts customization.
* Other enhancement and customization options.
mobint
Senior Member
V1.1.2 (October 14, 2012)
— Add an option to enable security lock
— Fix FC
V1.1.1 (October 14, 2012)
— Better license validation
V1.1.0 (October 14, 2012)
Holo Locker Plus is now available!
— Support system security lock
— Option to change text color
— Option to change camera app
— Option to change search app
— Fix disable status bar bug
— Add multiple languages support
Plus version:
* Support alternative wallpaper
* Option to change background tint
* Unread counter for Calls/SMS/Gmail/K-9 mail
* Option to change left/right/top/botoom shortcuts
V1.0.4 (September 17, 2012)
- Fix reboot bug
- Fix Home Key Helper bug
- Add Google Search shortcut
- Other bug fixes
V1.0.3 (July 21, 2012)
- Fixed locker on right bug
- Option to change screen orientation
- Add tablet support
- Other bug fixes
V1.0.2 (July 17, 2012)
- Option to disable status bar
- Will not lock when calling
- Other bug fixes
V1.0.1 (July 15, 2012)
- Option to disable vibrator
- Fixed the home key helper bug
Источник
JellyBean Free Lock screen 1.2
(Экран JellyBean Free Lock)
Скачать
Тут вы можете скачать АПK-файл «JellyBeanMagicLockerTheme» для Андроид бесплатно, апк файл версии — 1.2 для загрузки на ваш андроид просто нажмите эту кнопку. Это просто и безопасно. Мы предоставляем только оригинальные апк файлы. Если какой-либо из материалов на этом сайте нарушает ваши права, сообщите нам
«JellyBean 4 free — MagicLockerTheme» Позволяет испытать стиль экрана блокировки на Android 4.1 с вашей текущей системой.
Особенности:
— * NEW * Музыкальное управление
— * NEW * Поддержка шрифтов TrueType (вы можете использовать свои собственные шрифты, помещая файлы шрифтов внутри «SDCard / MagicLocker / Fonts»)
— Отсутствует уведомление о вызове и непрочитанных сообщениях.
********
Если вам нравится наше приложение, пожалуйста, оцените нас пять звезд. Также ваша обратная связь очень важна, пожалуйста, свяжитесь с нами по адресу lockscreen.mobi@gmail.com, если вы встретите какие-либо ошибки или хотите улучшить!
********
Чтобы запустить это приложение темы «Экран блокировки», вы должны сначала установить приложение Magic Locker (следуйте установленному указателю приложения темы или найдите «mobi.lockscreen.magiclocker» в Google Market)
********
Вопрос & Ответ:
В: Как найти еще Волшебные шкатулки?
A: Вы можете нажать кнопку «Дополнительные темы» в «Настройке MagicLocker -> вкладка« Темы ». Или просто найдите «mobi.lockscreen.magiclocker.theme» в Google Market.
В: Как установить Magic Locker Themes?
О: После установки приложения темы Magic Locker вам нужно запустить приложение темы и нажать кнопку «Установить эту тему» в диалоговом окне темы.
В: Как удалить темы Magic Locker?
A: Вы можете долго нажимать тему в «Настройке MagicLocker -> вкладка« Темы », затем нажмите« Удалить тему ». Или перейдите в раздел «Настройка системы -> Приложения -> Управление приложениями», затем найдите тему «Приложение для удаления» в качестве общего приложения.
В: Почему тема «Lost Robot» не может быть удалена из Magic Locker?
A: «Потерянный робот» — это тема по умолчанию в Magic Locker, а Magic Locker должен гарантировать существование хотя бы одной темы.
Вопрос: Почему тема исчезла из «Настройки MagicLocker -> вкладка« Темы »?
A: Во-первых, убедитесь, что ваша SD-карта доступна, если да, попробуйте переустановить приложение темы.
Разрешения Объяснение:
Разрешение доступа в Интернет: для отображения AD. (Только для бесплатных тем и AD будут показаны в разделе «Применение тем и темы»)
Теги: шкафчик, блокировка экрана, блокировка экрана, тема, возможность использования, блокировка клавиатуры, магия,
Источник