DROID3XT862 5.6.890 Battery1PercentStepMod v2
Update
11/09/27 originalのBatteryService.smaliとmod版のsmaliファイル置いておきますね。
source(smali)
#海の向こうの人にservices.odexまるパクリされて「俺が作った!」言われてだね…そーいうのやめれ。
イマイチだった部分、BatteryFullStateが95%の段階で発出される件とBatteryピクトの表示がこれまた95%でFull表示される問題の修正を行った。
まず先にピクト表示の件、getIcon methodの修正箇所について
.method private final getIcon(I)I
.locals 5
.parameter "level"
.prologue
.line 526
iget v2, p0, Lcom/android/server/BatteryService;->mBatteryLevel1Step:I
const/16 v3, 0x64
const/16 v4, 0x5
iget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
if-ne v0, v4, :cond_3
if-ge v2, v3, :cond_4
const/16 v0, 0x2
:cond_4
:cond_3
const/4 v1, 0x2
if-ne v0, v1, :cond_0
.line 527
const v0, 0x10802eb
.line 533
:goto_0
return v0
.line 528
:cond_0
iget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
const/4 v1, 0x3
if-eq v0, v1, :cond_1
iget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
const/4 v1, 0x4
if-eq v0, v1, :cond_1
iget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
const/4 v1, 0x5
if-ne v0, v1, :cond_2
.line 531
:cond_1
const v0, 0x10802d5
goto :goto_0
.line 533
:cond_2
const v0, 0x10802f2
goto :goto_0
.end method
BatteryStatusはこんな感じ
BATTERY_STATUS_UNKNOWN = 1/CHARGING = 2/DISCHARGING = 3/NOT_CHARGING = 4/FULL = 5
になっており、上記コードでは
const/4 v1, 0x2
if-ne v0, v1, :cond_0
const v0, 0x10802eb
:goto_0
return v0
:cond_0
の部分が判定式になっとります…v1にBatteryStatus、上のだとCHARGING = 2が入ってその下のif-neで判別。
const v0, 0x10802ebって部分はjavaのコードだと「com.android.internal.R.drawable.stat_sys_battery_charge;」な部分
今回追加で処理を入れたのはこの部分
iget v2, p0, Lcom/android/server/BatteryService;->mBatteryLevel1Step:I
const/16 v3, 0x64
const/16 v4, 0x5
iget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
if-ne v0, v4, :cond_3
if-ge v2, v3, :cond_4
const/16 v0, 0x2
:cond_4
:cond_3
元々はiget v0, p0, Lcom/android/server/BatteryService;->mBatteryStatus:IとmBatteryStatusをv0にぶち込むだけの所なのだがコレに
mBatteryStatusがFullかつmBatteryLevel1Stepが100%未満だったらmBatteryStatusをChargingに置き換えるという処理を入れてる。
次はIntentを投げてるsendIntent
.method private final sendIntent()V
.locals 8
.prologue
.line 397
new-instance v2, Landroid/content/Intent;
const-string v3, "android.intent.action.BATTERY_CHANGED"
invoke-direct {v2, v3}, Landroid/content/Intent;->(Ljava/lang/String;)V
.line 398
.local v2, intent:Landroid/content/Intent;
const/high16 v3, 0x6000
invoke-virtual {v2, v3}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;
.line 401
invoke-direct {p0}, Lcom/android/server/BatteryService;->getBatteryLevel1Step()V
iget v3, p0, Lcom/android/server/BatteryService;->mBatteryLevel1Step:I
invoke-direct {p0, v3}, Lcom/android/server/BatteryService;->getIcon(I)I
move-result v1
.line 403
.local v1, icon:I
const-string v3, "status"
iget v5, p0, Lcom/android/server/BatteryService;->mBatteryLevel1Step:I
const/16 v6, 0x64
const/16 v7, 0x5
iget v4, p0, Lcom/android/server/BatteryService;->mBatteryStatus:I
if-ne v4, v7, :cond_2
if-ge v5, v6, :cond_3
const/16 v4, 0x2
:cond_3
:cond_2
invoke-virtual {v2, v3, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
.line 404
const-string v3, "health"
iget v4, p0, Lcom/android/server/BatteryService;->mBatteryHealth:I
invoke-virtual {v2, v3, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
.line 405
const-string v3, "present"
iget-boolean v4, p0, Lcom/android/server/BatteryService;->mBatteryPresent:Z
invoke-virtual {v2, v3, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Z)Landroid/content/Intent;
.line 406
const-string v3, "level"
iget v4, p0, Lcom/android/server/BatteryService;->mBatteryLevel1Step:I
invoke-virtual {v2, v3, v4}, Landroid/content/Intent;->putExtra(Ljava/lang/String;I)Landroid/content/Intent;
解説面倒くさいからソースから読み取って下さい 糸冬
書き換えてるのは3箇所で、
1)invoke-direct {p0, v3}, Lcom/android/server/BatteryService;->getIcon(I)Iのv3の値を1%stepの値に
2)status投げてる所をさっき書いたBatteryピクトで割り込ませたのと同じ処理させてる
3)levelを1%stepのものに
元ネタはmeyskldとかいう人のこれ
あれ - Motorola Milestone2のBatteryLevelを1%Stepにしてみた
( ó㉨ò)もっとスマートな実装したいっすね…