W dniach 16.05.2019 do 13.06.2019 mail z forum nie działał poprawnie i mógł zgubić kilka maili, jeśli ktoś się próbował kontaktować proszę zrobić to ponownie. Za utrudnienia przepraszam!


[-]
Reklama



Ocena wątku:
  • 7 głosów - średnia: 3.29
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
edycja domyślnego wyglądu pulpitów launchera

[Tutorial] Edycja domyślnego wyglądu pulpitów launchera
[chapter]Wstęp[/chapter]
Jak wyczyścić pulpity launchera ze wszystkiego co tam domyślnie jest opisał Phenom w tym wątku:

http://www.modaco.pl/Thread-How-To-Usuwa...ra-Pulpitu


Ja skupię się na nieco ambitniejszej formie sprowadzania wyglądu pulpitów do poziomu naszych potrzeb, czyli edycji zawartości pulpitów.
Napiszę tutaj wszystko do czego sam doszedłem w tym temacie i myślę, że za wyjątkiem jednej niewiadomej która tutaj występuje, całe równanie będzie w miarę proste do rozwiązania.

Ze względu na różnorodność wszelkiego typu launcherów - ja ograniczę się do edycji wyglądu stockowego launchera z Galaxy S2. Myślę, że zasada będzie słuszna i dla innych launcherów - różnice w nazwach plików źródłowych nie powinny być zbyt dużą przeszkodą.

[chapter]Gdzie znaleźć właściwe pliki, czyli gdzie kopać żeby wykopać[/chapter]

Pliki xml opisujące jakie elementy zawierają pulpity, gdzie i jak są ułożone znaleźć można w lokalizacji res/xml/ w pliku launchera. Nazywają się one różnie w zależności od launchera jednak wiedząc czego się szuka, odnalezienie plików z właściwą zawartością nie będzie problemem.
Oczywiście plik launchera trzeba najpierw zdekompilować - pliki "wyjęte" z apki otwartej jakimś archiwizerem do niczego się nie przydadzą.

Zawartość folderu xml mojego launchera wygląda tak (JB 4.1.2 XXLSJ Leak):

default_application_order.xml
default_workspace.xml
default_workspace_cp.xml
default_workspace_simple.xml
default_workspace_wifi.xml


W tym przypadku nie miałem problemu ze zlokalizowaniem potrzebnego mi pliku - jest nim:

default_workspace.xml

... dla bezpieczeństwa - bo ma prawie identyczną zawartość - dołożyłem do tego plik:

default_workspace_wifi.xml

[chapter]Jak wygląda nasz pulpit zapisany w xml, czyli literkowy pałer[/chapter]

Zawartość pliku default_workspace.xml, czyli cały wygląd pulpitów launchera zapisany w xml wygląda tak jak poniżej:

=============================================

<?xml version="1.0" encoding="utf-8"?>
<favorites
xmlns:launcher="http://schemas.android.com/apk/res/com.sec.android.app.launcher">

<home>
<appwidget launcher:className="flipboard.widget.FlipboardWidgetMedium" launcher:packageName="flipboard.app" launcherConfusedcreen="2" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="2" />
<favorite launcher:className="com.sec.pcw.hybrid.CloudApp" launcher:packageName="com.sec.pcw" launcherConfusedcreen="2" launcher:x="0" launcher:y="3" />
<favorite launcher:className="com.dropbox.android.activity.DropboxBrowser" launcher:packageName="com.dropbox.android" launcherConfusedcreen="2" launcher:x="1" launcher:y="3" />
<favorite launcher:className="com.sec.android.gallery3d.app.Gallery" launcher:packageName="com.sec.android.gallery3d" launcherConfusedcreen="2" launcher:x="2" launcher:y="3" />
<favorite launcher:className="com.android.settings.Settings" launcher:packageName="com.android.settings" launcherConfusedcreen="2" launcher:x="3" launcher:y="3" />
<sactivitywidget launcher:className="com.sec.android.widgetapp.ap.hero.accuweather.widget.WeatherClock" launcher:packageName="com.sec.android.widgetapp.ap.hero.accuweather.widget" launcherConfusedcreen="3" launcher:x="0" launcher:y="0" />
<appwidget launcher:className="android.googleSearch.googleSearchWidget.GoogleSearchProvider" launcher:packageName="android.googleSearch.googleSearchWidget" launcherConfusedcreen="3" launcher:x="0" launcher:y="2" launcherConfusedpanX="4" launcherConfusedpanY="1" />
<favorite launcher:className="com.sec.chaton.HomeActivity" launcher:packageName="com.sec.chaton" launcherConfusedcreen="3" launcher:x="0" launcher:y="3" />
<favorite launcher:className="com.sec.android.app.camera.Camera" launcher:packageName="com.sec.android.app.camera" launcherConfusedcreen="3" launcher:x="1" launcher:y="3" />
<favorite launcher:className="com.sec.android.app.samsungapps.Main" launcher:packageName="com.sec.android.app.samsungapps" launcherConfusedcreen="3" launcher:x="2" launcher:y="3" />
<favorite launcher:className="com.android.vending.AssetBrowserActivity" launcher:packageName="com.android.vending" launcherConfusedcreen="3" launcher:x="3" launcher:y="3" />
<appwidget launcher:className="com.samsung.videohub.widget.VideoHubWidget" launcher:packageName="com.samsung.videohub" launcherConfusedcreen="4" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="2" />
<appwidget launcher:className="com.sec.android.app.music.appwidget.MusicAppWidgetProvider" launcher:packageName="com.sec.android.app.music" launcherConfusedcreen="4" launcher:x="0" launcher:y="2" launcherConfusedpanX="4" launcherConfusedpanY="2" />
<appwidget launcher:className="com.tgrape.android.radar.widget.WidgetProvider" launcher:packageName="com.tgrape.android.radar" launcherConfusedcreen="5" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="4" />
</home>
<hotseat>
<favorite launcher:className="com.android.contacts.activities.DialtactsActivity" launcher:packageName="com.android.contacts" launcherConfusedcreen="0" />
<favorite launcher:className="com.android.contacts.activities.PeopleActivity" launcher:packageName="com.android.contacts" launcherConfusedcreen="1" />
<favorite launcher:className="com.android.mms.ui.ConversationComposer" launcher:packageName="com.android.mms" launcherConfusedcreen="2" />
<favorite launcher:className="com.android.browser.BrowserActivity" launcher:packageName="com.android.browser" launcherConfusedcreen="3" />
</hotseat>
</favorites>


=============================================

Skomplikowane i całkowicie niezrozumiałe?
No... może się takie faktycznie wydawać - tym bardziej, że poszczególne wiersze kodu są tu "łamane" przez brak miejsca w szerokości posta - dlatego też pozwolę sobie nieco przetłumaczyć ten zapis, czyli jak mawiał wieszcz: Poloneza czas zacząć...

[chapter]Wiedza podstawowa, czyli czemu warto chodzić do gimnazjum...[/chapter]

Zacznijmy od tego, że każdy z pulpitów launchera to swojego rodzaju siatka współrzędnych. Każdy pulpit jest podzielony na pola, których ilość - w zależności od launchera, jego modyfikacji czy czego tam jeszcze - może być, w pewnych granicach, różna. Standardem jest siatka 4x4 pola.
Ważne to jest o tyle, że wszystkie elementy rozmieszczane są wg współrzędnych tej właśnie siatki.

Aby zrozumieć dalszą część opisu należy wiedzieć (i zapamiętać) jeszcze kilka drobiazgów:
1. Powyższy kod dotyczy launchera z 7 pulpitami,
2. Elementy zajmują tylko 3 kolejne z 7 pulpitów launchera,
4. Siatka launchera to 4x4 pola.
Jest to dosyć ważne dla podstaw arytmetyki, które zaraz wprowadzimy.
Dla podstaw naszej "arytmetyki"... a może geometrii ... należy również rozróżniać pojęcia: "oś X" i "oś Y" - bo i takimi pojęciami trzeba się tu posługiwać.

Tak więc, standardowa siatka launchera wraz z oznaczeniem kolumn:

- dla osi X - wiersze (poziom)
- dla osi Y - kolumny (pion)

[table]
[row]
[cell]0[/cell]
[cell]1[/cell]
[cell]2[/cell]
[cell]3[/cell]
[/row]
[row]
[cell]1[/cell]
[cell][/cell]
[cell][/cell]
[cell][/cell]
[/row]
[row]
[cell]2[/cell]
[cell][/cell]
[cell][/cell]
[cell][/cell]
[/row]
[row]
[cell]3[/cell]
[cell][/cell]
[cell][/cell]
[cell][/cell]
[/row]
[/table]

Jak widać - liczenie współrzędnych zawsze zaczynamy od 0 (słownie: ZERA) - trzeba o tym pamiętać bo o pomyłkę w liczeniu nie trudno.
(Pierwsza kolumna od lewej to 0, druga kolumna od lewej to 1 itd.
Pierwszy wiersz od góry to 0, drugi wiersz od góry to 1 itd.)


Z powyższego wynika, że współrzędną wyjściową jest lewy-górny narożnik pulpitu - 0 (zero) wspólne dla osi X i Y - i tego się trzymajmy bezkrytycznie.

Podobnie liczymy pulpity launchera (bez względu na ich ilość), czyli od lewej i od 0 (słownie: ZERA)
(Pierwszy ekran od lewej to 0, drugi ekran od lewej to 1 itd.)

Mając już podstawowe informacje możemy przejść dalej...

[chapter]Konkrety, czyli "...i rozłożymy tą sukę na części."[/chapter]
(użyty cytat pochodzi z filmu "Testosteron")

Cały kod jest podzielony de facto na dwa bloki - występują tutaj dwa główne tagi, które tego podziału dokonują:

<home> ... </home>
Wydziela blok opisujący zawartość i ułożenie elementów na wszystkich dostępnych pulpitach (ta część pulpitu, która się przewija).

<hotseat> ... </hotseat>
Wydziela blok opisujący zawartość dolnego paska skrótów (ta część pulpitu, która się nie przewija).

Dla rozjaśnienia sytuacji dokonajmy umownych podziałów w zapisie tego kodu xml. Zostaną w nim rozdzielone wcześniej wspomniane bloki, a w ich obrębie oddzielę od siebie poszczególne elementy - żeby się ze sobą nie zlewały. Każdy oddzielony blok tekstu to tak naprawdę jedna linia (jeden element) - jeśli masz odpowiednio szeroki monitor to sam się o tym przekonasz...
Linie znajdujące się NAD tagiem <home> generalnie nas dezinteresmą - być muszą i tego nie ruszamy. Podobnie z tagiem </favorites>, który zamyka całość kodu.

=============================================

<?xml version="1.0" encoding="utf-8"?>
<favorites
xmlns:launcher="http://schemas.android.com/apk/res/com.sec.android.app.launcher">


<home>
<appwidget launcher:className="flipboard.widget.FlipboardWidgetMedium" launcher:packageName="flipboard.app" launcherConfusedcreen="2" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="2" />

<favorite launcher:className="com.sec.pcw.hybrid.CloudApp" launcher:packageName="com.sec.pcw" launcherConfusedcreen="2" launcher:x="0" launcher:y="3" />

<favorite launcher:className="com.dropbox.android.activity.DropboxBrowser" launcher:packageName="com.dropbox.android" launcherConfusedcreen="2" launcher:x="1" launcher:y="3" />

<favorite launcher:className="com.sec.android.gallery3d.app.Gallery" launcher:packageName="com.sec.android.gallery3d" launcherConfusedcreen="2" launcher:x="2" launcher:y="3" />

<favorite launcher:className="com.android.settings.Settings" launcher:packageName="com.android.settings" launcherConfusedcreen="2" launcher:x="3" launcher:y="3" />

<sactivitywidget launcher:className="com.sec.android.widgetapp.ap.hero.accuweather.widget.WeatherClock" launcher:packageName="com.sec.android.widgetapp.ap.hero.accuweather.widget" launcherConfusedcreen="3" launcher:x="0" launcher:y="0" />

<appwidget launcher:className="android.googleSearch.googleSearchWidget.GoogleSearchProvider" launcher:packageName="android.googleSearch.googleSearchWidget" launcherConfusedcreen="3" launcher:x="0" launcher:y="2" launcherConfusedpanX="4" launcherConfusedpanY="1" />

<favorite launcher:className="com.sec.chaton.HomeActivity" launcher:packageName="com.sec.chaton" launcherConfusedcreen="3" launcher:x="0" launcher:y="3" />

<favorite launcher:className="com.sec.android.app.camera.Camera" launcher:packageName="com.sec.android.app.camera" launcherConfusedcreen="3" launcher:x="1" launcher:y="3" />

<favorite launcher:className="com.sec.android.app.samsungapps.Main" launcher:packageName="com.sec.android.app.samsungapps" launcherConfusedcreen="3" launcher:x="2" launcher:y="3" />

<favorite launcher:className="com.android.vending.AssetBrowserActivity" launcher:packageName="com.android.vending" launcherConfusedcreen="3" launcher:x="3" launcher:y="3" />

<appwidget launcher:className="com.samsung.videohub.widget.VideoHubWidget" launcher:packageName="com.samsung.videohub" launcherConfusedcreen="4" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="2" />

<appwidget launcher:className="com.sec.android.app.music.appwidget.MusicAppWidgetProvider" launcher:packageName="com.sec.android.app.music" launcherConfusedcreen="4" launcher:x="0" launcher:y="2" launcherConfusedpanX="4" launcherConfusedpanY="2" />

<appwidget launcher:className="com.tgrape.android.radar.widget.WidgetProvider" launcher:packageName="com.tgrape.android.radar" launcherConfusedcreen="5" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="4" />
</home>

<hotseat>
<favorite launcher:className="com.android.contacts.activities.DialtactsActivity" launcher:packageName="com.android.contacts" launcherConfusedcreen="0" />

<favorite launcher:className="com.android.contacts.activities.PeopleActivity" launcher:packageName="com.android.contacts" launcherConfusedcreen="1" />

<favorite launcher:className="com.android.mms.ui.ConversationComposer" launcher:packageName="com.android.mms" launcherConfusedcreen="2" />

<favorite launcher:className="com.android.browser.BrowserActivity" launcher:packageName="com.android.browser" launcherConfusedcreen="3" />
</hotseat>

</favorites>


=============================================

Odrobinę jaśniej? No to ciśniemy dalej...

W powyższym kodzie występuja dwa (no... trzy) rodzaje elementów pulpitu - dla ułatwienia operujmy określeniem "obiekt/obiekty".

Skróty
Pierwszym z nich jest: SKRÓT - czyli odnośnik do programu lub funkcji reprezentowany ikonką właściwą owemu programowi lub funkcji.
Zajmuje jedno pole ekranu launchera (zawsze).
Tego typu obiekty są reprezentowane w kodzie xml jako zapis (początek linii):

<favorite ...

Przykładowy skrótu dla aplikacji Aparatu foto/Kamery:

<favorite launcher:className="com.sec.android.app.camera.Camera" launcher:packageName="com.sec.android.app.camera" launcherConfusedcreen="3" launcher:x="1" launcher:y="3" />

Elementy:

< - tag otwierający zapis obiektu w xml,

favorite - określa nam konkretny typ obiektu, w tym przypadku jest to skrót do aplikacji,

launcher:className="com.sec.android.app.camera.Camera" - klasa obiektu (plik *.smali) do której się odwołujemy.
W tym przypadku jest to plik Camera.smali znajdujący się w lokalizacji:

smali/com/sec/android/app/camera/

Tutaj następuje - wcześniej wspominana - dziura mentalna bo do dzisiaj nie dowiedziałem się skąd wziąć nazwę tego pliku.
O ile ścieżkę do pliku smali da się "zgadnąć" na podstawie nazwy aplikacji (z punktu następnego) o tyle z konkretnym plikiem może już być problem - w tej lokalizacji jest zawsze co najmniej kilka plików (czasami nawet kilkaset)...

W tym miejscu liczę, że znajdzie się ktoś, kto podsunie jakieś wskazówki odnośnie tego elementu.

launcher:packageName="com.sec.android.app.camera" - nazwa aplikacji do której się odwołujemy. Ową nazwę można pobrać sobie z folderu data/data.

launcherConfusedcreen="3" - ekran na którym obiekt jest zlokalizowany (pamiętamy o "dziwnym" liczeniu kolejności ekranów).
UWAGA:
W przypadku elementów dolnego paska skrótów ( <hotseat> ... </hotseat> ) ten zapis jest jedną i jedyną opcją dla elementu. W odróżnieniu od "zwykłych" skrótów, tutaj określa on nam KOLEJNOŚĆ skrótów na pasku skrótów.
Pierwszy skrót od lewej to: launcherConfusedcreen="0"
Drugi skrót od lewej to: launcherConfusedcreen="1" itd.


launcher:x="1" - Współrzędna położenia X

launcher:y="3" - Współrzędna położenia Y

/> - tag zamykający opis obiektu w xml


Widżety
Drugim elementem pulpitu jest WIDŻET EKRANOWY (statyczny) - Widżet jest elementem graficznego interfejsu użytkownika danego systemu operacyjnego umożliwiającym komunikację tegoż systemu (lub konkretnego progamu) z użytkownikiem. Widżety otrzymują komunikaty generowane przez system/program i wyświetlają ich prezentację na ekranie.
Widżety statyczne nie prezentują żadnych zmieniających się informacji pozyskiwanych z systemu czy aplikacji - są rozbudowanym i oferującym najczęściej różne funkcjonalne opcje, graficznym odnośnikiem to "jakiejś" funkcji systemu czy aplikacji z której pochodzą.
Zajmuje dowolną ilość pół ekranu, ale nie większą niż maksymalna ilość wyznaczona przez siatkę współrzędnych. Niektóre widżety są skalowalne, niektóre mają jedną, z góry określoną wielkość.

Tego typu obiekty są reprezentowane w kodzie xml jako zapis (początek linii):

<appwidget ...

Przykładowy widżet aplikacji Flipboard:

<appwidget launcher:className="flipboard.widget.FlipboardWidgetMedium" launcher:packageName="flipboard.app" launcherConfusedcreen="2" launcher:x="0" launcher:y="0" launcherConfusedpanX="4" launcherConfusedpanY="2" />

Pominę elementy wspólne dla poprzedniego obiektu i wymienię tylko różnice:

launcherConfusedpanX="4" - szerokość widżetu (ilość zajmowanych kolumn)

launcherConfusedpanY="2" - wysokość widżetu (ilość zajmowanych wierszy)

Te wartości występują tylko w przypadku gdy widżet dysponuje funkcjonalnością zmiany rozmiaru - trzeba o tym pamiętać.


Trzeci element to WIDŻET EKRANOWY (dynamiczny) - tym różni się od statycznego widżetu, że wyświetla zmienne dane pozyskiwane ze swoich źródeł. Przykładem tego typu elementów są widżety pogodowe, widżety zegarów etc.

Tego typu obiekty są reprezentowane w kodzie xml jako zapis (początek linii):

<sactivitywidget ...

Elementy kodu stosuje się tak jak w widżecie statycznym.


To właściwie wszystko jeśli chodzi o rozkładanie tej su... ekhem... tego-tam na czynniki pierwsze.
Mam nadzieję, że cały "literkowy" zapis wyglądu pulpitów nabrał jakiegoś sensu.

Aha...
Jeszcze jedna ważna uwaga...

Obiekty na pulpitach (w zapisie xml) układa się "po kolei".
Znaczy to, że zapis zaczyna się od obiektu zlokalizowanego na współrzędnych 0x0 pierwszego (od lewej) "zajętego" ekranu.
Zapodany przykład zapisu bardzo dobrze ilustruje tą zależność. Ważne jest to o tyle, że nie istnieje tutaj żadne inne wydzielenie pulpitów jak tylko przypisanie obiektu (do konkretnego pulpitu) poprzez zmienną launcherConfusedcreen="X".

[chapter]Aplikujemy, czyli kroplówka dla nieboszczyka.[/chapter]

Przez wzgląd na wcześniej wspominaną "dziurę mentalną", w modyfikacjach wyglądu i zawartości pulpitów używam zapisów, które mam do dyspozycji w już modyfikowanych launcherach - dekompiluję je sobie i podglądam.
Sorka, ale androidowy światek jest bardziej hermetyczny niż słoik z czteroletnimi konfiturami i nie idzie się dowiedzieć kompletnie NIC - wszystko cza robić metodą prób-i-błędów lub podglądać modyfikacje już udostępnione publicznie...
To tak gwoli usprawiedliwienia za niepełne informacje w temacie.

No ale OK. Co się zaczęło to czas skończyć.
Po wprowadzeniu właściwych poprawek do odpowiednich plików xml całą apkę launchera należy ponownie skompilować jako aplikację systemową i podpisać.
Kompilując plik, robimy to wg zaleceń z wątku Phenoma:

http://www.modaco.pl/Thread-How-To-Przer...rameworkow

... oraz dodatkowo usuwamy dwa zmodyfikowane wcześniej pliki xml.

Po kompilacji i podpisaniu pliku launchera, otwieramy nowy oraz oryginalny plik launchera jakimś archiwizerem danych (ja polecam 7-zip) i przenosimy właściwe pliki z jednego okna do drugiego.

Jeśli wszystkie zmiany zostały zweryfikowane pozytywnie - znaczy... są zgodne ze wszystkimi zasadami, to po romowaniu nasz launcher powinien wyglądać tak, jak tego sobie życzymy.
Świadomie używam określenia "po romowaniu" bo doinstalowanie modyfikowanego launchera do już działającego romu nie zmieni praktycznie nic.

W tym miejscu kończę (na tą chwilę) swoje dywagacje i oczekuję konstruktywnej krytyki oraz informacji uzupełniających...

[chapter]Informacje do uzupełnienia, czyli głąb kapuściany jestem i tyle...[/chapter]

- "Dziura mentalna" (skąd wziąć właściwe nazwy plików smali)
- Ustawianie domyślnej ilości ekranów w launcherze.


Niemniej, mimo powyższych ułomności artykułu życzę owocnych eksperymentów.


Odpowiedz Opera Windows 7
Aktualizacja
  • Uzupełnienie opisu elementu "skrót": launcher:className.
    Częściowe rozwiązanie problemu "niewiedzy".
  • Uzupełnienie opisu elementu "skrót": launcherConfusedcreen.
  • Uzupełnienie części dotyczącej kompilowania apki.


Odpowiedz Opera Windows 7


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości