Anda di halaman 1dari 9

MENAMBAH SOFTKEY :D

Reference ke http://rootzwiki.com/topic/30278-how-to-step-by-step-guide-to-add-menu-and-search-soft-keys/

Syarat
1. Deodexed (udah pasti harus)
2. Laptop / komputer udah terpasang Apktool (ref: http://forum.xda-developers.com/showthread.php?t=2251719)
3. Kesabaran and Kreatifitas

Bahan :

1. SystemUi.apk yg udah deodexed (simpan juga untuk backup kalo ada apa2)
2. Nandroid Back – up
3. Notepad++ (disarankan untuk pake Notepad ++ untuk pengguna windows, untuk linux user bisa pake Gedit ato juga
Pluma)
4. Laptop plus apktool

Langkah :

Kita akan mengedit beberapa file yg ada di SystemUI.apk

\res\drawable-xhdpi\ic_sysbar_menu.png
\res\drawable-xhdpi\ic_sysbar_menu_land.png
\res\drawable-xhdpi\ic_sysbar_power.png (new)
\res\drawable-xhdpi\ic_sysbar_power_land.png (new)
\res\layout\navigation_bar.xml
\res\values\ids.xml
\res\values\public.xml
\res\values\strings.xml
\smali\com\android\systemui\statusbar\phone\NavigationBarView.smali

1. Decompile SystemUI.apk

http://forum.xda-developers.com/showthread.php?t=2251719)

2. Menambah icon softkey

Ref : http://forum.xda-developers.com/showthread.php?t=2251719 dan bisa download yg http://www.mediafire.com/?


y5swc9m3g251ozc ato jg http://www.mediafire.com/?b1gsz1vdz1h2ph3 karena udah ada icon softkey untuk power
(bisa jg edit ato bikin sendiri pake Photoshop ato sejenisnya).

a. Setelah download extract file zipnya arahkan ke folder


/vrtheme/system/app/SystemUI.apk/res/drawable-xhdpi
b. Copy seluruh icon yang ada di folder tersebut ke /res/drawable-xhdpi (di folder hasil compile dr SystemUI)

3. Menambah resource ID untuk tombol softkey power


Dari folder SystemUI yg sudah tercompile, arahkan ke /res/value/public.xml . Buka public.xml dengan notepad ++.
scroll ke bawah hingga menemukan string yg berawalan <public type=”id” dan tambahkan baris ini setelah id terakhir

<public type="id" name="power" id="..............." />

ganti titik2 tersebut dengan nilai hex. Kita hanya perlu mengambil angka terakhir dari baris sebelumnya dan
ditambahkan 1 angka untuk softkey kita. Ini contoh dr id ane :
<public type="id" name="ticker_expanded" id="0x7f0c00ae" />
<public type="id" name="notification_inspect_item" id="0x7f0c00af" />
<public type="id" name="recent_remove_item" id="0x7f0c00b0" />
<public type="id" name="recent_inspect_item" id="0x7f0c00b1" /> ----> 7f0c00b1 + 1 = 7f0c00b2
<public type="id" name="power" id="0x7f0c00b2" />

perhatikan nilai 0x7f0c00b1 yang mana id paling akhir sebelum diedit. Setelah kita menambahkan id untuk tombol
power , kita tambahkan 1 di digit paling menjadi 0x7f0c00b2 yg kita gunakan untuk tombol power kita ( ingat2 kalo
perlu dicatat nilai id ini, soalnya bakal dipake lagi nanti)

4. Tambahkan baris ini ke dalam /res/value/ids.xml

<item type="id" name="power">false</item>

tambahkan ke baris paling akhir di ids.xml

5. Menambahkan baris ke /res/valu/strings.xml


scroll hingga ke baris paling akhir di strings.xml dan tambahkan baris ini

<string name="accessibility_power">Power</string>

6. Edit smali (yg agak ribet n teliti)


buka \smali\com\android\systemui\statusbar\phone\NavigationBarView.smali

7. tambahkan string ini setelah (klik ctrl + f untuk mencari string tersebut dan tambahkan string di bawah ini setelah
getRecent method tersebut

STRING YANG HARUS DITAMBAHKAN


.method public getPowerButton()Landroid/view/View;
.locals 2

.prologue
.line 73
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mCurrentView:Landroid/view/View;

const v1, 0x7f0c00b2

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v0

return-object v0
.end method

#PENAMPAKAN SEBELUM DITAMBAHKAN STRING BARU#


.method public getRecentsButton()Landroid/view/View;
.locals 2

.prologue
.line 132
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mCurrentView:Landroid/view/View;

const v1, 0x7f0c0032

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v0

return-object v0
.end method

.method public onFinishInflate()V


.locals 6

.prologue
const v5, 0x7f0c0036

PENAMPAKAN SETELAH DITAMBAHKAN STRING BARU (FONT BIRU)


.method public getRecentsButton()Landroid/view/View;
.locals 2

.prologue
.line 132
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mCurrentView:Landroid/view/View;

const v1, 0x7f0c0032

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v0

return-object v0
.end method

.method public getPowerButton()Landroid/view/View;


.locals 2

.prologue
.line 73
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mCurrentView:Landroid/view/View;

const v1, 0x7f0c00b2

invoke-virtual {v0, v1}, Landroid/view/View;->findViewById(I)Landroid/view/View;

move-result-object v0

return-object v0
.end method

.method public onFinishInflate()V


.locals 6

.prologue
const v5, 0x7f0c0036

Perhatikan nilai const v1, 0x7f0c00b2. Nilai dr 0x7f0c00b2 berasal dr nilai id yg kita masukkan di tahap 3. Ganti nilai
tersebut dengan yang agan masukkan tadi.

8. Cari string dengan nama .method public setDisabledFlags(IZ)V


di bawah tersebut biasanya ada baris “.Local 7” atau juga dengan angka berbeda bisa “.local 9” , “.Local 10”

.method public setDisabledFlags(IZ)V


.locals 7
.parameter "disabledFlags"
.parameter "force"

kita perlu merubah angka tersebut dengan menambahkan 2 angka hingga akhirnya menjadi “.Local 9”,

.method public setDisabledFlags(IZ)V


.locals 9
.parameter "disabledFlags"
.parameter "force"

Scroll agak lebih jauh ke bawah kita akan menemukan baris yg berawalan dengan “invoke-virtual” (untuk patokan
cari “.line 231” dan sedikit di baris akhir ada “getHomeButton”. Dan dibawah baris tersebut ada baris “move-result-
object” .. perhatikan angka setelah 'V' . kita akan membuat 2 komponen baru dengan menambahkan di bawah baris
berikut :

.line 231
invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getHomeButton()Landroid/view/View;

move-result-object v6

Setelah kita merubah nilai “.local 7” menjadi “.local 9” , kita perlu menambahkan 2 string baru dengan “move-result-
object v7” dan “move-result-object v8”. (copas baris berikut ini di file agan)

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getPowerButton()Landroid/view/View;

move-result-object v7

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getMenuButton()Landroid/view/View;

move-result-object v8

Dan setelah ditambahkan akan nampak seperti ini


.line 231
invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getHomeButton()Landroid/view/View;

move-result-object v6

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getPowerButton()Landroid/view/View;

move-result-object v7

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getMenuButton()Landroid/view/View;


move-result-object v8

Beberapa baris berikut , akan terlihat baris sperti ini :

:goto_6
invoke-virtual {v6, v3}, Landroid/view/View;->setVisibility(I)V

Untuk patokan kita bisa search “setVisibility(I)V”. dibawah baris tersebut kita menambahkan 2 baris baru yg sesuai
dengan 2 nilai 'v' yg baru tadi yaitu v7 dan v8 maka akan jadi seperti berikut

:goto_6
invoke-virtual {v6, v3}, Landroid/view/View;->setVisibility(I)V

invoke-virtual {v7, v3}, Landroid/view/View;->setVisibility(I)V

invoke-virtual {v8, v3}, Landroid/view/View;->setVisibility(I)V

Sehingga , jika dilihat dari '.line 231' sampe step ini seperti berikut

.line 231
invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getHomeButton()Landroid/view/View;

move-result-object v6

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getPowerButton()Landroid/view/View;

move-result-object v7

invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getMenuButton()Landroid/view/View;

move-result-object v8

if-eqz v1, :cond_6

move v3, v5

:goto_6
invoke-virtual {v6, v3}, Landroid/view/View;->setVisibility(I)V

invoke-virtual {v7, v3}, Landroid/view/View;->setVisibility(I)V

invoke-virtual {v8, v3}, Landroid/view/View;->setVisibility(I)V


9. Langkah berikut, cari baris dengan nama .method public setMenuVisibility(Z)V dan .method public
setMenuVisibility(ZZ)V … yang perlu dilakukan hapus semua baris yg ber font warna MERAH

.method public setMenuVisibility(Z)V


.locals 1
.parameter "show"

.prologue
.line 251
const/4 v0, 0x0

invoke-virtual {p0, p1, v0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->setMenuVisibility(ZZ)V

.line 252
return-void
.end method

.method public setMenuVisibility(ZZ)V


.locals 2
.parameter "show"
.parameter "force"

.prologue
.line 255
if-nez p2, :cond_0

iget-boolean v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mShowMenu:Z

if-ne v0, p1, :cond_0

.line 260
:goto_0
return-void

.line 257
:cond_0
iput-boolean p1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mShowMenu:Z

.line 259
invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;-
>getMenuButton()Landroid/view/View;

move-result-object v1
iget-boolean v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mShowMenu:Z

if-eqz v0, :cond_1

const/4 v0, 0x0

:goto_1
invoke-virtual {v1, v0}, Landroid/view/View;->setVisibility(I)V

goto :goto_0

:cond_1
const/4 v0, 0x4

goto :goto_1
.end method

Dan yg tersisan hanya seperti ini


.method public setMenuVisibility(Z)V
.locals 1
.parameter "show"

return-void
.end method

.method public setMenuVisibility(ZZ)V


.locals 2
.parameter "show"
.parameter "force"

return-void
.end method

Step ini berefek pada softkey menu akan selalu terlihat. Save dan tutup Notepad ++ … editing smali udah beres hingga
step ini.

10. Menambahkan softkey ke navigation bar.


Buka res/layout/navigation_bar.xml.
Layout asli dalam posisi horizontal :
<LinearLayout android:orientation="horizontal" android:id="@id/nav_buttons" android:clipChildren="false" android:clipToPadding="false"
android:layout_width="fill_parent" android:layout_height="fill_parent" android:animateLayoutChanges="true" android:directionality="none">
<View android:visibility="invisible" android:layout_width="40.0dip" android:layout_height="fill_parent" android:layout_weight="0.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/back" android:layout_width="@dimen/navigation_key_width"
android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_back" android:scaleType="center" android:layout_weight="0.0"
android:contentDescription="@string/accessibility_back" systemui:keyCode="4" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/home" android:layout_width="@dimen/navigation_key_width"
android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_home" android:layout_weight="0.0"
android:contentDescription="@string/accessibility_home" systemui:keyCode="3" systemui:keyRepeat="false"
systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/recent_apps" android:layout_width="@dimen/navigation_key_width"
android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_recent" android:layout_weight="0.0"
android:contentDescription="@string/accessibility_recent" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/menu" android:visibility="invisible"
android:layout_width="@dimen/navigation_menu_key_width" android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_menu"
android:layout_weight="0.0" android:contentDescription="@string/accessibility_menu" systemui:keyCode="82"
systemui:glowBackground="@drawable/ic_sysbar_highlight" />
</LinearLayout>

Untuk menyisipkan menu power .. maka kita perlu memasukkan baris ini di dalam layout ;
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/power" android:layout_width="70.0dip"
android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_power" android:layout_weight="0.0"
android:contentDescription="@string/accessibility_power" systemui:keyCode="26" systemui:keyRepeat="false"
systemui:glowBackground="@drawable/ic_sysbar_highlight" />

Maka akan jadi berikut :

<FrameLayout android:id="@id/rot0" android:layout_width="fill_parent" android:layout_height="fill_parent">


<LinearLayout android:orientation="horizontal" android:id="@id/nav_buttons" android:clipChildren="false" android:clipToPadding="false"
android:layout_width="fill_parent" android:layout_height="fill_parent" android:animateLayoutChanges="true">
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/power" android:layout_width="70.0dip" android:layout_height="fill_parent"
android:src="@drawable/ic_sysbar_power" android:layout_weight="0.0" android:contentDescription="@string/accessibility_power" systemui:keyCode="26"
systemui:keyRepeat="false" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/back" android:layout_width="70.0dip" android:layout_height="fill_parent"
android:src="@drawable/ic_sysbar_back" android:layout_weight="0.0" android:contentDescription="@string/accessibility_back" systemui:keyCode="4"
systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/home" android:layout_width="80.0dip" android:layout_height="fill_parent"
android:src="@drawable/ic_sysbar_home" android:layout_weight="0.0" android:contentDescription="@string/accessibility_home" systemui:keyCode="3"
systemui:keyRepeat="false" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/recent_apps" android:layout_width="70.0dip"
android:layout_height="fill_parent" android:src="@drawable/ic_sysbar_recent" android:layout_weight="0.0"
android:contentDescription="@string/accessibility_recent" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/menu" android:layout_width="70.0dip" android:layout_height="fill_parent"
android:src="@drawable/ic_sysbar_menu" android:layout_weight="0.0" android:contentDescription="@string/accessibility_menu" systemui:keyCode="82"
systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
</LinearLayout>

Jika kita meletakkan baris baru tersebut di atas sendiri seperti di dalam tabel diatas, layout di navigation bar berada di
paling kiri.

Hal yg sama juga kita lakukan pada posisi vertical, yg akan jadi seperti ini :

<FrameLayout android:id="@id/rot90" android:paddingTop="0.0dip" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="fill_parent">


<LinearLayout android:orientation="vertical" android:id="@id/nav_buttons" android:clipChildren="false" android:clipToPadding="false" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:animateLayoutChanges="true">
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/menu" android:layout_width="fill_parent" android:layout_height="70.0dip"
android:src="@drawable/ic_sysbar_menu_land" android:layout_weight="0.0" android:contentDescription="@string/accessibility_menu" systemui:keyCode="82"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/recent_apps" android:layout_width="fill_parent" android:layout_height="70.0dip"
android:src="@drawable/ic_sysbar_recent_land" android:layout_weight="0.0" android:contentDescription="@string/accessibility_recent"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/home" android:layout_width="fill_parent" android:layout_height="80.0dip"
android:src="@drawable/ic_sysbar_home_land" android:layout_weight="0.0" android:contentDescription="@string/accessibility_home" systemui:keyCode="3"
systemui:keyRepeat="false" systemui:glowBackground="@drawable/ic_sysbar_highlight_land" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/back" android:layout_width="fill_parent" android:layout_height="70.0dip"
android:src="@drawable/ic_sysbar_back_land" android:layout_weight="0.0" android:contentDescription="@string/accessibility_back" systemui:keyCode="4"
systemui:glowBackground="@drawable/ic_sysbar_highlight_land" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@id/power" android:layout_width="fill_parent" android:layout_height="70.0dip"
android:src="@drawable/ic_sysbar_power_land" android:layout_weight="0.0" android:contentDescription="@string/accessibility_power" systemui:keyCode="26"
systemui:keyRepeat="false" systemui:glowBackground="@drawable/ic_sysbar_highlight" />
<View android:visibility="invisible" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" />
</LinearLayout>
11. Langkah terakhir , decompile SystemUI dan masukkan lagi ke folder /system/app di HH agan …

12. Finish