Related
Hi there, I want to share this tutorial for implementing Top line battery indicator mod.
I have re-made and tweaked (for XWLA4) one of my favourite theme (Dark Theme by Mr. Megi), just to show you how it looks like!
You will find this mod with this theme on the attached zip cwm file - only for deodexed xwla4.
{
"lightbox_close": "Close",
"lightbox_next": "Next",
"lightbox_previous": "Previous",
"lightbox_error": "The requested content cannot be loaded. Please try again later.",
"lightbox_start_slideshow": "Start slideshow",
"lightbox_stop_slideshow": "Stop slideshow",
"lightbox_full_screen": "Full screen",
"lightbox_thumbnails": "Thumbnails",
"lightbox_download": "Download",
"lightbox_share": "Share",
"lightbox_zoom": "Zoom",
"lightbox_new_window": "New window",
"lightbox_toggle_sidebar": "Toggle sidebar"
}
Watch it on youtube fullscreen mode
I started by studying the java source code for handling battery info!
source code -> here
Then i looked into a couple of classes inside SystemUI.apk just to see where i could put my hands..
To better understand the smali code of the classes i modified, i used the java source code here, it is a bit different by the Galaxy S2 implementation but a good start point!
Requirement:
1. Decompiled SystemUI.apk with Apk Manager.
2. Some advanced understanding about editing xml file and smali code.
3. Backup SystemUI.apk first!
Before to start, i'd like to point out that i used XWLA4 firmware as base, but it should work for any firmware with some changes.
Files to be edited in SystemUI.apk:
1. res/layout/status_bar.xml
2. res/values/ids.xml
3. smali/com/android/systemui/statusbar/StatusBarService.smali
4. smali/com/android/systemui/statusbar/StatusBarView.smali
1. Editing SystemUI.apk
1.1 Editing res/layout/status_bar.xml
We need to insert a ViewImage item on the xml for displaying our battery line indicator, normal/charging
Add the following line just above <LinearLayout androidrientation="horizontal" android:id="@id/icons" android:layout_width="fill_parent" android:layout_height="fill_parent">
Code:
<ImageView android:id="@id/battery_indicator_charging" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/battery_indicator_charging" />
2 Edit res/values/ids.xml
We need to add IDs for the item we have added on the status_bar.xml
Add this line at the TOP of the file, this should be the first line!
Code:
<item type="id" name="battery_indicator_charging">false</item>
2.1 Add images to res/drawable-hdpi
We need to add the following 3 images, you will find them attached on my source code!
z_battery_indicator_charging.png
z_battery_indicator.9.png
z_battery_indicator_low.9.png
2.2 Recompile SystemUI.apk
We need to recompile the apk because we need to take care about the ID ref assigned to battery_indicator_charging, and the drawable IDs for images we have added on the previus step.
Now decompile again SystemUI.apk and open res/values/public.xml:
You should see these new entries:
Code:
<public type="drawable" name="z_battery_indicator" id="0x7f0200b8" />
<public type="drawable" name="z_battery_indicator_charging" id="0x7f0200b9" />
<public type="drawable" name="z_battery_indicator_low" id="0x7f0200ba" />
...
<public type="id" name="battery_indicator_charging" id="0x7f0a0034" />
Take note of these 3 IDS: 0x7f0200b8, 0x7f0200ba, 0x7f0a0034
Please note that in your system they can have different values.
3 Editing StatusBarService.smali
We need to intercept addIcon function and when the battery icon is passed as parameter we need to call our function updateBatteryIndicator.
Find this method:
Code:
.method public addIcon(Ljava/lang/String;IILcom/android/internal/statusbar/StatusBarIcon;)V
Add replace it with the code below
Code:
.method public addIcon(Ljava/lang/String;IILcom/android/internal/statusbar/StatusBarIcon;)V
.locals 6
.parameter "slot"
.parameter "index"
.parameter "viewIndex"
.parameter "icon"
.prologue
const-string v5, "battery"
.line 466
new-instance v0, Lcom/android/systemui/statusbar/StatusBarIconView;
invoke-direct {v0, p0, p1}, Lcom/android/systemui/statusbar/StatusBarIconView;-><init>(Landroid/content/Context;Ljava/lang/String;)V
.line 467
.local v0, view:Lcom/android/systemui/statusbar/StatusBarIconView;
invoke-virtual {v0, p4}, Lcom/android/systemui/statusbar/StatusBarIconView;->set(Lcom/android/internal/statusbar/StatusBarIcon;)Z
.line 468
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusIcons:Landroid/widget/LinearLayout;
new-instance v2, Landroid/widget/LinearLayout$LayoutParams;
iget v3, p0, Lcom/android/systemui/statusbar/StatusBarService;->mIconSize:I
iget v4, p0, Lcom/android/systemui/statusbar/StatusBarService;->mIconSize:I
invoke-direct {v2, v3, v4}, Landroid/widget/LinearLayout$LayoutParams;-><init>(II)V
invoke-virtual {v1, v0, p3, v2}, Landroid/widget/LinearLayout;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
invoke-virtual {v5, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_0
.line 410
invoke-direct {p0, p4}, Lcom/android/systemui/statusbar/StatusBarService;->updateBatteryIndicator(Lcom/android/internal/statusbar/StatusBarIcon;)V
.line 469
:cond_0
return-void
.end method
Now we need to do the same for "updateIcon" method. Find this method:
Code:
.method public updateIcon(Ljava/lang/String;IILcom/android/internal/statusbar/StatusBarIcon;Lcom/android/internal/statusbar/StatusBarIcon;)V
Replace it with the code below:
Code:
.method public updateIcon(Ljava/lang/String;IILcom/android/internal/statusbar/StatusBarIcon;Lcom/android/internal/statusbar/StatusBarIcon;)V
.locals 2
.parameter "slot"
.parameter "index"
.parameter "viewIndex"
.parameter "old"
.parameter "icon"
.prologue
.line 477
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusIcons:Landroid/widget/LinearLayout;
invoke-virtual {v1, p3}, Landroid/widget/LinearLayout;->getChildAt(I)Landroid/view/View;
move-result-object v0
check-cast v0, Lcom/android/systemui/statusbar/StatusBarIconView;
.line 478
.local v0, view:Lcom/android/systemui/statusbar/StatusBarIconView;
invoke-virtual {v0, p5}, Lcom/android/systemui/statusbar/StatusBarIconView;->set(Lcom/android/internal/statusbar/StatusBarIcon;)Z
const-string v1, "battery"
invoke-virtual {v1, p1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_0
.line 424
invoke-direct {p0, p5}, Lcom/android/systemui/statusbar/StatusBarService;->updateBatteryIndicator(Lcom/android/internal/statusbar/StatusBarIcon;)V
.line 479
:cond_0
return-void
.end method
It's time to add our method to handle the Update our Battery Indicator!
Code:
.method private updateBatteryIndicator(Lcom/android/internal/statusbar/StatusBarIcon;)V
.locals 2
.parameter "icon"
.prologue
.line 462
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusBarView:Lcom/android/systemui/statusbar/StatusBarView;
iget-object v0, v0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
iget v1, p1, Lcom/android/internal/statusbar/StatusBarIcon;->iconLevel:I
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setTag(Ljava/lang/Object;)V
.line 463
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusBarView:Lcom/android/systemui/statusbar/StatusBarView;
iget-object v0, v0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
iget v1, p1, Lcom/android/internal/statusbar/StatusBarIcon;->iconId:I
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setTag(Ljava/lang/Object;)V
.line 464
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusBarView:Lcom/android/systemui/statusbar/StatusBarView;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarView;->requestLayout()V
.line 465
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarService;->mStatusBarView:Lcom/android/systemui/statusbar/StatusBarView;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarView;->invalidate()V
.line 466
return-void
.end method
Add this code where you prefer!
Note:
We use setTag function to store an useful info: "batteryLevel" inside the two views we created.
4 Editing StatusBarView.smali
Well on this class we need to change a lot of stuff, i advice to see my attached source code and diff it.
To sum up, this is the class responsible to display the status bar view.
We need to instantiate a "BroadcastReceiver" to intercept this intent: "android.intent.action.SCREEN_ON" That's because we don't want to play the charging animation while the screen is off.
I will report, just to let you understand it better, the java pseudo code where the view is created, here we need to do some calculation to get the correct values (width) for our Barline indicator images. In addition we are creating the animation for battery charging state.
Pseudo Java source code:
Code:
protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, int paramInt3, int paramInt4)
{
super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4);
if ((!this.mShowBatteryIndicator))
{
this.mBatteryIndicator.setVisibility(8);
this.mBatteryIndicatorCharging.setVisibility(8);
this.mBatteryIndicatorCharging.clearAnimation();
}
else
{
this.mBatteryIndicator.setVisibility(0);
this.mBatteryIndicatorCharging.setVisibility(0);
int j = ((Integer)this.mBatteryIndicator.getTag()).intValue();
this.mBatteryIndicatorWidth = (j * (paramInt3 - paramInt1) / 100);
this.mBatteryIndicatorCharging.layout(paramInt3, paramInt2, paramInt3 + this.mBatteryIndicatorCharging.getMeasuredWidth(), paramInt2 + this.mBatteryIndicatorCharging.getMeasuredHeight());
int i = BATTERY_INDICATOR_ID;
if ((!this.mScreenIsOn) || (chargeIconID != ((Integer)this.mBatteryIndicatorCharging.getTag()).intValue()))
{
this.mBatteryIndicatorCharging.clearAnimation();
if (j < this.mBatteryLowLevel)
i = LOW_BATTERY_INDICATOR_ID;
}
else
{
TranslateAnimation localTranslateAnimation = new TranslateAnimation(0.0F, this.mBatteryIndicatorWidth - (paramInt3 - paramInt1), 0.0F, 0.0F);
localTranslateAnimation.setDuration(1500L);
localTranslateAnimation.setStartOffset(3500L);
localTranslateAnimation.setRepeatCount(-1);
localTranslateAnimation.setRepeatMode(1);
this.mBatteryIndicatorCharging.startAnimation(localTranslateAnimation);
}
this.mBatteryIndicator.setImageResource(i);
this.mBatteryIndicator.layout(paramInt1, paramInt2, paramInt3, paramInt2 + this.mBatteryIndicator.getDrawable().getIntrinsicHeight());
}
}
Smali code
We need to add new field member to this class: StatusBarView. You can add these lines just below: "# instance fields" at the very top!
Code:
.field mBatteryIndicator:Landroid/widget/ImageView;
.field mBatteryIndicatorCharging:Landroid/widget/ImageView;
.field private mBatteryIndicatorWidth:I
.field private mBatteryLowLevel:I
.field private mShowBatteryIndicator:Z
.field mScreenIsOn:Z
.field mIntentReceiver:Landroid/content/BroadcastReceiver;
Now we need to change the constructor of this class to set values for our field members:
Find this method:
Code:
.method public constructor <init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
and replace with the one below.
Code:
.method public constructor <init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
.locals 1
.parameter "context"
.parameter "attrs"
.prologue
.line 56
invoke-direct {p0, p1, p2}, Landroid/widget/FrameLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
.line 54
const/4 v0, 0x0
iput-boolean v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mScreenIsOn:Z
const/4 v0, 0x1
iput-boolean v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mShowBatteryIndicator:Z
.line 55
new-instance v0, Lcom/android/systemui/statusbar/StatusBarView$1;
invoke-direct {v0, p0}, Lcom/android/systemui/statusbar/StatusBarView$1;-><init>(Lcom/android/systemui/statusbar/StatusBarView;)V
iput-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mIntentReceiver:Landroid/content/BroadcastReceiver;
const v0, 0x1e
iput v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryLowLevel:I
.line 49
const/4 v0, 0x1
iput v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mStatusBarMarqueeDirection:I
.line 50
const/4 v0, 0x0
iput v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mStatusBarMarqueeRange:I
.line 57
return-void
.end method
Please note on the code above this line: const v0, 0x1e, 0x1e = 30, i set the lowbattery threshold to 30% which means that from this point, the battery charging indicator png will be used! Change it as you like!
Now we need to register our receiver for "Screen On" and "Screen Off" intents.
Find the following method
Code:
.method protected onAttachedToWindow()V
Replace with the following:
Code:
.method protected onAttachedToWindow()V
.locals 5
.prologue
.line 76
invoke-super {p0}, Landroid/widget/FrameLayout;->onAttachedToWindow()V
.line 77
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mService:Lcom/android/systemui/statusbar/StatusBarService;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarService;->onBarViewAttached()V
.line 110
new-instance v0, Landroid/content/IntentFilter;
invoke-direct {v0}, Landroid/content/IntentFilter;-><init>()V
.line 111
.local v0, filter:Landroid/content/IntentFilter;
const-string v1, "android.intent.action.SCREEN_OFF"
invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
.line 112
const-string v1, "android.intent.action.SCREEN_ON"
invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
.line 113
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarView;->mContext:Landroid/content/Context;
iget-object v2, p0, Lcom/android/systemui/statusbar/StatusBarView;->mIntentReceiver:Landroid/content/BroadcastReceiver;
const/4 v3, 0x0
new-instance v4, Landroid/os/Handler;
invoke-direct {v4}, Landroid/os/Handler;-><init>()V
invoke-virtual {v1, v2, v0, v3, v4}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
return-void
.end method
At this point we need to add a method that take care of unregister our broadcast receiver. Add the following method where you prefer.
Code:
.method protected onDetachedFromWindow()V
.locals 2
.prologue
.line 127
invoke-super {p0}, Landroid/widget/FrameLayout;->onDetachedFromWindow()V
.line 128
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mContext:Landroid/content/Context;
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarView;->mIntentReceiver:Landroid/content/BroadcastReceiver;
invoke-virtual {v0, v1}, Landroid/content/Context;->unregisterReceiver(Landroid/content/BroadcastReceiver;)V
.line 130
return-void
.end method
Let's add a new method responsible for clipping our battery indicator png image based on the current value of mBatteryIndicatorWidth field (i.e the current level)
Code:
.method public onDraw(Landroid/graphics/Canvas;)V
.locals 4
.parameter "canvas"
.prologue
.line 224
iget-boolean v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mShowBatteryIndicator:Z
if-eqz v0, :cond_0
.line 225
invoke-virtual {p1}, Landroid/graphics/Canvas;->save()I
.line 226
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v0}, Landroid/widget/ImageView;->getLeft()I
move-result v0
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v1}, Landroid/widget/ImageView;->getTop()I
move-result v1
iget v2, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorWidth:I
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v3}, Landroid/widget/ImageView;->getBottom()I
move-result v3
invoke-virtual {p1, v0, v1, v2, v3}, Landroid/graphics/Canvas;->clipRect(IIII)Z
.line 231
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v0, p1}, Landroid/widget/ImageView;->draw(Landroid/graphics/Canvas;)V
.line 232
invoke-virtual {p1}, Landroid/graphics/Canvas;->restore()V
.line 234
:cond_0
invoke-super {p0, p1}, Landroid/widget/FrameLayout;->onDraw(Landroid/graphics/Canvas;)V
.line 235
return-void
.end method
4.1 Create a new smali file: StatusBarView$1.smali
Copy the following code in your file, and save it in smali/com/android/systemui/statusbar/
Code:
.method constructor <init>(Lcom/android/systemui/statusbar/StatusBarView;)V
.locals 0
.parameter
.prologue
.line 60
iput-object p1, p0, Lcom/android/systemui/statusbar/StatusBarView$1;->this$0:Lcom/android/systemui/statusbar/StatusBarView;
invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V
return-void
.end method
# virtual methods
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.locals 3
.parameter "context"
.parameter "intent"
.prologue
.line 63
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView$1;->this$0:Lcom/android/systemui/statusbar/StatusBarView;
const-string v1, "android.intent.action.SCREEN_ON"
invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v2
invoke-virtual {v1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
iput-boolean v1, v0, Lcom/android/systemui/statusbar/StatusBarView;->mScreenIsOn:Z
.line 64
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView$1;->this$0:Lcom/android/systemui/statusbar/StatusBarView;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarView;->requestLayout()V
.line 65
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView$1;->this$0:Lcom/android/systemui/statusbar/StatusBarView;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarView;->invalidate()V
.line 66
return-void
.end method
Now replace the methods: "onAttachedToWindow" with the code below:
Code:
.method protected onAttachedToWindow()V
.locals 5
.prologue
.line 76
invoke-super {p0}, Landroid/widget/FrameLayout;->onAttachedToWindow()V
.line 77
iget-object v0, p0, Lcom/android/systemui/statusbar/StatusBarView;->mService:Lcom/android/systemui/statusbar/StatusBarService;
invoke-virtual {v0}, Lcom/android/systemui/statusbar/StatusBarService;->onBarViewAttached()V
.line 110
new-instance v0, Landroid/content/IntentFilter;
invoke-direct {v0}, Landroid/content/IntentFilter;-><init>()V
.line 111
.local v0, filter:Landroid/content/IntentFilter;
const-string v1, "android.intent.action.SCREEN_OFF"
invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
.line 112
const-string v1, "android.intent.action.SCREEN_ON"
invoke-virtual {v0, v1}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
.line 113
iget-object v1, p0, Lcom/android/systemui/statusbar/StatusBarView;->mContext:Landroid/content/Context;
iget-object v2, p0, Lcom/android/systemui/statusbar/StatusBarView;->mIntentReceiver:Landroid/content/BroadcastReceiver;
const/4 v3, 0x0
new-instance v4, Landroid/os/Handler;
invoke-direct {v4}, Landroid/os/Handler;-><init>()V
invoke-virtual {v1, v2, v0, v3, v4}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;
return-void
.end method
Almost finished , now we need to modify the method "onLayout":
search for this line: return-void and replace with goto :goto_3 then add the following code just belowe this line: goto :goto_0
Code:
:goto_3
const/4 v4, 0x0
iget-boolean v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mShowBatteryIndicator:Z
if-eqz v3, :cond_3
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v3, v4}, Landroid/widget/ImageView;->setVisibility(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3, v4}, Landroid/widget/ImageView;->setVisibility(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v3}, Landroid/widget/ImageView;->getTag()Ljava/lang/Object;
move-result-object v3
check-cast v3, Ljava/lang/Integer;
invoke-virtual {v3}, Ljava/lang/Integer;->intValue()I
move-result v2
.local v2, batteryLevel:I
sub-int v3, p4, p2
mul-int/2addr v3, v2
div-int/lit8 v3, v3, 0x64
iput v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorWidth:I
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
iget-object v4, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v4}, Landroid/widget/ImageView;->getMeasuredWidth()I
move-result v4
add-int/2addr v4, p4
iget-object v5, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v5}, Landroid/widget/ImageView;->getMeasuredHeight()I
move-result v5
add-int/2addr v5, p3
invoke-virtual {v3, p4, p3, v4, v5}, Landroid/widget/ImageView;->layout(IIII)V
const v1, 0x7f0200b8
.local v1, batteryIndicatorDrawableId:I
iget-boolean v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mScreenIsOn:Z
if-eqz v3, :cond_4
const v4, 0x10802c3
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3}, Landroid/widget/ImageView;->getTag()Ljava/lang/Object;
move-result-object v3
check-cast v3, Ljava/lang/Integer;
invoke-virtual {v3}, Ljava/lang/Integer;->intValue()I
move-result v3
if-eq v4, v3, :cond_4
new-instance v0, Landroid/view/animation/TranslateAnimation;
iget v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorWidth:I
sub-int v4, p4, p2
sub-int/2addr v3, v4
int-to-float v3, v3
invoke-direct {v0, v6, v3, v6, v6}, Landroid/view/animation/TranslateAnimation;-><init>(FFFF)V
.local v0, animation:Landroid/view/animation/TranslateAnimation;
const-wide/16 v3, 0x5dc
invoke-virtual {v0, v3, v4}, Landroid/view/animation/TranslateAnimation;->setDuration(J)V
const-wide/16 v3, 0xdac
invoke-virtual {v0, v3, v4}, Landroid/view/animation/TranslateAnimation;->setStartOffset(J)V
const/4 v3, -0x1
invoke-virtual {v0, v3}, Landroid/view/animation/TranslateAnimation;->setRepeatCount(I)V
const/4 v3, 0x1
invoke-virtual {v0, v3}, Landroid/view/animation/TranslateAnimation;->setRepeatMode(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3, v0}, Landroid/widget/ImageView;->startAnimation(Landroid/view/animation/Animation;)V
.end local v0 #animation:Landroid/view/animation/TranslateAnimation;
:cond_5
:goto_2
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v3, v1}, Landroid/widget/ImageView;->setImageResource(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
iget-object v4, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v4}, Landroid/widget/ImageView;->getDrawable()Landroid/graphics/drawable/Drawable;
move-result-object v4
invoke-virtual {v4}, Landroid/graphics/drawable/Drawable;->getIntrinsicHeight()I
move-result v4
add-int/2addr v4, p3
invoke-virtual {v3, p2, p3, p4, v4}, Landroid/widget/ImageView;->layout(IIII)V
.end local v1 #batteryIndicatorDrawableId:I
.end local v2 #batteryLevel:I
:goto_1
return-void
.restart local v1 #batteryIndicatorDrawableId:I
.restart local v2 #batteryLevel:I
:cond_4
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3}, Landroid/widget/ImageView;->clearAnimation()V
iget v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryLowLevel:I
if-ge v2, v3, :cond_5
const v1, 0x7f0200ba
goto :goto_2
.end local v1 #batteryIndicatorDrawableId:I
.end local v2 #batteryLevel:I
:cond_3
const/16 v5, 0x8
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicator:Landroid/widget/ImageView;
invoke-virtual {v3, v5}, Landroid/widget/ImageView;->setVisibility(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3, v5}, Landroid/widget/ImageView;->setVisibility(I)V
iget-object v3, p0, Lcom/android/systemui/statusbar/StatusBarView;->mBatteryIndicatorCharging:Landroid/widget/ImageView;
invoke-virtual {v3}, Landroid/widget/ImageView;->clearAnimation()V
goto :goto_1
.end method
Finally, we need to adjust values to match our Ref ID (drawable images and battery_indicator ID)
chargeIconID in my pseudo code is used to verify if the phone is charging, in my attached source code you will see the line below
The following value (inside onLayout method) is used to verify if the phone is charging.
const v6, 0x10802c3
Decompile framework-res.apk and open /res/values/public.xml, search for this string: name="stat_sys_battery_charge"
Code:
<public type="drawable" name="stat_sys_battery_charge" id="0x10802c3" />
Make sure that the id you are using match with that value!
Now we need to take care about one ID used by onFinishInflate method:
const v1, 0x7f0a0034
need to match with our ID in res/values/public.xml
<public type="id" name="battery_indicator_charging" id="0x7f0a0034" />
The same for the method onLayout but this time we need to take care about 2 IDs:
const v1, 0x7f0200b8
<public type="drawable" name="z_battery_indicator" id="0x7f0200b8" />
const v1, 0x7f0200ba
<public type="drawable" name="z_battery_indicator_low" id="0x7f0200ba" />
Hope this helps you guys!
nice! thank you
Good work Leo.
I will try to port it to ICS .
nice work, but who is SanX and what has he cracked? lol
Congratulations for this very detailed howto! Just a thought: MIUI has this by default, you'll most probably take less time flashing MIUI than applying these mods!
thunderteaser said:
Congratulations for this very detailed howto! Just a thought: MIUI has this by default, you'll most probably take less time flashing MIUI than applying these mods!
Click to expand...
Click to collapse
It's for the devs, not regular users
I've been using the application onibar which does this really well as its an overlay.
Sent from my GT-I9100 using xda premium
Are there any advantages compared to this?
xethor said:
Are there any advantages compared to this?
Click to expand...
Click to collapse
Well if you go with the OP approach then you don't need the app. From an end user the app you linked to is fine. For devs however this can be integrated and forgo the need for the app altogether.
Tomorrow i will update this tutorial as i have made another mod that uses png for battery line indicator, it's much better since themer can change color, trasparency,..
xethor said:
Are there any advantages compared to this?
Click to expand...
Click to collapse
Yes, that applications start a background service that poll battery info, it will drain your battery..
Also this application doesn't animate the battery indicator while charging.
The mod i post instead is built in on the systemUI statusbar service!
In addition, with this mod (it will be updated tomorrow) it is also possible to change png for battery line indicator, not just the color as the app you mentioned!
Hey Leo, will this be implemented in CheckROM RevoHD™ V4 and future versions?Or at least given as a MOD in the kitchen?
Hollow.Droid said:
It's for the devs, not regular users
Click to expand...
Click to collapse
But it's so well written and clear! I guess a user could do this, that's why I'm talking just about time.
Hi Leo !
Will you make it as a script and we just need to flash it ?
Pleaseeeee...
joezy07 said:
Hi Leo !
Will you make it as a script and we just need to flash it ?
Pleaseeeee...
Click to expand...
Click to collapse
Yes please in ICS blue too!!!!!!!!!!!!!!!!!!!!!!
sorry. i just flashd Intratech's Frankenstein LA4. it has the top battery line indicator. did he already implement this.?
what is the diff from this ?
what is different from this Leo? thanks
mariosraptor said:
what is different from this Leo? thanks
Click to expand...
Click to collapse
see the post a few ones back... it drains the battery more... and also the charging is not animated in the market app
Yes, that applications start a background service that poll battery info, it will drain your battery..
Also this application doesn't animate the battery indicator while charging.
The mod i post instead is built in on the systemUI statusbar service!
In addition, with this mod (it will be updated tomorrow) it is also possible to change png for battery line indicator, not just the color as the app you mentioned!
Click to expand...
Click to collapse
seriously awesome....
I have updated the OP, now this mod uses png images, it's much better since themers can change the aspect of these bars without any effort.
Hi there, since i'm on Xperia Ray but the devs is not many there, i think i'll post this on Arc's.
My Suspicion is that SE already had embed the Rotation Animation, but apparently turned off now. Why can i say that?
1. In android.policy\com\android\internal\policy\impl\PhoneWindowManager.smali there is a flag called fancy_rotation_anim. The code is like this:
Code:
.line 631
const-string v12, "fancy_rotation_anim"
const/4 v13, 0x0
invoke-static {v8, v12, v13}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v12
if-eqz v12, :cond_f0
const/16 v12, 0x80
:goto_29
iput v12, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I
2. in android.policy\com\android\internal\policy\impl\PhoneWindowManager$MyOrientationListener.smali there's a code like this:
Code:
# virtual methods
.method public onOrientationChanged(I)V
.registers 5
.parameter "rotation"
.prologue
.line 365
:try_start_0
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mWindowManager:Landroid/view/IWindowManager;
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
[B] iget v2, v2, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I[/B]
invoke-interface {v0, p1, v1, v2}, Landroid/view/IWindowManager;->setRotation(IZI)V
:try_end_c
.catch Landroid/os/RemoteException; {:try_start_0 .. :try_end_c} :catch_d
.line 371
:goto_c
return-void
.line 367
:catch_d
move-exception v0
goto :goto_c
.end method
Now i had a modified Settings.apk to insert Setting$System config named "fancy_rotation_anim" when the Animation is updated. But unfortunately it doesn't do anything. Can any devs that's more experienced than me can investigate this? Thanks
And sorry if this thread has existed before. If yes, please mod close this thread thanks.
cm7 latest version has this fancy rotation animation like ics,i already search all over internet for this thing but they said its not available for gb,just for ics,and i dont know how cm7 has this(really shock me),maybe you can ask cm's dev for an answer,or maybe you can look inside cm7 for little clue on how they do it..
Sent from my LT18i
try this
hey mate try this
change this part
Code:
.line 631
const-string v12, "fancy_rotation_anim"
const/4 v13, 0x0
invoke-static {v8, v12, v13}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v12
[B]if-eqz v12, :cond_f0[/B]
const/16 v12, 0x80
:goto_29
to read this
(remove the part i bolded above)
Code:
.line 631
const-string v12, "fancy_rotation_anim"
const/4 v13, 0x0
invoke-static {v8, v12, v13}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v12
const/16 v12, 0x80
:goto_29
that bypasses the check and (i think) enables the animation (if it is there)
it could cause a crash if the rest of the animation is not there.
if it does crash grab the log output and post it here.
i'll take a look.
rashid.fairus said:
cm7 latest version has this fancy rotation animation like ics,i already search all over internet for this thing but they said its not available for gb,just for ics,and i dont know how cm7 has this(really shock me),maybe you can ask cm's dev for an answer,or maybe you can look inside cm7 for little clue on how they do it..
Sent from my LT18i
Click to expand...
Click to collapse
It uses another libsurfinger and libsurfinger-client which support that type of animation. In SS phone, just copy those libs and it works.
The new Motoblur has it, Sense 3 has it, Samsung has it and CM7 has it. There must be a way to get it. =)
pvyParts said:
hey mate try this
change this part
Code:
.line 631
const-string v12, "fancy_rotation_anim"
const/4 v13, 0x0
invoke-static {v8, v12, v13}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v12
[B]if-eqz v12, :cond_f0[/B]
const/16 v12, 0x80
:goto_29
to read this
(remove the part i bolded above)
Code:
.line 631
const-string v12, "fancy_rotation_anim"
const/4 v13, 0x0
invoke-static {v8, v12, v13}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v12
const/16 v12, 0x80
:goto_29
that bypasses the check and (i think) enables the animation (if it is there)
it could cause a crash if the rest of the animation is not there.
if it does crash grab the log output and post it here.
i'll take a look.
Click to expand...
Click to collapse
Hi, thanks for that. Actually I already tried to alter settings.apk so it store fancy_rotate_anim when animation setting is set. In the logcat the window manager does report that animflags is set to 128 (0x80) like the one set above. But nothing happens.
Sent from my ST18i using XDA App
silveraero said:
It uses another libsurfinger and libsurfinger-client which support that type of animation. In SS phone, just copy those libs and it works.
Click to expand...
Click to collapse
One question, what is SS? Samsung? :-/
Sent from my ST18i using XDA App
Interesting thing I found here regarding Orientation
I grabbed PhoneWindowManager$MyOrientationListener.smali file from HTC android.policy.jar on 2.3.4 and Compared it with Sony SE.. They are mostly Identical but some Lines missing and slightly changed numbers in HTC's file..
In SE its Like This
(Check the BOLD RED Lines..they are missing or changed in HTC's file)
Code:
# direct methods
.method constructor <init>(Lcom/android/internal/policy/impl/PhoneWindowManager;Landroid/content/Context;)V
.locals 0
.parameter
.parameter "context"
.prologue
.line [B][COLOR="Red"]468[/COLOR][/B]
iput-object p1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
.line [B][COLOR="Red"]469[/COLOR][/B]
invoke-direct {p0, p2}, Landroid/view/WindowOrientationListener;-><init>(Landroid/content/Context;)V
.line [B][COLOR="Red"]470[/COLOR][/B]
return-void
.end method
# virtual methods
.method public onOrientationChanged(I)V
.locals 3
.parameter "rotation"
.prologue
[COLOR="Red"][B].line 477
const-string v0, "WindowManager"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "onOrientationChanged, rotation changed to "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
.line 480[/B][/COLOR]
:try_start_0
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mWindowManager:Landroid/view/IWindowManager;
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget v2, v2, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I
invoke-interface {v0, p1, v1, v2}, Landroid/view/IWindowManager;->setRotation(IZI)V
:try_end_0
.catch Landroid/os/RemoteException; {:try_start_0 .. :try_end_0} :catch_0
.line [B][COLOR="Red"]486[/COLOR][/B]
:goto_0
return-void
.line [B][COLOR="Red"]482[/COLOR][/B]
:catch_0
move-exception v0
goto :goto_0
.end method
NOW CHECK IN HTC's file
Code:
# direct methods
.method constructor <init>(Lcom/android/internal/policy/impl/PhoneWindowManager;Landroid/content/Context;)V
.locals 0
.parameter
.parameter "context"
.prologue
.line 438
iput-object p1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
.line 439
invoke-direct {p0, p2}, Landroid/view/WindowOrientationListener;-><init>(Landroid/content/Context;)V
.line 440
return-void
.end method
# virtual methods
.method public onOrientationChanged(I)V
.locals 3
.parameter "rotation"
.prologue
.line 447
:try_start_0
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mWindowManager:Landroid/view/IWindowManager;
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget v2, v2, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I
invoke-interface {v0, p1, v1, v2}, Landroid/view/IWindowManager;->setRotation(IZI)V
:try_end_0
.catch Landroid/os/RemoteException; {:try_start_0 .. :try_end_0} :catch_0
.line 453
:goto_0
return-void
.line 449
:catch_0
move-exception v0
goto :goto_0
.end method
I modded the HTC one to fit the SE lines, named it HTCModdedforSE.zip and attached it for testing.. ont have my SE now...
But just incase I attached the whole android.policy.jar file from HTC Sensation.. You can fully replace SE with HTC one without modding.. maybe that works out...
Give it a go..
hansip87 said:
One question, what is SS? Samsung? :-/
Sent from my ST18i using XDA App
Click to expand...
Click to collapse
Yes, a guy there copied from Galaxy Note and it works perfect without problem. Maybe different with SE.
Sent from my X10i using XDA Premium App
@jjdoctor
will try your modded zip and give feedback,maybe SE will get angry with you mate
from my ARC
jjdoctor said:
Interesting thing I found here regarding Orientation
I grabbed PhoneWindowManager$MyOrientationListener.smali file from HTC android.policy.jar on 2.3.4 and Compared it with Sony SE.. They are mostly Identical but some Lines missing and slightly changed numbers in HTC's file..
In SE its Like This
(Check the BOLD RED Lines..they are missing or changed in HTC's file)
Code:
# direct methods
.method constructor <init>(Lcom/android/internal/policy/impl/PhoneWindowManager;Landroid/content/Context;)V
.locals 0
.parameter
.parameter "context"
.prologue
.line [B][COLOR="Red"]468[/COLOR][/B]
iput-object p1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
.line [B][COLOR="Red"]469[/COLOR][/B]
invoke-direct {p0, p2}, Landroid/view/WindowOrientationListener;-><init>(Landroid/content/Context;)V
.line [B][COLOR="Red"]470[/COLOR][/B]
return-void
.end method
# virtual methods
.method public onOrientationChanged(I)V
.locals 3
.parameter "rotation"
.prologue
[COLOR="Red"][B].line 477
const-string v0, "WindowManager"
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "onOrientationChanged, rotation changed to "
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
.line 480[/B][/COLOR]
:try_start_0
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mWindowManager:Landroid/view/IWindowManager;
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget v2, v2, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I
invoke-interface {v0, p1, v1, v2}, Landroid/view/IWindowManager;->setRotation(IZI)V
:try_end_0
.catch Landroid/os/RemoteException; {:try_start_0 .. :try_end_0} :catch_0
.line [B][COLOR="Red"]486[/COLOR][/B]
:goto_0
return-void
.line [B][COLOR="Red"]482[/COLOR][/B]
:catch_0
move-exception v0
goto :goto_0
.end method
NOW CHECK IN HTC's file
Code:
# direct methods
.method constructor <init>(Lcom/android/internal/policy/impl/PhoneWindowManager;Landroid/content/Context;)V
.locals 0
.parameter
.parameter "context"
.prologue
.line 438
iput-object p1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
.line 439
invoke-direct {p0, p2}, Landroid/view/WindowOrientationListener;-><init>(Landroid/content/Context;)V
.line 440
return-void
.end method
# virtual methods
.method public onOrientationChanged(I)V
.locals 3
.parameter "rotation"
.prologue
.line 447
:try_start_0
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mWindowManager:Landroid/view/IWindowManager;
const/4 v1, 0x0
iget-object v2, p0, Lcom/android/internal/policy/impl/PhoneWindowManager$MyOrientationListener;->this$0:Lcom/android/internal/policy/impl/PhoneWindowManager;
iget v2, v2, Lcom/android/internal/policy/impl/PhoneWindowManager;->mFancyRotationAnimation:I
invoke-interface {v0, p1, v1, v2}, Landroid/view/IWindowManager;->setRotation(IZI)V
:try_end_0
.catch Landroid/os/RemoteException; {:try_start_0 .. :try_end_0} :catch_0
.line 453
:goto_0
return-void
.line 449
:catch_0
move-exception v0
goto :goto_0
.end method
I modded the HTC one to fit the SE lines, named it HTCModdedforSE.zip and attached it for testing.. ont have my SE now...
But just incase I attached the whole android.policy.jar file from HTC Sensation.. You can fully replace SE with HTC one without modding.. maybe that works out...
Give it a go..
Click to expand...
Click to collapse
the line code that SE have is just for logging purpose, nothing essential mate.
hansip87 said:
the line code that SE have is just for logging purpose, nothing essential mate.
Click to expand...
Click to collapse
As i scan all the code, it is actually depends on native function which resides on libsurfaceflinger.so. So no mod can be done about that unless somebody can crack the .so file. Case closed, thanks for the input.
when you do this hack, you can sign a system applications, with fully working.
Just for Samsung Gingerbread Roms
1- *BakSmali the " Services.jar "
Located into /system/framework/ folder
Click to expand...
Click to collapse
2- Open the PackageManagerService.smali file via notepad++
3- Find this method ,
Code:
[B].method checkSignaturesLP([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I[/B]
every method will start with .method and will ends with .end method texts.
Click to expand...
Click to collapse
4- Replace the current method with this method,
Code:
.method checkSignaturesLP([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
.registers 10
.parameter "s1"
.parameter "s2"
.prologue
.line 1927
const/4 v6, 0x0
return v6
if-nez p1, :cond_a
.line 1928
if-nez p2, :cond_8
const/4 v6, 0x1
.line 1947
:goto_7
return v6
.line 1928
:cond_8
const/4 v6, -0x1
goto :goto_7
.line 1932
:cond_a
if-nez p2, :cond_e
.line 1933
const/4 v6, -0x2
goto :goto_7
.line 1935
:cond_e
new-instance v3, Ljava/util/HashSet;
invoke-direct {v3}, Ljava/util/HashSet;-><init>()V
.line 1936
.local v3, set1:Ljava/util/HashSet;,"Ljava/util/HashSet<Landroid/content/pm/Signature;>;"
move-object v0, p1
.local v0, arr$:[Landroid/content/pm/Signature;
array-length v2, v0
.local v2, len$:I
const/4 v1, 0x0
.local v1, i$:I
:goto_16
if-ge v1, v2, :cond_20
aget-object v5, v0, v1
.line 1937
.local v5, sig:Landroid/content/pm/Signature;
invoke-virtual {v3, v5}, Ljava/util/HashSet;->add(Ljava/lang/Object;)Z
.line 1936
add-int/lit8 v1, v1, 0x1
goto :goto_16
.line 1939
.end local v5 #sig:Landroid/content/pm/Signature;
:cond_20
new-instance v4, Ljava/util/HashSet;
invoke-direct {v4}, Ljava/util/HashSet;-><init>()V
.line 1940
.local v4, set2:Ljava/util/HashSet;,"Ljava/util/HashSet<Landroid/content/pm/Signature;>;"
move-object v0, p2
array-length v2, v0
const/4 v1, 0x0
:goto_28
if-ge v1, v2, :cond_32
aget-object v5, v0, v1
.line 1941
.restart local v5 #sig:Landroid/content/pm/Signature;
invoke-virtual {v4, v5}, Ljava/util/HashSet;->add(Ljava/lang/Object;)Z
.line 1940
add-int/lit8 v1, v1, 0x1
goto :goto_28
.line 1944
.end local v5 #sig:Landroid/content/pm/Signature;
:cond_32
invoke-virtual {v3, v4}, Ljava/util/HashSet;->equals(Ljava/lang/Object;)Z
move-result v6
if-eqz v6, :cond_3a
.line 1945
const/4 v6, 0x0
goto :goto_7
.line 1947
:cond_3a
const/4 v6, -0x3
goto :goto_7
.end method
5- Save the PackageManagerService.smali file.
6- do **Smali for the folder , and copy the modded services.jar file into your phone.
----------------------------
* Baksmali : decompiling the dex files
** Smali : recompiling the dex files
------------------------------
External Links:
Original thread
# 2
Click to expand...
Click to collapse
----------------------------------
Credits:
Code:
LOTR TEAM
Music Skip Mod for JB
Credits to Mirko DDD in i9100 thread for the original guide for this.
Android.policy.jar changes
Add attached files to:
com/android/internal/policy/impl/
Smali edit:
com/android/internal/policy/impl/PhoneWindowManager.smali
Before:
Code:
.field private mIsVisibleSPenGestureView:Z
.field mKeyboardTapVibePattern:[J
After:
Code:
.field private mIsVisibleSPenGestureView:Z
[COLOR="Red"].field mIsVolumeAction:Z
.field mIsVolumeBlocking:Z
[/COLOR]
.field mKeyboardTapVibePattern:[J
Before:
Code:
.field private mVolumeDownKeyTriggered:Z
.field private final mVolumeKeyLongPressforOneTouchReport:Ljava/lang/Runnable;
After:
Code:
.field private mVolumeDownKeyTriggered:Z
[COLOR="Red"].field mVolumeDownLongPress:Ljava/lang/Runnable;[/COLOR]
.field private final mVolumeKeyLongPressforOneTouchReport:Ljava/lang/Runnable;
Before:
[CODE .line 7619
new-instance v0, Lcom/android/internal/policy/impl/PhoneWindowManager$35;
invoke-direct {v0, p0}, Lcom/android/internal/policy/impl/PhoneWindowManager$35;-><init>(Lcom/android/internal/policy/impl/PhoneWindowManagerV
iput-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mScreenLockTimeout:Ljava/lang/Runnable;
.line 8566
return-void
.end method][/CODE]
After:
Code:
.line 7619
new-instance v0, Lcom/android/internal/policy/impl/PhoneWindowManager$35;
invoke-direct {v0, p0}, Lcom/android/internal/policy/impl/PhoneWindowManager$35;-><init>(Lcom/android/internal/policy/impl/PhoneWindowManager;)V
iput-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mScreenLockTimeout:Ljava/lang/Runnable;
[COLOR="Red"] .line 8130
new-instance v0, Lcom/android/internal/policy/impl/PhoneWindowManager$SkipNext;
invoke-direct {v0, p0}, Lcom/android/internal/policy/impl/PhoneWindowManager$SkipNext;-><init>(Lcom/android/internal/policy/impl/PhoneWindowManager;)V
iput-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeUpLongPress:Ljava/lang/Runnable;
.line 8131
new-instance v0, Lcom/android/internal/policy/impl/PhoneWindowManager$SkipPrev;
invoke-direct {v0, p0}, Lcom/android/internal/policy/impl/PhoneWindowManager$SkipPrev;-><init>(Lcom/android/internal/policy/impl/PhoneWindowManager;)V
iput-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeDownLongPress:Ljava/lang/Runnable;
[/COLOR]
.line 8566
return-void
.end method
Before:
Code:
.method handleVolumeKey(II)V
.registers 8
.parameter "stream"
.parameter "keycode"
.prologue
.line 5724
invoke-static {}, Lcom/android/internal/policy/impl/PhoneWindowManager;->getAudioService()Landroid/media/IAudioService;
move-result-object v0
.line 5725
.local v0, audioService:Landroid/media/IAudioService;
if-nez v0, :cond_7
.line 5750
:goto_0
return-void
After:
Code:
.method handleVolumeKey(II)V
.registers 8
.parameter "stream"
.parameter "keycode"
.prologue
.line 5724
[COLOR="Red"]move-object/from16 v0, p0
iget-boolean v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeBlocking:Z
if-nez v0, :cond_c[/COLOR]
invoke-static {}, Lcom/android/internal/policy/impl/PhoneWindowManager;->getAudioService()Landroid/media/IAudioService;
move-result-object v0
.line 5725
.local v0, audioService:Landroid/media/IAudioService;
if-nez v0, :cond_7
.line 5750
[COLOR="Red"]:cond_c[/COLOR]
:goto_0
return-void
New method. Insert right above:
.method public hasNavigationBar()Z
Code:
[COLOR="Red"].method handleVolumeLongPress(I)V
.registers 6
.parameter "keycode"
.prologue
const/4 v1, 0x1
move-object/from16 v0, p0
iput-boolean v1, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeBlocking:Z
const/4 v1, 0x0
iput-boolean v1, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeAction:Z
const/16 v1, 0x18
if-ne p1, v1, :cond_19
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeUpLongPress:Ljava/lang/Runnable;
.local v0, btnHandler:Ljava/lang/Runnable;
:goto_e
iget-object v1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mHandler:Landroid/os/Handler;
invoke-static {}, Landroid/view/ViewConfiguration;->getTapTimeout()I
move-result v2
int-to-long v2, v2
invoke-virtual {v1, v0, v2, v3}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z
return-void
.end local v0 #btnHandler:Ljava/lang/Runnable;
:cond_19
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeDownLongPress:Ljava/lang/Runnable;
.restart local v0 #btnHandler:Ljava/lang/Runnable;
goto :goto_e
.end method
.method handleVolumeLongPressAbort()V
.registers 3
.prologue
const/4 v1, 0x0
move-object/from16 v0, p0
iput-boolean v1, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeBlocking:Z
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mHandler:Landroid/os/Handler;
iget-object v1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeUpLongPress:Ljava/lang/Runnable;
invoke-virtual {v0, v1}, Landroid/os/Handler;->removeCallbacks(Ljava/lang/Runnable;)V
iget-object v0, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mHandler:Landroid/os/Handler;
iget-object v1, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mVolumeDownLongPress:Ljava/lang/Runnable;
invoke-virtual {v0, v1}, Landroid/os/Handler;->removeCallbacks(Ljava/lang/Runnable;)V
return-void
.end method
[/COLOR]
.method public hasNavigationBar()Z
Before:
Code:
.line 6215
:cond_46b
:goto_46b
if-eqz v5, :cond_547
After:
Code:
.line 6215
:cond_46b
:goto_46b
[COLOR="Red"]if-eqz v5, :cond_55a[/COLOR]
Before:
Code:
.line 6297
.end local v6 #ex:Landroid/os/RemoteException;
:cond_514
move-object/from16 v0, p0
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mSamsungVolumeControlThread:Lcom/android/internal/policy/impl/PhoneWindowManager$SamsungVolumeControlThread;
move-object/from16 v29, v0
if-nez v29, :cond_6a
After:
Code:
.line 6297
.end local v6 #ex:Landroid/os/RemoteException;
:cond_514
move-object/from16 v0, p0
[COLOR="Red"] iget-boolean v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mScreenOnEarly:Z
if-nez v0, :cond_new
invoke-virtual/range {p0 .. p0}, Lcom/android/internal/policy/impl/PhoneWindowManager;->isMusicActive()Z
move-result v26
if-eqz v26, :cond_new
move-object/from16 v0, p0
move/from16 v14, v18
invoke-virtual {v0, v14}, Lcom/android/internal/policy/impl/PhoneWindowManager;->handleVolumeLongPress(I)V
:cond_new
move-object/from16 v0, p0
[/COLOR]
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mSamsungVolumeControlThread:Lcom/android/internal/policy/impl/PhoneWindowManager$SamsungVolumeControlThread;
move-object/from16 v29, v0
if-nez v29, :cond_6a
Before:
Code:
.line 6305
.end local v26 #telephonyService:Lcom/android/internal/telephony/ITelephony;
.end local v28 #voipInterfaceService:Landroid/os/IVoIPInterface;
:cond_547
move-object/from16 v0, p0
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mSamsungVolumeControlThread:Lcom/android/internal/policy/impl/PhoneWindowManager$SamsungVolumeControlThread;
move-object/from16 v29, v0
if-eqz v29, :cond_6a
After:
Code:
.line 6305
.end local v26 #telephonyService:Lcom/android/internal/telephony/ITelephony;
.end local v28 #voipInterfaceService:Landroid/os/IVoIPInterface;
[COLOR="Red"]:cond_55a
[/COLOR] [COLOR="Red"]if-nez v5, :cond_ko
move-object/from16 v0, p0
iget-boolean v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeBlocking:Z
if-eqz v0, :cond_ko
invoke-virtual/range {p0 .. p0}, Lcom/android/internal/policy/impl/PhoneWindowManager;->handleVolumeLongPressAbort()V
move-object/from16 v0, p0
iget-boolean v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeAction:Z
if-nez v0, :cond_ko
move-object/from16 v0, p0
const/4 v3, 0x0
move/from16 v14, v18
invoke-virtual {v0, v3, v14}, Lcom/android/internal/policy/impl/PhoneWindowManager;->handleVolumeKey(II)V
:cond_ko[/COLOR]
move-object/from16 v0, p0
iget-object v0, v0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mSamsungVolumeControlThread:Lcom/android/internal/policy/impl/PhoneWindowManager$SamsungVolumeControlThread;
move-object/from16 v29, v0
if-eqz v29, :cond_6a
New method. Insert right above:
.method sendCloseSystemWindows(Ljava/lang/StringV
Code:
[COLOR="Red"].method protected sendMediaButtonEvent(I)V
.registers 15
.parameter "code"
.prologue
invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J
move-result-wide v1
.local v1, eventtime:J
new-instance v11, Landroid/content/Intent;
const-string v4, "android.intent.action.MEDIA_BUTTON"
const/4 v5, 0x0
invoke-direct {v11, v4, v5}, Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V
.local v11, downIntent:Landroid/content/Intent;
new-instance v0, Landroid/view/KeyEvent;
const/4 v5, 0x0
const/4 v7, 0x0
move-wide v3, v1
move v6, p1
invoke-direct/range {v0 .. v7}, Landroid/view/KeyEvent;-><init>(JJIII)V
.local v0, downEvent:Landroid/view/KeyEvent;
const-string v4, "android.intent.extra.KEY_EVENT"
invoke-virtual {v11, v4, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;
iget-object v4, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context;
const/4 v5, 0x0
invoke-virtual {v4, v11, v5}, Landroid/content/Context;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
new-instance v12, Landroid/content/Intent;
const-string v4, "android.intent.action.MEDIA_BUTTON"
const/4 v5, 0x0
invoke-direct {v12, v4, v5}, Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V
.local v12, upIntent:Landroid/content/Intent;
new-instance v3, Landroid/view/KeyEvent;
const/4 v8, 0x1
const/4 v10, 0x0
move-wide v4, v1
move-wide v6, v1
move v9, p1
invoke-direct/range {v3 .. v10}, Landroid/view/KeyEvent;-><init>(JJIII)V
.local v3, upEvent:Landroid/view/KeyEvent;
const-string v4, "android.intent.extra.KEY_EVENT"
invoke-virtual {v12, v4, v3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;
iget-object v4, p0, Lcom/android/internal/policy/impl/PhoneWindowManager;->mContext:Landroid/content/Context;
const/4 v5, 0x0
invoke-virtual {v4, v12, v5}, Landroid/content/Context;->sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V
const/4 v8, 0x1
move-object/from16 v9, p0
iput-boolean v8, v9, Lcom/android/internal/policy/impl/PhoneWindowManager;->mIsVolumeAction:Z
return-void
.end method[/COLOR]
.method sendCloseSystemWindows(Ljava/lang/String;)V
Wow. Is this volume rocker music skip?
I got a scrolling finger cramp.
Pp.
sent from a jellybean filled epic touch.
PanchoPlanet said:
Wow. Is this volume rocker music skip?
I got a scrolling finger cramp.
Pp.
sent from a jellybean filled epic touch.
Click to expand...
Click to collapse
Yes, it was a lot of fun to port over.
Sent from my SPH-D710 using xda premium
hey tdunham
I tried your mod on jds gb28 rom, and got this while recompiling the dex file
classout\com\android\internal\policy\impl\PhoneWindowManager$SkipNext.smali[27,4
] Error for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager$SkipPrev.smali[27,4
] Error for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[10932,4] Erro
r for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[10932,15] mis
matched input '"keycode"' expecting END_METHOD_DIRECTIVE
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[25318,4] Erro
r for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[25318,15] mis
matched input '"code"' expecting END_METHOD_DIRECTIVE
I started tinkering with the .parameter command and switched it to .param p1, and fived the error for the error on (10932,4) error but ave me another regarding btnHanler being invaled.
any thoughts to help?
sickysticky said:
hey tdunham
I tried your mod on jds gb28 rom, and got this while recompiling the dex file
classout\com\android\internal\policy\impl\PhoneWindowManager$SkipNext.smali[27,4
] Error for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager$SkipPrev.smali[27,4
] Error for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[10932,4] Erro
r for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[10932,15] mis
matched input '"keycode"' expecting END_METHOD_DIRECTIVE
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[25318,4] Erro
r for input '.parameter': Invalid directive
classout\com\android\internal\policy\impl\PhoneWindowManager.smali[25318,15] mis
matched input '"code"' expecting END_METHOD_DIRECTIVE
I started tinkering with the .parameter command and switched it to .param p1, and fived the error for the error on (10932,4) error but ave me another regarding btnHanler being invaled.
any thoughts to help?
Click to expand...
Click to collapse
I think you didn't add all of the code in one of the sections as it scrolls past what is displayed and you have missing .end method for a section that is expecting it. Double check your work.
And you added the additional files posted at the bottom of post #1?
Also, in case you didn't know, only red code is new. I always add surrounding code as black text so it can be found and matched to existing sections.
hey there
now I double checked, and even re-input the process and still came up with the same errors while using smali. im pretty sure its is the .parameter command.
below is the code in the guide
.method handleVolumeKey(II)V
.registers 8
.parameter "stream"
.parameter "keycode"
and this is the code in the phonewindowmanager.smali
.method handelVolumeKey(II)V
.registers 8
.param p1, "stream" # I
.param p2, "keycode" # I
now down where the input for the code provided in the guide
.method handleVolumeLongPress(I)V
.registers 6
.parameter "keycode"
/|\
|_____this is line 10932, colum 4
so when I switched the code from .parameter "keycode" to .param p1, "keycode" the error is fixed but sends me to a new error a few lines down in the code that contains (.local v0, btnHandler:Ljava/lang/Runnable
so if there is any way to help can you let me know
sickysticky said:
hey there
now I double checked, and even re-input the process and still came up with the same errors while using smali. im pretty sure its is the .parameter command.
below is the code in the guide
so if there is any way to help can you let me know
Click to expand...
Click to collapse
It depends on what you are using to decompile. Some code will change I think.
Zip up 3 things and post them:
1. Stock android.policy.jar
2. decompiled android.policy.jar. stock without any changes
3. your modified decompiled android.policy.jar
Im currently using baksmali beta 2.0.
Ill zip it up n upload it to my dropbox once I get off work.
Sent from my SPH-D710VMUB using Tapatalk
ok ive zip up the android.policy.jar, the modified smali files and the stock smali files in the link below
https://www.dropbox.com/s/d9fdcwjnj3n1fdg/D710-GB28.zip
sickysticky said:
ok ive zip up the android.policy.jar, the modified smali files and the stock smali files in the link below
https://www.dropbox.com/s/d9fdcwjnj3n1fdg/D710-GB28.zip
Click to expand...
Click to collapse
Here is the modified file.
I think you should try using apktool or something else to compile and recompile. I don't see anything obviously wrong with the code but like I said, it is very different because of what you are using to decompile. Can you decompile and recompile the file without making any changes?
Edit: I've use baksmali also but haven't run into any issues with either ICS or JB. The only thing I can think of is maybe the version you're using. I also made a change to the code above as I was getting a minor error when compiling due to a different variable.
awesome thanks for this.
I think ill consider using vts to compile next time.
Sent from my SPH-D710VMUB using Tapatalk
Hello guys
i had got you a new tut
Which is Swipe on nav bar to sleep/lock
Lets start work
All you need is Deodexed Systemui.apk, settings.apk and Good patience ( if you dont have any of these then just dont try this )
Ok
1. Decompile SystemUI.apk
2. Now download this View attachment SystemUI.zip and merge to your systemui.apk
3. Open com/android/systemui/statusbar/phone/NavigationBarView.smali
Look for this annotation
Code:
Lcom/android/systemui/statusbar/phone/NavigationBarView$OnVerticalChangedListener;,
Below that add this annotation
Code:
Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;,
Now look for
Code:
.field final mDisplay:Landroid/view/Display;
Below that add these definitions
Code:
.field private mDownTime:J
.field private mDownX:F
.field private mDownY:F
.field private mIsDown:Z
.field private mPowerManager:Landroid/os/PowerManager;
.field mSwipe2SleepActive:Z
Now look for this method ( this #1 post will have completely on this method only dont confuse )
Code:
.method public constructor <init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
in that method first Change .locals 4 to .locals 6
after this
Code:
const/4 v3, 0x0
add this
Code:
const/4 v4, 0x1
look for this line
Code:
iput-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mImeSwitcherClickListener:Landroid/view/View$OnClickListener;
Below that add this
Code:
iput-boolean v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mIsDown:Z
Look for this line
Code:
iput-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDisplay:Landroid/view/Display;
Below that add this
Code:
const-string v1, "power"
invoke-virtual {p1, v1}, Landroid/content/Context;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Landroid/os/PowerManager;
iput-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mPowerManager:Landroid/os/PowerManager;
Now look for this line
Code:
iput-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mTaskSwitchHelper:Lcom/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper;
Below that add this
Code:
invoke-direct {p0, v0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getIcons(Landroid/content/res/Resources;)V
Now look for this line
Code:
invoke-direct {p0, v0}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->getIcons(Landroid/content/res/Resources;)V
Replace the above line with this code
Code:
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mContext:Landroid/content/Context;
invoke-virtual {v1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v3, "navbar_swipe_to_sleep"
invoke-static {v1, v3, v2}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v1
if-ne v1, v4, :cond_0
:goto_0
iput-boolean v4, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mSwipe2SleepActive:Z
.line 207
new-instance p1, Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mHandler:Lcom/android/systemui/statusbar/phone/NavigationBarView$H;
invoke-direct {p1, p0, v1}, Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;-><init>(Lcom/android/systemui/statusbar/phone/NavigationBarView;Landroid/os/Handler;)V
.line 208
.local p1, "settingsObserver":Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;
invoke-virtual {p1}, Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;->observe()V
Now in the same method you will find this return-void
Below that add this code
Code:
.end local p1 # "settingsObserver":Lcom/android/systemui/statusbar/phone/NavigationBarView$SettingsObserver;
:cond_0
move v4, v2
.line 205
goto :goto_0
save and Continued in 2nd and 3rd post
part 2
In the same file
4. continue
Look for this method
Code:
.method private adjustExtraKeyGravity(Landroid/view/View;Z)V
Above that method
add these methods
Code:
.method static synthetic access$200(Lcom/android/systemui/statusbar/phone/NavigationBarView;)Landroid/content/Context;
.locals 1
.param p0, "x0" # Lcom/android/systemui/statusbar/phone/NavigationBarView;
.prologue
.line 64
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mContext:Landroid/content/Context;
return-object v0
.end method
.method static synthetic access$300(Lcom/android/systemui/statusbar/phone/NavigationBarView;)Landroid/content/Context;
.locals 1
.param p0, "x0" # Lcom/android/systemui/statusbar/phone/NavigationBarView;
.prologue
.line 64
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mContext:Landroid/content/Context;
return-object v0
.end method
5. Look for this method
Code:
.method private notifyVerticalChangedListener(Z)V
Above that method add these code
Code:
.method private mySwipeDetector(FFJFFJ)V
.locals 11
.param p1, "e1X" # F
.param p2, "e1Y" # F
.param p3, "e1Time" # J
.param p5, "e2X" # F
.param p6, "e2Y" # F
.param p7, "e2Time" # J
.prologue
.line 276
iget-object v6, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mContext:Landroid/content/Context;
invoke-virtual {v6}, Landroid/content/Context;->getResources()Landroid/content/res/Resources;
move-result-object v6
invoke-virtual {v6}, Landroid/content/res/Resources;->getConfiguration()Landroid/content/res/Configuration;
move-result-object v6
iget v6, v6, Landroid/content/res/Configuration;->orientation:I
const/4 v7, 0x1
if-ne v6, v7, :cond_1
const/4 v2, 0x1
.line 277
.local v2, "isPortrait":Z
:goto_0
sub-float v0, p5, p1
.line 278
.local v0, "distanceX":F
sub-float v1, p6, p2
.line 279
.local v1, "distanceY":F
sub-long v6, p7, p3
long-to-float v6, v6
div-float v6, v0, v6
const/high16 v7, 0x447a0000 # 1000.0f
mul-float v4, v6, v7
.line 280
.local v4, "velocityX":F
sub-long v6, p7, p3
long-to-float v6, v6
div-float v6, v1, v6
const/high16 v7, 0x447a0000 # 1000.0f
mul-float v5, v6, v7
.line 281
.local v5, "velocityY":F
const-string v3, ""
.line 282
.local v3, "summary":Ljava/lang/String;
if-eqz v2, :cond_2
.line 283
invoke-static {v0}, Ljava/lang/Math;->abs(F)F
move-result v6
invoke-static {v1}, Ljava/lang/Math;->abs(F)F
move-result v7
cmpl-float v6, v6, v7
if-lez v6, :cond_0
invoke-static {v0}, Ljava/lang/Math;->abs(F)F
move-result v6
const/high16 v7, 0x43960000 # 300.0f
cmpl-float v6, v6, v7
if-lez v6, :cond_0
const/high16 v6, -0x3db80000 # -50.0f
cmpl-float v6, p6, v6
if-lez v6, :cond_0
invoke-static {v4}, Ljava/lang/Math;->abs(F)F
move-result v6
const/high16 v7, 0x447a0000 # 1000.0f
cmpl-float v6, v6, v7
if-lez v6, :cond_0
.line 285
iget-object v6, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mPowerManager:Landroid/os/PowerManager;
invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J
move-result-wide v8
invoke-virtual {v6, v8, v9}, Landroid/os/PowerManager;->goToSleep(J)V
.line 303
:cond_0
:goto_1
return-void
.line 276
.end local v0 # "distanceX":F
.end local v1 # "distanceY":F
.end local v2 # "isPortrait":Z
.end local v3 # "summary":Ljava/lang/String;
.end local v4 # "velocityX":F
.end local v5 # "velocityY":F
:cond_1
const/4 v2, 0x0
goto :goto_0
.line 298
.restart local v0 # "distanceX":F
.restart local v1 # "distanceY":F
.restart local v2 # "isPortrait":Z
.restart local v3 # "summary":Ljava/lang/String;
.restart local v4 # "velocityX":F
.restart local v5 # "velocityY":F
:cond_2
invoke-static {v1}, Ljava/lang/Math;->abs(F)F
move-result v6
invoke-static {v0}, Ljava/lang/Math;->abs(F)F
move-result v7
cmpl-float v6, v6, v7
if-lez v6, :cond_0
invoke-static {v1}, Ljava/lang/Math;->abs(F)F
move-result v6
const/high16 v7, 0x43960000 # 300.0f
cmpl-float v6, v6, v7
if-lez v6, :cond_0
const/high16 v6, -0x3db80000 # -50.0f
cmpl-float v6, p5, v6
if-lez v6, :cond_0
invoke-static {v5}, Ljava/lang/Math;->abs(F)F
move-result v6
const/high16 v7, 0x447a0000 # 1000.0f
cmpl-float v6, v6, v7
if-lez v6, :cond_0
.line 300
iget-object v6, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mPowerManager:Landroid/os/PowerManager;
invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J
move-result-wide v8
invoke-virtual {v6, v8, v9}, Landroid/os/PowerManager;->goToSleep(J)V
goto :goto_1
.end method
6. Now Find this
Code:
# virtual methods
Below that add this code
Code:
.method public dp2Px(F)I
.locals 3
.param p1, "dp" # F
.prologue
.line 544
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mContext:Landroid/content/Context;
invoke-virtual {v1}, Landroid/content/Context;->getResources()Landroid/content/res/Resources;
move-result-object v1
invoke-virtual {v1}, Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;
move-result-object v1
iget v0, v1, Landroid/util/DisplayMetrics;->density:F
.line 545
.local v0, "scale":F
mul-float v1, p1, v0
const/high16 v2, 0x3f000000 # 0.5f
add-float/2addr v1, v2
float-to-int v1, v1
return v1
.end method
7. Look for this method
Code:
.method public onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
In this code Change .locals 3 to .locals 4
Look for this
Code:
.local v1, "intercept":Z
if-nez v1, :cond_[COLOR="Red"]0[/COLOR]
Change to
Code:
.local v1, "intercept":Z
if-nez v1, :cond_[COLOR="red"]1[/COLOR]
Look for this line
Code:
iget-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDelegateIntercepted:Z
Below that add this code
Code:
iget-boolean v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mSwipe2SleepActive:Z
if-eqz v2, :cond_0
invoke-virtual {p1}, Landroid/view/MotionEvent;->getAction()I
move-result v2
if-nez v2, :cond_0
.line 318
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
iput-wide v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownTime:J
.line 319
invoke-virtual {p1}, Landroid/view/MotionEvent;->getX()F
move-result v2
iput v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownX:F
.line 320
invoke-virtual {p1}, Landroid/view/MotionEvent;->getY()F
move-result v2
iput v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownY:F
.line 321
const/4 v2, 0x1
iput-boolean v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mIsDown:Z
.line 329
:cond_0
After adding this, just below 2 lines you will find this
After return v1 you will find this
:cond_0 to :cond_1
8. Now look for this method
Code:
.method public onTouchEvent(Landroid/view/MotionEvent;)Z
Replace complete method from the below method
Code:
.method public onTouchEvent(Landroid/view/MotionEvent;)Z
.locals 11
.param p1, "event" # Landroid/view/MotionEvent;
.prologue
const/4 v10, 0x1
.line 248
iget-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mSwipe2SleepActive:Z
if-eqz v1, :cond_0
invoke-virtual {p1}, Landroid/view/MotionEvent;->getAction()I
move-result v1
if-ne v1, v10, :cond_0
iget-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mIsDown:Z
if-eqz v1, :cond_0
.line 249
const/4 v1, 0x0
iput-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mIsDown:Z
.line 250
iget v2, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownX:F
iget v3, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownY:F
iget-wide v4, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDownTime:J
invoke-virtual {p1}, Landroid/view/MotionEvent;->getX()F
move-result v6
invoke-virtual {p1}, Landroid/view/MotionEvent;->getY()F
move-result v7
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v8
move-object v1, p0
invoke-direct/range {v1 .. v9}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mySwipeDetector(FFJFFJ)V
.line 252
:cond_0
invoke-direct {p0, p1}, Lcom/android/systemui/statusbar/phone/NavigationBarView;->initDownStates(Landroid/view/MotionEvent;)V
.line 217
iget-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDelegateIntercepted:Z
if-nez v1, :cond_1
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mTaskSwitchHelper:Lcom/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper;
invoke-virtual {v1, p1}, Lcom/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper;->onTouchEvent(Landroid/view/MotionEvent;)Z
move-result v1
if-eqz v1, :cond_1
move v1, v10
.line 227
:goto_0
return v1
.line 220
:cond_1
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDeadZone:Lcom/android/systemui/statusbar/policy/DeadZone;
if-eqz v1, :cond_2
invoke-virtual {p1}, Landroid/view/MotionEvent;->getAction()I
move-result v1
const/4 v2, 0x4
if-ne v1, v2, :cond_2
.line 221
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDeadZone:Lcom/android/systemui/statusbar/policy/DeadZone;
invoke-virtual {v1, p1}, Lcom/android/systemui/statusbar/policy/DeadZone;->poke(Landroid/view/MotionEvent;)V
.line 223
:cond_2
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDelegateHelper:Lcom/android/systemui/statusbar/DelegateViewHelper;
if-eqz v1, :cond_3
iget-boolean v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDelegateIntercepted:Z
if-eqz v1, :cond_3
.line 224
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/NavigationBarView;->mDelegateHelper:Lcom/android/systemui/statusbar/DelegateViewHelper;
invoke-virtual {v1, p1}, Lcom/android/systemui/statusbar/DelegateViewHelper;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z
move-result v0
.line 225
.local v0, "ret":Z
if-eqz v0, :cond_3
move v1, v10
goto :goto_0
.line 227
.end local v0 # "ret":Z
:cond_3
invoke-super {p0, p1}, Landroid/widget/LinearLayout;->onTouchEvent(Landroid/view/MotionEvent;)Z
move-result v1
goto :goto_0
.end method
9. Finally save and compile/sign and replace the systemui.apk
10. Now time to add switch from setting
Look for the below 3rd post
settings
Welcome to easy part on adding the option to hide/show in settings
1. Decompile the settings.apk
2. Download this View attachment Settings.zip and merge to your settings
3. Add the below code to your settings ( i had added to my own settings ) and your wish
Code:
<PreferenceScreen android:title="Navigation" android:key="navigation" android:fragment="com.android.settings.rz.Navigation" />
4. Compile it and Decompile and open
Settings.apk/smali/com/android/settings/rz/Navigation.smali
5. Compare the Public ID and replace it and recompile
6. God you did man,,, now replace and have fun
Thanks to atl4ntis for his Awesome rom Cataclysm and Cyanogenmod
I gonna try now ?
Working. ? ?
Works fine bro thanks a lot
woww.good job,thank bro
venkat kamesh said:
Welcome to easy part on adding the option to hide/show in settings
1. Decompile the settings.apk
2. Download this View attachment 3617852 and merge to your settings
3. Add the below code to your settings ( i had added to my own settings ) and your wish
Code:
<PreferenceScreen android:title="Navigation" android:key="navigation" android:fragment="com.android.settings.rz.Navigation" />
4. Compile it and Decompile and open
Settings.apk/smali/com/android/settings/rz/Navigation.smali
5. Compare the Public ID and replace it and recompile
6. God you did man,,, now replace and have fun
Thanks to atl4ntis for his Awesome rom Cataclysm and Cyanogenmod
Click to expand...
Click to collapse
when i recompile,,i have bug with @string/lockscreen_display_category
dark90
brother, give your SystemUI with the mod Enable/Disable Navigation Bar Swipe to sleep/Lock, pliz
Quoclam851995 said:
when i recompile,,i have bug with @string/lockscreen_display_category
Click to expand...
Click to collapse
haha its a dump string
not a deal bro
rename the @string/lockscreen_display_category to any thing like "display"
or remove the line and leave it or add string
nothing is a problem
dark90 said:
Working.
Click to expand...
Click to collapse
can you give me your systemui
Thanks bro.. Works like a charm.. Great tutorial. Expecting more from you..
Rajeev said:
Thanks bro.. Works like a charm.. Great tutorial. Expecting more from you..
Click to expand...
Click to collapse
Can you share with me your system ui
Quoclam851995 said:
Can you share with me your system ui
Click to expand...
Click to collapse
Why?
Rajeev said:
Why?
Click to expand...
Click to collapse
Maybe don't know how to make the tut i think .-.
Rajeev said:
Why?
Click to expand...
Click to collapse
I want compare some code to complete my system ui.
Quoclam851995 said:
I want compare some code to complete my system ui.
Click to expand...
Click to collapse
I am sorry my Friend. I am using 2g and very low signal. With my Samsung Galaxy Y
@Rajeev @venkat kamesh
why is there nobody to explain me how to "merge" a file to another.
in this case (and all other tuts as well from venkat) i don´t unterstand how to merge my public.xml with the downloaded from the OP.
this drives me crazy. i did all steps before but always failed at this point in each tutorial
all other things are clear and replacing the ID after re- and decompiling is no problem, but if nobody explain to me how to merge both public.xml, i
can´t re- and decompile the settings.apk without a failure.
Each dev started like me with little little steps, so come on guys, plz teach me this simple thing
There are tousand of tuts here from hundreds of devs, but nobody explain this thing - very very frustrating....
moonryder said:
@Rajeev @venkat kamesh
why is there nobody to explain me how to "merge" a file to another.
in this case (and all other tuts as well from venkat) i don´t unterstand how to merge my public.xml with the downloaded from the OP.
this drives me crazy. i did all steps before but always failed at this point in each tutorial
all other things are clear and replacing the ID after re- and decompiling is no problem, but if nobody explain to me how to merge both public.xml, i
can´t re- and decompile the settings.apk without a failure.
Each dev started like me with little little steps, so come on guys, plz teach me this simple thing
There are tousand of tuts here from hundreds of devs, but nobody explain this thing - very very frustrating....
Click to expand...
Click to collapse
Bro u don't need to merge the public.xml u only need to search the lines that the files u added to xml, layout etc and then compile and recompile and replace the public id and recompile ,sing and replace bro
moonryder said:
@Rajeev @venkat kamesh
why is there nobody to explain me how to "merge" a file to another.
in this case (and all other tuts as well from venkat) i don´t unterstand how to merge my public.xml with the downloaded from the OP.
this drives me crazy. i did all steps before but always failed at this point in each tutorial
all other things are clear and replacing the ID after re- and decompiling is no problem, but if nobody explain to me how to merge both public.xml, i
can´t re- and decompile the settings.apk without a failure.
Each dev started like me with little little steps, so come on guys, plz teach me this simple thing
There are tousand of tuts here from hundreds of devs, but nobody explain this thing - very very frustrating....
Click to expand...
Click to collapse
You need check the smali file and find 0x7fxxxx code, then search That code in the public(compare).xml and you get a specific líne now search That líne into your public.xml and copy your code 0x7fxxxx from the líne into your public.xml to the smali code.
You can use this to make it easy http://forum.xda-developers.com/showthread.php?p=64160375