[Verizon Samsung Galaxy S III] Didact74:
[MOD] [GUIDE] AOSP Lockscreen shortcuts

AOSP Lockscreen shortcuts ​

ORIGINAL THREAD​

[Q] What will this MOD do?

[A] If you have implemented my AOSP lockscreen toggle MOD, this will add two more shortcuts to the lockscreen. SMS and Phone.

Using this guide you can also extrapolate the means necassary to add other shortcuts as well. All you would need are the pngs and xml files to do so.

I am including in this guide a zip file that will have the needed pngs and xmls for the SMS and Phone shortcuts. The xmls are simple and easily modified if you choose to get creative and try some new shortcuts.

This will work for stock phone and SMS apps. If you are using handscent or someother sms client it will still shortcut you to the stock sms client not handscent.

Lets get on with it......

We will be working with several files to get the job done here.

framework-res.apk

framework2.jar

android.policy.jar

We will begin with framework-res

Before we get going if you have implemented the AOSP lock already, you may have noticed that the carrier info is still on the screens in both portrait and landscape modes. Let get rid of them first. If you dont care about them....move on to the next step.

Navigate to res/values/layout/keyguard_screen_tab_unlock.xml

Locate the following code and ADD the parts in RED

<TextView android:textAppearance="?textAppearanceMedium" android:textSize="@dimen/keyguard_lockscreen_status_line_font_size" android:textColor="?textColorSecondary" android:ellipsize="marquee" android:gravity="center_horizontal" android:id="@id/carrier" [COLOR="red"]android:visibility="gone"[/COLOR] android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="12.0dip" android:singleLine="true" android:layout_alignParentBottom="true" />
<TextView android:textAppearance="?textAppearanceMedium" android:ellipsize="marquee" android:id="@id/statement" [COLOR="red"]android:visibility="gone"[/COLOR] android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12.0dip" android:singleLine="true" android:drawablePadding="4.0dip" android:layout_below="@id/carrier" android:layout_centerHorizontal="true" android:marqueeRepeatLimit="marquee_forever" />

Navigate to res/values/layout/keyguard_screen_tab_unlock_land.xml

Locate the following code and ADD the parts in RED

<TextView android:textAppearance="?textAppearanceMedium" android:textSize="@dimen/keyguard_lockscreen_status_line_font_size" android:textColor="?textColorSecondary" android:ellipsize="marquee" android:gravity="right" android:layout_gravity="fill_horizontal" android:id="@id/carrier" [COLOR="Red"]android:visibility="gone"[/COLOR] android:layout_width="0.0dip" android:layout_marginBottom="12.0dip" android:singleLine="true" />
<TextView android:textAppearance="?textAppearanceMedium" android:ellipsize="marquee" android:id="@id/statement" [COLOR="red"]android:visibility="gone"[/COLOR] android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="24.0dip" android:layout_marginTop="12.0dip" android:singleLine="true" android:drawablePadding="4.0dip" android:layout_below="@id/carrier" android:marqueeRepeatLimit="marquee_forever" />

Okay, thats it for the carrier stuff. Lets add some shortcuts.

[B]Using the supplied zip file put the following files in the following locations[/B].
ic_lockscreen_phone_activated.png
ic_lockscreen_phone_normal.png
ic_lockscreen_sms_activated.png
ic_lockscreen_sms_normal.png
....all go in /res/drawable-hdpi

[B]Using the supplied zip file put the following files in the following locations.[/B]
ic_lockscreen_phone.xml
ic_lockscreen_sms.xml
......all go in /res/drawable

Navigate to res/values/arrays

Find the following line

<array name="lockscreen_targets_with_camera">

Make the entire array look like this

<array name="lockscreen_targets_with_camera">
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_lockscreen_sms</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_phone</item>
<item>@drawable/ic_lockscreen_camera</item>
<item>@null</item>
<item>@null</item>
<item>@null</item>
</array>

Find the following line

<array name="lockscreen_target_descriptions_with_camera">

Make the entire array look like this

<array name="lockscreen_target_descriptions_with_camera">
<item>@string/description_target_unlock</item>
<item>@string/description_target_sms</item>
<item>@string/description_target_search</item>
<item>@string/description_target_phone</item>
<item>@string/description_target_camera</item>
<item>@null</item>
<item>@null</item>
<item>@null</item>
</array>

Navigate to res/values-land/arrays.xml

Find the following line

<array name="lockscreen_targets_with_camera">

Make the entire array look like this

<array name="lockscreen_targets_with_camera">
<item>@null</item>
<item>@null</item>
<item>@drawable/ic_lockscreen_unlock</item>
<item>@drawable/ic_lockscreen_sms</item>
<item>@drawable/ic_action_assist_generic</item>
<item>@drawable/ic_lockscreen_phone</item>
<item>@drawable/ic_lockscreen_camera</item>
<item>@null</item>
</array>

Find the following line

<array name="lockscreen_target_descriptions_with_camera">

Make the entire array look like this

<array name="lockscreen_target_descriptions_with_camera">
<item>@null</item>
<item>@null</item>
<item>@string/description_target_unlock</item>
<item>@string/description_target_sms</item>
<item>@string/description_target_search</item>
<item>@string/description_target_phone</item>
<item>@string/description_target_camera</item>
<item>@null</item>
</array>

Navigate to res/values/strings and add the following to the file

<string name="description_target_sms">Sms</string>
<string name="description_target_phone">Phone</string>

A this point you need to recompile framework-res and then decompile it. We do this because we are allowing system to generate public IDs for the info we just added. So recompile framework-res and delete the old apk. Decompile the new apk and continue.....

Navigate to res/values/public

Find the following lines and write down thier IDs in the order you see them below and set aside for a step later in the tutorial. Make sure you have the correct ID, some will have more than one instance but only one will look EXACTLY like whats below.

ic_action_assist_generic
ic_lockscreen_camera
ic_lockscreen_silent
ic_lockscreen_unlock
ic_lockscreen_unlock_phantom
ic_lockscreen_phone
ic_lockscreen_sms

[/hide/

Recompile framework-res and move to the next step

Decompile framework2.jar

Navigate to com/android/internal/widget/multiwaveview/GlowPadView.smali

Locate the following method

.method private getDirectionDescription(I)Ljava/lang/String;

Replace the entire method with the following code

.method private getDirectionDescription(I)Ljava/lang/String;
.locals 4
.parameter "index"

.prologue
.line 1119
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptions:Ljava/util/ArrayList;

if-eqz v2, :cond_0

iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptions:Ljava/util/ArrayList;

invoke-virtual {v2}, Ljava/util/ArrayList;->isEmpty()Z

move-result v2

if-eqz v2, :cond_1

.line 1120
:cond_0
iget v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptionsResourceId:I

invoke-direct {p0, v2}, Lcom/android/internal/widget/multiwaveview/GlowPadView;->loadDescriptions(I)Ljava/util/ArrayList;

move-result-object v2

iput-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptions:Ljava/util/ArrayList;

.line 1121
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDrawables:Ljava/util/ArrayList;

invoke-virtual {v2}, Ljava/util/ArrayList;->size()I

move-result v2

iget-object v3, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptions:Ljava/util/ArrayList;

invoke-virtual {v3}, Ljava/util/ArrayList;->size()I

move-result v3

if-eq v2, v3, :cond_1

.line 1122
const-string v2, "GlowPadView"

const-string v3, "The number of target drawables must be equal to the number of direction descriptions."

invoke-static {v2, v3}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I

.line 1124
const/4 v0, 0x0

.line 1133
:goto_0
return-object v0

.line 1130
:cond_1
:try_start_0
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mDirectionDescriptions:Ljava/util/ArrayList;

invoke-virtual {v2, p1}, Ljava/util/ArrayList;->get(I)Ljava/lang/Object;

move-result-object v0

check-cast v0, Ljava/lang/String;
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

.line 1131
.local v0, directionZ:Ljava/lang/String;
goto :goto_0

.line 1132
.end local v0 #directionZ:Ljava/lang/String;
:catch_0
move-exception v1

.line 1133
.local v1, e:Ljava/lang/Exception;
const-string v0, ""

goto :goto_0
.end method

Find the following method

.method private getTargetDescription(I)Ljava/lang/String;

Replace the entire method with the following code

.method private getTargetDescription(I)Ljava/lang/String;
.locals 4
.parameter "index"

.prologue
.line 1099
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptions:Ljava/util/ArrayList;

if-eqz v2, :cond_0

iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptions:Ljava/util/ArrayList;

invoke-virtual {v2}, Ljava/util/ArrayList;->isEmpty()Z

move-result v2

if-eqz v2, :cond_1

.line 1100
:cond_0
iget v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptionsResourceId:I

invoke-direct {p0, v2}, Lcom/android/internal/widget/multiwaveview/GlowPadView;->loadDescriptions(I)Ljava/util/ArrayList;

move-result-object v2

iput-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptions:Ljava/util/ArrayList;

.line 1101
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDrawables:Ljava/util/ArrayList;

invoke-virtual {v2}, Ljava/util/ArrayList;->size()I

move-result v2

iget-object v3, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptions:Ljava/util/ArrayList;

invoke-virtual {v3}, Ljava/util/ArrayList;->size()I

move-result v3

if-eq v2, v3, :cond_1

.line 1102
const-string v2, "GlowPadView"

const-string v3, "The number of target drawables must be equal to the number of target descriptions."

invoke-static {v2, v3}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I

.line 1104
const/4 v1, 0x0

.line 1114
:goto_0
return-object v1

.line 1109
:cond_1
const-string v1, ""

.line 1111
.local v1, targetZ:Ljava/lang/String;
:try_start_0
iget-object v2, p0, Lcom/android/internal/widget/multiwaveview/GlowPadView;->mTargetDescriptions:Ljava/util/ArrayList;

invoke-virtual {v2, p1}, Ljava/util/ArrayList;->get(I)Ljava/lang/Object;

move-result-object v2

move-object v0, v2

check-cast v0, Ljava/lang/String;

move-object v1, v0
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

goto :goto_0

.line 1112
:catch_0
move-exception v2

goto :goto_0
.end method

Thats it for framework2. Recopile framework2.

Decompile android.policy.jar

Navigate to com/android/internal/policy/impl/LockScreen.smali and find the following method

.method static synthetic access$1300(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;

Add the following methods right after the END of the above method

.method static synthetic access$1400(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;
.locals 1
.parameter "x0"

.prologue
.line 56
iget-object v0, p0, Lcom/android/internal/policy/impl/LockScreen;->mContext:Landroid/content/Context;

return-object v0
.end method

.method static synthetic access$1500(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;
.locals 1
.parameter "x0"

.prologue
.line 56
iget-object v0, p0, Lcom/android/internal/policy/impl/LockScreen;->mContext:Landroid/content/Context;

return-object v0
.end method

Navigate to com/android/internal/policy/impl/LockScreen$GlowPadViewMethods.smali.

Find the following method

.method public onTrigger(Landroid/view/View;I)V

Replace the entire method with the following code

.method public onTrigger(Landroid/view/View;I)V
.locals 7
.parameter "v"
.parameter "target"

.prologue
const/high16 v6, 0x1000

.line 313
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->mGlowPadView:Lcom/android/internal/widget/multiwaveview/GlowPadView;

invoke-virtual {v4, p2}, Lcom/android/internal/widget/multiwaveview/GlowPadView;->getResourceIdForTarget(I)I

move-result v3

.line 321
.local v3, resId:I
sparse-switch v3, :sswitch_data_0

.line 367
:goto_0
return-void

.line 323
:sswitch_0
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$1200(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;

move-result-object v4

invoke-static {v4}, Landroid/app/SearchManager;->getAssistIntent(Landroid/content/Context;)Landroid/content/Intent;

move-result-object v0

.line 324
.local v0, assistIntent:Landroid/content/Intent;
if-eqz v0, :cond_0

.line 325
invoke-direct {p0, v0}, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->launchActivity(Landroid/content/Intent;)V

.line 329
:goto_1
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->pokeWakelock()V

goto :goto_0

.line 327
:cond_0
const-string v4, "LockScreen"

const-string v5, "Failed to get intent for assist activity"

invoke-static {v4, v5}, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I

goto :goto_1

.line 333
.end local v0 #assistIntent:Landroid/content/Intent;
:sswitch_1
new-instance v4, Landroid/content/Intent;

const-string v5, "android.media.action.STILL_IMAGE_CAMERA"

invoke-direct {v4, v5}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

invoke-direct {p0, v4}, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->launchActivity(Landroid/content/Intent;)V

.line 334
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->pokeWakelock()V

goto :goto_0

.line 339
:sswitch_2
new-instance v2, Landroid/content/Intent;

const-string v4, "android.intent.action.MAIN"

invoke-direct {v2, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

.line 340
.local v2, phoneIntent:Landroid/content/Intent;
const-string v4, "com.android.contacts"

const-string v5, "com.android.contacts.activities.DialtactsActivity"

invoke-virtual {v2, v4, v5}, Landroid/content/Intent;->setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 341
invoke-virtual {v2, v6}, Landroid/content/Intent;->setFlags(I)Landroid/content/Intent;

.line 342
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$1300(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;

move-result-object v4

invoke-virtual {v4, v2}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V

.line 343
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->goToUnlockScreen()V

goto :goto_0

.line 348
.end local v2 #phoneIntent:Landroid/content/Intent;
:sswitch_3
new-instance v1, Landroid/content/Intent;

const-string v4, "android.intent.action.MAIN"

invoke-direct {v1, v4}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

.line 349
.local v1, mmsIntent:Landroid/content/Intent;
const-string v4, "com.android.mms"

const-string v5, "com.android.mms.ui.ConversationList"

invoke-virtual {v1, v4, v5}, Landroid/content/Intent;->setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 350
invoke-virtual {v1, v6}, Landroid/content/Intent;->setFlags(I)Landroid/content/Intent;

.line 351
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$1400(Lcom/android/internal/policy/impl/LockScreen;)Landroid/content/Context;

move-result-object v4

invoke-virtual {v4, v1}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V

.line 352
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->goToUnlockScreen()V

goto :goto_0

.line 357
.end local v1 #mmsIntent:Landroid/content/Intent;
:sswitch_4
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$500(Lcom/android/internal/policy/impl/LockScreen;)V

.line 358
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->pokeWakelock()V

goto/16 :goto_0

.line 364
:sswitch_5
iget-object v4, p0, Lcom/android/internal/policy/impl/LockScreen$GlowPadViewMethods;->this$0:Lcom/android/internal/policy/impl/LockScreen;

invoke-static {v4}, Lcom/android/internal/policy/impl/LockScreen;->access$400(Lcom/android/internal/policy/impl/LockScreen;)Lcom/android/internal/policy/impl/KeyguardScreenCallback;

move-result-object v4

invoke-interface {v4}, Lcom/android/internal/policy/impl/KeyguardScreenCallback;->goToUnlockScreen()V

goto/16 :goto_0

.line 321
:sswitch_data_0
.sparse-switch
0x1080294 -> :sswitch_0
0x10802dd -> :sswitch_1
0x10802f6 -> :sswitch_4
0x10802fe -> :sswitch_5
0x1080301 -> :sswitch_5
0x1080604 -> :sswitch_2
0x1080607 -> :sswitch_3
.end sparse-switch
.end method

Now, we need to go back to the IDs you wrote down from framework-res. See the last part of the code you just added with the switches? There are 7 generic IDs associated with those switches. You need to add the IDs you wrote down to the switches in the order you wrote them down. For example, when I was done my switches looked like this

0x010802ca -> :sswitch_0
0x01080325 -> :sswitch_1
0x01080341 -> :sswitch_4
0x0108034c -> :sswitch_5
0x0108034f -> :sswitch_5
0x01080a0f -> :sswitch_2
0x01080a12 -> :sswitch_3

Yours may be slightly different. Just make sure you use the right order in which you wrote them down.

Recompile android.policy.jar

Push all files to /system/framework

Done!

Hit that thanks button if this was useful!