2011年9月15日木曜日

[update]Motorola Droid3 XT862 Battery1PercentStepMod



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にしてみた


( ó㉨ò)もっとスマートな実装したいっすね…