[Galaxy S II Themes and Apps] rodries:
Hi

This is the solution to fix the StartingAlertService Wakelock

To reproduce the problem (or the fix) modify calendar settings to notify events in status bar, create a an event and add a reminder inmediatly, so a notificantion is triggered and you can see it in status bar, open BetterBatteryStats and you can check in partial wakelocks if you have the StartingAlertService Wakelock. You will see that the wakelock is always working, you only need to refresh data and the wakelock time is increased, the wakelock is not released until you close to notification.

The problem is in TouchWizCalendar.apk not releasing the wakelock properly in class ServiceHandler inside class AlertService

The actual code is:

private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
processMessage(msg);
AlertService.this.stopSelf();
}
}

If you check the new android sources you can see the next code:

private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
processMessage(msg);
// NOTE: We MUST not call stopSelf() directly, since we need to
// make sure the wake lock acquired by AlertReceiver is released.
AlertReceiver.finishStartingService(AlertService.this, msg.arg1);
}
}

So the next change will fix the problem. You have to decompile TouchWizCalendar.apk locate com/android/calendar/AlertService$ServiceHandler.smali and search & replace next code.

Search (the last method):

# virtual methods
.method public handleMessage(Landroid/os/Message;)V
.registers 3
.parameter "msg"

.prologue
.line 594
iget-object v0, p0, Lcom/android/calendar/AlertService$ServiceHandler;->this$0:Lcom/android/calendar/AlertService;

invoke-virtual {v0, p1}, Lcom/android/calendar/AlertService;->processMessage(Landroid/os/Message;)V

.line 598
iget-object v0, p0, Lcom/android/calendar/AlertService$ServiceHandler;->this$0:Lcom/android/calendar/AlertService;

invoke-virtual {v0}, Lcom/android/calendar/AlertService;->stopSelf()V

.line 601
return-void
.end method

Replace by:

# virtual methods
.method public handleMessage(Landroid/os/Message;)V
.registers 4
.parameter "msg"

.prologue

iget-object v0, p0, Lcom/android/calendar/AlertService$ServiceHandler;->this$0:Lcom/android/calendar/AlertService;

invoke-virtual {v0, p1}, Lcom/android/calendar/AlertService;->processMessage(Landroid/os/Message;)V

iget-object v0, p0, Lcom/android/calendar/AlertService$ServiceHandler;->this$0:Lcom/android/calendar/AlertService;

iget v1, p1, Landroid/os/Message;->arg1:I

invoke-static {v0, v1}, Lcom/android/calendar/AlertReceiver;->finishStartingService(Landroid/app/Service;I)V

return-void
.end method

Now recompile TouchWizCalendar.apk and replace it.

I've attached a cwm zip file to create a backup (TouchWizCalendar.apk.bak), replace the apk, and clear battery stats to reset wakelocks counters (reset battery stats doesn't affect to SGS2 battery, the battery chip doesn't need that info). The apk is based on kk5 rom.

If you don't want to use the cwm file you can extract TouchWizCalendar.apk from the zip and use root explorer (or similar) to replace the file, don't forget to make a backup of your original apk.

Edit:

If you get:

# virtual methods
.method public handleMessage(Landroid/os/Message;)V
.locals 1
.parameter "msg"
...
...
...

when decompile then replace with

# virtual methods
.method public handleMessage(Landroid/os/Message;)V
.locals 2
.parameter "msg"
...
...
...

Edit2:

If you use odexed rom delete or rename the odex file (maybe com.android.calendar.odex or TouchWizCalendar.odex, I'm not sure) to be sure classes.dex is used from deodexed apk

Edit3:

I've updated the zip to be sure odex file is not used in odexed roms