I've been having many PM's on how to create this toggle and honestly I have been meaning to post this for a while.
Firstly thanks to Mirko-ddd for enabling Crt-Off Animation which allowed me to do this. Thank him HERE
No need to enable from the link above as I have included it with this toggle How-To.
Also Thanks to my teammate Jeboo for teaching me some smali and helping me with this function!
So I'm not a posting master and I do have 2 kids buzzing around me while I type this!.. LOL :highfive:
Here we start with SecSettings.apk
/res/values/Strings.xml
Code:
<string name="crtanimation_title">CRT Animation</string>
<string name="crtanimation_summary">Enables animation when powering off screen</string>
/res/xml/Display_Settings.xml (Input this line where you want it to show.)
Code:
<CheckBoxPreference android:title="@string/crtanimation_title" android:summary="@string/crtanimation_summary" android:key="crtanimation_toggle" />
\SecSettings\smali\com\android\settings\DisplaySettings.smali
Add the RED
Code:
.field mSupportFolderType:Z
.field private mTouchKeyLight:Landroid/preference/ListPreference;
[COLOR="red"].field private mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;[/COLOR]
Code:
.line 548
const-string v12, "key_multi_window"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowPref:Landroid/preference/CheckBoxPreference;
[COLOR="red"] const-string v12, "crtanimation_toggle"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;[/COLOR]
.line 549
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v12
const-string v13, "com.sec.feature.multiwindow.phone"
invoke-virtual {v12, v13}, Landroid/content/pm/PackageManager;->hasSystemFeature(Ljava/lang/String;)Z
move-result v12
sput-boolean v12, Lcom/android/settings/DisplaySettings;->UseMultiWindow:Z
Code:
.line 984
:cond_15
iget-object v0, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowPref:Landroid/preference/CheckBoxPreference;
invoke-virtual {p2, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, [COLOR="red"]:cond_new[/COLOR]
.line 985
iget-object v0, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowPref:Landroid/preference/CheckBoxPreference;
invoke-virtual {v0}, Landroid/preference/CheckBoxPreference;->isChecked()Z
move-result v0
.line 986
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v3
const-string v4, "multi_window_enabled"
if-eqz v0, :cond_16
:goto_a
invoke-static {v3, v4, v1}, Landroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
goto/16 :goto_1
:cond_16
move v1, v2
goto :goto_a
[COLOR="red"] :cond_new
iget-object v0, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;
invoke-virtual {p2, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
.line 987
iget-object v0, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;
invoke-virtual {v0}, Landroid/preference/CheckBoxPreference;->isChecked()Z
move-result v0
.line 988
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v3
const-string v4, "crtanimation_toggle"
if-nez v0, :cond_newA
const/4 v0, 0x0
goto :cond_newB
:cond_newA
const/4 v0, 0x1
:cond_newB
invoke-static {v3, v4, v0}, Landroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
goto/16 :goto_1
[/COLOR]
.end method
Code:
.line 818
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v0
const-string v1, "multi_window_enabled"
invoke-static {v1}, Landroid/provider/Settings$System;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
move-result-object v1
iget-object v3, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowModeObserver:Landroid/database/ContentObserver;
invoke-virtual {v0, v1, v2, v3}, Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V
.line 820
:cond_2
[COLOR="red"] iget-object v0, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v3
const-string v4, "crtanimation_toggle"
const/4 v1, 0x0
invoke-static {v3, v4, v1}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
if-eqz v3, :goto_2b
const/4 v1, 0x1
goto :goto_2c
:goto_2b
const/4 v1, 0x0
:goto_2c
invoke-virtual {v0, v1}, Landroid/preference/CheckBoxPreference;->setChecked(Z)V[/COLOR]
return-void
:cond_3
move v0, v2
.line 792
goto :goto_0
That's it for SecSettings.
Recompile and test it functions before continuing.
Once that works lets enable the function.
I'm including the function to enable as previously linked to mirko_ddd's thread.
Next we mod services.jar
\services\smali\com\android\server\PowerManagerService$ScreenBrightnessAnimator.smali
Code:
.line 3022
iget-object v7, p0, Lcom/android/server/PowerManagerService$ScreenBrightnessAnimator;->this$0:Lcom/android/server/PowerManagerService;
#getter for: Lcom/android/server/PowerManagerService;->mScreenBrightnessHandler:Landroid/os/Handler;
invoke-static {v7}, Lcom/android/server/PowerManagerService;->access$7200(Lcom/android/server/PowerManagerService;)Landroid/os/Handler;
move-result-object v7
[COLOR="Red"] move-object v0, p0
iget-object v2, v0, Lcom/android/server/PowerManagerService$ScreenBrightnessAnimator;->this$0:Lcom/android/server/PowerManagerService;
#getter for: Lcom/android/server/PowerManagerService;->mContext:Landroid/content/Context;
invoke-static {v2}, Lcom/android/server/PowerManagerService;->access$2700(Lcom/android/server/PowerManagerService;)Landroid/content/Context;
move-result-object v2
invoke-virtual {v2}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v2
const-string v9, "crtanimation_toggle"
const/4 v10, 0x0
invoke-static {v2, v9, v10}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v2
if-eqz v2, :cond_new2
if-eqz p2, :cond_new2
const/16 v9, 0xb
const/4 v10, 0x0
const v2, 0x10
invoke-virtual {v7, v9, v2, v10}, Landroid/os/Handler;->obtainMessage(III)Landroid/os/Message;
move-result-object v9
invoke-virtual {v9}, Landroid/os/Message;->sendToTarget()V
:cond_new2
[/COLOR]
const/16 v9, 0xa
invoke-virtual {v7, v9, p1, v3}, Landroid/os/Handler;->obtainMessage(III)Landroid/os/Message;
move-result-object v2
.line 3024
.local v2, msg:Landroid/os/Message;
iget-object v7, p0, Lcom/android/server/PowerManagerService$ScreenBrightnessAnimator;->this$0:Lcom/android/server/PowerManagerService;
And that's it!
Recompile and enjoy.
This was fantastic timing. I was just looking for this kind of mod!
I'm having issues with the Services.jar... though I am using a GT-i9300.
Can you help?
Kryten2k35 said:
This was fantastic timing. I was just looking for this kind of mod!
I'm having issues with the Services.jar... though I am using a GT-i9300.
Can you help?
Click to expand...
Click to collapse
Sure... send me services.jar if you want.
I'll see if I can as I don't have that device.
The code is every similar, but I get this error when I try to boot:
Code:
E/AndroidRuntime( 5363): *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService
E/AndroidRuntime( 5363): java.lang.NoSuchMethodError: com.android.server.PowerManagerService.access$2700
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateInternal(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateTo(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateTo(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.updateLightsLocked(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.setPowerState(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.userActivity(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.access$4000(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.update(PowerManagerService.java)
E/AndroidRuntime( 5363): at java.util.Observable.notifyObservers(Observable.java:138)
E/AndroidRuntime( 5363): at java.util.Observable.notifyObservers(Observable.java:113)
E/AndroidRuntime( 5363): at android.content.ContentQueryMap.requery(ContentQueryMap.java)
E/AndroidRuntime( 5363): at android.content.ContentQueryMap.getValues(ContentQueryMap.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.getInt(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.update(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.initInThread(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$2.onLooperPrepared(PowerManagerService.java)
E/AndroidRuntime( 5363): at android.os.HandlerThread.run(HandlerThread.java)
I/dumpstate( 5543): begin
I'll attach the file
Also, I'm not using the SecSettings.jar since I can use the AllianceROM customiser for the checkbox and key... I dunno if that makes a difference to the code.
Kryten2k35 said:
The code is every similar, but I get this error when I try to boot:
Code:
E/AndroidRuntime( 5363): *** FATAL EXCEPTION IN SYSTEM PROCESS: PowerManagerService
E/AndroidRuntime( 5363): java.lang.NoSuchMethodError: com.android.server.PowerManagerService.access$2700
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateInternal(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateTo(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$ScreenBrightnessAnimator.animateTo(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.updateLightsLocked(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.setPowerState(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.userActivity(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.access$4000(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.update(PowerManagerService.java)
E/AndroidRuntime( 5363): at java.util.Observable.notifyObservers(Observable.java:138)
E/AndroidRuntime( 5363): at java.util.Observable.notifyObservers(Observable.java:113)
E/AndroidRuntime( 5363): at android.content.ContentQueryMap.requery(ContentQueryMap.java)
E/AndroidRuntime( 5363): at android.content.ContentQueryMap.getValues(ContentQueryMap.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.getInt(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$SettingsObserver.update(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService.initInThread(PowerManagerService.java)
E/AndroidRuntime( 5363): at com.android.server.PowerManagerService$2.onLooperPrepared(PowerManagerService.java)
E/AndroidRuntime( 5363): at android.os.HandlerThread.run(HandlerThread.java)
I/dumpstate( 5543): begin
I'll attach the file
Also, I'm not using the SecSettings.jar since I can use the AllianceROM customiser for the checkbox and key... I dunno if that makes a difference to the code.
Click to expand...
Click to collapse
The APK and JAR have to work in conjunction with each other.
Let me try
shoman94 said:
The APK and JAR have to work in conjunction with each other.
Click to expand...
Click to collapse
Change access$2700 to access$2300 in the added code
Still a bootloop, but I haven't tried the SecSettings.apk yet.
Kryten2k35 said:
Still a bootloop, but I haven't tried the SecSettings.apk yet.
Click to expand...
Click to collapse
SecSettings doesn't matter for booting. What's the error now?
Code:
E/AndroidRuntime(17316): *** FATAL EXCEPTION IN SYSTEM PROCESS: android.server.ServerThread
E/AndroidRuntime(17316): java.lang.VerifyError: com/android/server/PowerManagerService$ScreenBrightnessAnimator
E/AndroidRuntime(17316): at com.android.server.PowerManagerService.init(PowerManagerService.java)
E/AndroidRuntime(17316): at com.android.server.ServerThread.run(SystemServer.java)
I/dumpstate(17352): begin
EDIT:
Ignore that, I now have it booting wiht the services.jar changes.
However:
My ROMSettings.apk checkbox doesn't seem to affect the on or off. It's just always on:
And my SecSettings.apk won't compile at this part:
Code:
.line 548
const-string v12, "key_multi_window"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowPref:Landroid/preference/CheckBoxPreference;
const-string v12, "crtanimation_toggle"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;
.line 549
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v12
const-string v13, "com.sec.feature.multiwindow.phone"
invoke-virtual {v12, v13}, Landroid/content/pm/PackageManager;->hasSystemFeature(Ljava/lang/String;)Z
move-result v12
sput-boolean v12, Lcom/android/settings/DisplaySettings;->UseMultiWindow:Z
Right at the beginning of the guide...
Attaching my "DisplaySettings.smali" file
EDIT:
Here's the compile error:
Code:
H:\apktool>apktool b working/SecSettings
I: Checking whether sources has changed...
I: Smaling...
[3403,4] All register args must fit in 4 bits
[3409,1] The register number must be less than v16
[3415,4] mismatched tree node: I_STATEMENT_FORMAT3rc_METHOD exp
[3417,4] mismatched tree node: I_STATEMENT_FORMAT11x expecting
Exception in thread "main" brut.androlib.AndrolibException: Cou
DisplaySettings.smali
at brut.androlib.src.DexFileBuilder.addSmaliFile(DexFil
at brut.androlib.src.DexFileBuilder.addSmaliFile(DexFil
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilde
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.ja
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.ja
at brut.androlib.Androlib.buildSourcesSmali(Androlib.ja
at brut.androlib.Androlib.buildSources(Androlib.java:21
at brut.androlib.Androlib.build(Androlib.java:205)
at brut.androlib.Androlib.build(Androlib.java:176)
at brut.apktool.Main.cmdBuild(Main.java:228)
at brut.apktool.Main.main(Main.java:79)
Kryten2k35 said:
EDIT:
Ignore that, I now have it booting wiht the services.jar changes.
However:
My ROMSettings.apk checkbox doesn't seem to affect the on or off. It's just always on:
And my SecSettings.apk won't compile at this part:
Code:
.line 548
const-string v12, "key_multi_window"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mMultiWindowPref:Landroid/preference/CheckBoxPreference;
const-string v12, "crtanimation_toggle"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/CheckBoxPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mCrtAnimationPreference:Landroid/preference/CheckBoxPreference;
.line 549
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v12
const-string v13, "com.sec.feature.multiwindow.phone"
invoke-virtual {v12, v13}, Landroid/content/pm/PackageManager;->hasSystemFeature(Ljava/lang/String;)Z
move-result v12
sput-boolean v12, Lcom/android/settings/DisplaySettings;->UseMultiWindow:Z
Right at the beginning of the guide...
Attaching my "DisplaySettings.smali" file
EDIT:
Here's the compile error:
Code:
H:\apktool>apktool b working/SecSettings
I: Checking whether sources has changed...
I: Smaling...
[3403,4] All register args must fit in 4 bits
[3409,1] The register number must be less than v16
[3415,4] mismatched tree node: I_STATEMENT_FORMAT3rc_METHOD exp
[3417,4] mismatched tree node: I_STATEMENT_FORMAT11x expecting
Exception in thread "main" brut.androlib.AndrolibException: Cou
DisplaySettings.smali
at brut.androlib.src.DexFileBuilder.addSmaliFile(DexFil
at brut.androlib.src.DexFileBuilder.addSmaliFile(DexFil
at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilde
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.ja
at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.ja
at brut.androlib.Androlib.buildSourcesSmali(Androlib.ja
at brut.androlib.Androlib.buildSources(Androlib.java:21
at brut.androlib.Androlib.build(Androlib.java:205)
at brut.androlib.Androlib.build(Androlib.java:176)
at brut.apktool.Main.cmdBuild(Main.java:228)
at brut.apktool.Main.main(Main.java:79)
Click to expand...
Click to collapse
Your attached code is totally different then what I have in the guide. Is that what you added?
Anyway. If you are using Alliance app then attach the decompiled smali if thats what You wanna use and I'll look at that... otherwise attach the original decompiled smali before you touched it.
This is the totally untouched SecSettings/smali.blah blah/DisplaySettings.smali file:
Kryten2k35 said:
This is the totally untouched SecSettings/smali.blah blah/DisplaySettings.smali file:
Click to expand...
Click to collapse
Your code is different so its tough for me to do this without the device. What are you compiling with? I'm using APK tool. I wonder if the different compilers are doing things different.
But I made this attempt.
I'm using apktool, but I used the removing debugging operation... "apktool d -b ...."
Let me see what this does
---------- Post added at 03:14 AM ---------- Previous post was at 02:55 AM ----------
Kryten2k35 said:
I'm using apktool, but I used the removing debugging operation... "apktool d -b ...."
Let me see what this does
Click to expand...
Click to collapse
Well it builds and runs, but doesn't disable it when you check it... the only thing I can think to do is to actually put the checkbox in the settings.apk
Kryten2k35 said:
I'm using apktool, but I used the removing debugging operation... "apktool d -b ...."
Let me see what this does
---------- Post added at 03:14 AM ---------- Previous post was at 02:55 AM ----------
Well it builds and runs, but doesn't disable it when you check it... the only thing I can think to do is to actually put the checkbox in the settings.apk
Click to expand...
Click to collapse
SO was the smali you sent me from you SecSettings.apk or the alliance.apk?
Edit: So the checkbox checks and unchecks but nothing changes with the animation itself.
shoman94 said:
SO was the smali you sent me from you SecSettings.apk or the alliance.apk?
Edit: So the checkbox checks and unchecks but nothing changes with the animation itself.
Click to expand...
Click to collapse
Yeah the smali was form SecSettings, but the checkbox is in Alliance which is where I want it, ultimately...
I was going off this:
http://forum.xda-developers.com/showthread.php?t=2120008
Which had SecSettings.apk edits that I never made. I just put the arrays and checkboxes in the Alliance App like someone provided.
Kryten2k35 said:
Yeah the smali was form SecSettings, but the checkbox is in Alliance...
Click to expand...
Click to collapse
lol... well of course the checkbox from alliance won't work. :cyclops:
Show me the checkbox smali from the alliance APK. Its probably just a name change in the smali depending on how it was done.
Code:
<PreferenceCategory android:title="CRT Animation">
<CheckBoxPreference android:defaultValue="false" android:title="@string/crtanimation_title" android:summary="@string/crtanimation_summary" android:key="crtanimation_toggle" />
</PreferenceCategory>
It should work as the key is the same
Kryten2k35 said:
Code:
<PreferenceCategory android:title="CRT Animation">
<CheckBoxPreference android:defaultValue="false" android:title="@string/crtanimation_title" android:summary="@string/crtanimation_summary" android:key="crtanimation_toggle" />
</PreferenceCategory>
It should work as the key is the same
Click to expand...
Click to collapse
That key is for the smali of that APK. The key that points to services.jar can be different.
Edit: Funny how they are the same and I made this from scratch.
Firstly I am by no means an expert and am just trying to share what i have learnt about smali as its hard to find much info about general smali. Contributions to the thread are always welcome
For the last year or so I have been developing AllianceROM on the i9100. During this time I have learnt lots about smali through a combination of trial and error and guides I have found here on XDA. The guides are great but one thing that stands out is that they all follow the same pattern of “Find a certain line in a certain file and copy/paste" to replace methods or chunks of code for the desired outcome. Whilst this is a great means to an end it is only a means to that particular end. Most people wont actually understand what they are doing or how it works and will blindly do as instructed.
So I thought that I would try to write some general guides. The aim is to give you the means to dream up your own mods and know how to go about implementing them from scratch by yourself. I am by no means an expert but hopefully there should be enough here to set you on your way. These are the methods I used to create many of the mods in alliance, lots of which didn’t exist on Touchwiz devices before.
You will need certain tools to do this but I am not going into how to decompile etc. Before attempting this you should have a good knowledge of decompiling apks and modding in general and have the following tools available:
ADB
Notepad ++
A good image editor like Photoshop or GIMP
The guides are in 3 sections:
Coloring stuff with color pickers
Toggling stuff to show or hide
List choices for things like toggles in view etc
For the purposes of these guides I am using an apk from our legendary alliance developer ficeto. He has made this app to enable us to easily add color pickers, checkboxes and lists by adding a single line to an xml. Huge huge thanks to him as he made this a lot easier!! You can use this to test your mods but please dont rename everything from ficeto to "ubermodders" or something and try to pass it off as your own. If you do it will be reported It is to be used as is, not changed or renamed (this causes problems for people installing alliamceMOD) and dont forget to credit ficeto!!
Please feel free to ask general smali questions here too!
So lets get started!!
Coloring Stuff:
Text Colors
There is a ton of stuff in alliance that can be colored, from text to images or backgrounds. Text works by using the setTextColor method and images and backgrounds use setColorFilter to lay a color over the top of an image ot setBackgroundColor to fill the entire background. I will cover one of each in this section starting with text color. The 3 methods use similar code and text color is the easiest to start with.
So….you decide you want to change the color of some text using a picker. For this example I will use the dropdown date. Where do you start? As you probably know dropdown stuff is dealt with by SystemUI.apk. When you decompile that you are faced with a ton of smali files. The best way to start is to use a handy function in Notepad++ called “Find in Files” which will search for certain text within files. Funnily enough its under the Search menu at the top!!
In this case the first port of call would be to search for the obvious word “date”. This returns a ton of results and you should see an obvious file called DateView.smali. If your search doesn’t return much for your specific choice of text then you have a couple of options:
1) look in the layout xml and find the id for the view you want to change. Look the id up in public.xml and then search that using “Find in Files” again. If you are unsure of the text view id then use hierarchy viewer from the tools folder of the sdk which will show you all the views on your screen
2) look through the smali files manually for anything that sounds like it might contain your target
So you think you found the right smali. Open it and search for “setText(Ljava/lang/CharSequenceV”. This will hopefully return a line something like this:
invoke-virtual {p0, v5}, Lcom/android/systemui/statusbar/policy/DateView;->setText(Ljava/lang/CharSequenceV
Scroll up until you see the name of the method. This should give you a good idea if you have the right text. In this case that line was in .method private final updateClock()V which sounds about right!
What this line is doing is calling settext with the parameter Ljava/lang/CharSequence which is the date string. Invoke virtual calls the method and the bit in the brackets {p0, v5} is the date view (p0 means “this file”) and the string (v5). The v is a register. Registers are used to store things. A few lines up in the method you will see something similar to this:
invoke-virtual {v0, v9, v5}, Landroid/content/Context;->getString(I[Ljava/lang/ObjectLjava/lang/String;
move-result-object v5
What that is doing is using getString to get the date and moving it into the register v5. This v5 is then used in our setText call.
So now we have identified our text view in the smali we can use setTextColor to change its color.
A bit of background is useful here. Color pickers do not act directly on any smali. Your phone has a database where it stores its settings. It is located in data/data/com.android.providers.settings/databases/settings.db. You can open it with Root Explorer and take a look. You will see a standard database with entries and values. What color picker code does is put an entry in this database with a “key” and a hex code. The smali then uses this key to look up the hex color it needs to set.
Now we need to add some code to look up that entry and return the color to the smali. There are 3 elements to this:
The ContentResolver
This is used to resolve the entry in the database. In order to use the content resolver we must put it into a register as we mentioned earlier. At the top of the method you will see .locals X where X is a number. This is the number of registers used in the method. So if it says .locals 5 there will be v0,v1,v2,v3 and v4. We need to add 3 to this value as we will be using 3 new registers. One for the resolver, one for the default color (in case there is no entry in the database it needs to have a color to set) and one for the key.
Now we need context in order to get the content resolver. There are a few ways to do this. A lot of files have a field called mContext. This can be used directly like this:
iget-object v5, p0, Lcom/android/systemui/statusbar/policy/BrightnessController;->mContext:Landroid/content/Context;
This is using iget-object to put mContext into v5. As mentioned earlier the p0 mean “this”.
The v5 should be the first of the new registers you added. So if previously .locals was 5 and you changed it to 8 then this would be v5 as v0 to v4 already exist. You can reuse registers but you can run into problems if it is needed further through the code so it is advisable to add new.
Alternatively, smali files whose .super is a view (look at the top of the smali for .super) like the date view we are working with here can use getcontext to get context like this:
invoke-virtual {p0}, Lcom/android/systemui/statusbar/policy/DateView;->getContext()Landroid/content/Context;
move-result-object v5
Now we have context we can use it to get the content resolver and put it into the register using this line:
invoke-virtual {v5}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v5
The Key
Next we need the key that we want to look up in the database. This is as simple as :
const-string v6, "date_color"
This just puts the constant string “date_color” into v6. The text inside the “” can be anything you like but cannot have spaces and the key must match the picker key we will add later.
The Default Value
Next we need a default color for in case there is no entry in the database. For example on a fresh install or after a wipe. The value is hex but in reverse preceded with -0x so ICS blue 33b5e5 becomes -0xcc4a1a because 0 = F, 1 = E, 2 = D etc
0 = F
1 = E
2 = D
3 = C
4 = B
5 = A
6 = 9
7 = 8
8 = 7
9 = 6
A = 5
B = 4
C = 3
D = 2
E = 1
F = 0
We put that into our 3rd new register v7 using:
const v7, -0xcc4a1a
Now we have all the needed elements we can use them to return the color to the smali from the database using:
invoke-static {v5, v6, v7}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v5
This uses the getInt method with our parameters. I have colored them so you can see how the registers relate to the getInt method. V5 is the content resolver, v6 is the string and v7 is the integer of the color.
The resultant color from the database is then moved into v5. We can use v5 register again as we no longer need the content resolver.
The color from the database is now stored in v5. From the settext line we found earlier we can see that the text view is referred to as p0:
invoke-virtual {p0, v5}, Lcom/android/systemui/statusbar/policy/DateView;->setText(Ljava/lang/CharSequenceV
The first item in the brackets is the text view. This wont be p0 in all cases. Its only p0 here because we are working with a smali that has a view as its super so the smali is effectively the text view. If working with something like ToggleSlider for example we may have something like:
invoke-virtual {v2, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequenceV
So in this case the text view is in v2.
We can now use setTextColor on our date which is p0 with the color which we put in v5:
invoke-virtual {p0, v5}, Lcom/android/systemui/statusbar/policy/DateView;->setTextColor(I)V
The full code looks like this:
invoke-virtual {p0, v3}, Lcom/android/systemui/statusbar/policy/DateView;->setText(Ljava/lang/CharSequenceV
invoke-virtual {p0}, Lcom/android/systemui/statusbar/policy/DateView;->getContext()Landroid/content/Context;
move-result-object v5
invoke-virtual {v5}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v5
const-string v6, "date_color"
const v7, -0xcc4a1a
invoke-static {v5, v6, v7}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v5
invoke-virtual {p0, v5}, Lcom/android/systemui/statusbar/policy/DateView;->setTextColor(I)V
Oh and just so you know the big V at the end of lines like ;->setText(Ljava/lang/CharSequenceV and ;->setTextColor(I)V means the method returns void or nothing.
Hopefully the apk will now compile and you can test the result. In order for something to change immediately you need observers but I wont go into that here. This will only change when the updateClock method runs. A reboot will also trigger it to update the color.
I know I have written a lot to take in here. But hopefully this will give you a good basic understanding of how methods are called with parameters in smali.
Next stop…..choosing the color!
Thanks to ficeto this part is REALLY easy!
Decompile the attached apk. You will find a file called preferences.xml in the xml folder. Open it with Notepad++. Each instance of this line will add another picker…
<com.ficeto.colorpicker.ColorPickerPreference android:title="Dropdown Date Color" android:key="date_color" android:summary="Select Color" android:dialogTitle="Select Color" />
Change the android:title to what you want your picker to be called and change android:key=“date_color” to whatever the key you used earlier was. So if your smali was....
const-string v6, "clock_color"
Then the android:key would be “clock_color”.
That’s it. Compile and push the apk or install as a system app and it will show in your app drawer as custom settings. Now go test your new mod!!
Any questions or problems please ask (with logs and files if possible) as its impossible to cover all eventualities in a guide.
OK....time for part 2
COLORING IMAGES
This part will cover two things. Coloring images in a similar way to setting text colors from part 1 and also how to create a method and pass it context. Sometimes you wont be able to use mContext or getcontext but most smali files have context already in their init so you can use that and pass it to a new method. Using your own method is more efficient as you can run your code to get the color from the database just once and use it on multiple items and in multiple places.
There are three main ways to color an image. Using the method setColorFilter(I)V which is in android/widget/ImageView smali in framework2.jar, using method public final setColorFilter(ILandroid/graphics/PorterDuff$ModeV in the same file and using method public setColorFilter(ILandroid/graphics/PorterDuff$ModeV in android/graphics/drawable/Drawable smali in framework.jar. It depends what and where the image is as to which you use. All three methods overlay a color on an existing image and the two with porterduffmode have a means of choosing what effect the overlay has. There is more about this at the bottom of the post.
Lets start....
Things are stored in fields in a smali. At the top of the file you will see them like this:
Code:
.field protected mType:Ljava/lang/String;
.field protected mView:Landroid/view/View;
.field protected mIcon:I
These fields can be used to store things of their type. So in the ones shown above you would put a string, a view and an integer respectively. You can see the type a field should hold after the :
In order to use your own method to get the color from the database we need to add a new field to store the value in so we can use it in another method. For this example i am going to use the toggle icons in lidroids toggle mod but this can be done on pretty much any image you want.
At the top of the smali with the other instance fields add your new field. You can call it whatever you want and it is going to store an integer so you will need an I after the colon. Im calling this one mToggleColor for obvious reasons:
Code:
.field private mToggleColor:I
We now have somewhere to put our value so now we can write the new method. At this point you should refer to the text color guide for explanations about the content resolver, context and registers as I will assume you have an idea about these now.
You can call your method anything you want. It will need 3 registers to store the resolver, default value and integer. This method has no context parameter (in the brackets after the method name) so you would need to use getcontext or mContext....
Code:
.method color_toggles()V
.locals 3
If you are going to use existing context and pass it to your method it would look like this. As you can see the method is expecting context as its parameter when called...
Code:
.method color_toggles(Landroid/content/Context;)V
.locals 3
Now we get the content resolver so we need context. If using the first method then you would need to call your view and invoke getcontext like this in stock toggles:
Code:
iget-object v1, p0, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->mBtnImage:Landroid/widget/ImageView;
invoke-virtual {v1}, Landroid/widget/ImageView;->getContext()Landroid/content/Context;
move-result-object v1
invoke-virtual {v1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
As metioned in the text color guide your contentresolver is now in v1.
If you are passing context to your method then the context is the parameter of the method. Each item in brackets after methods name is stored in a p. So in this case the context would be in p1. All you need to do is use it to get the resolver:
Code:
invoke-virtual {p1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
Again...resolver now in v1.
The next part is identical to the text color guide so i wont repeat it. But you should have now something that looks like this:
Code:
.method color_toggles()V
.locals 3
iget-object v1, p0, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->mBtnImage:Landroid/widget/ImageView;
invoke-virtual {v1}, Landroid/widget/ImageView;->getContext()Landroid/content/Context;
move-result-object v1
const-string v2, "theme_color"
const v3, -0x4d06ff
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v1
or if passing context:
Code:
.method color_toggles(Landroid/content/Context;)V
.locals 3
invoke-virtual {p1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "theme_color"
const v3, -0xcc4a1a
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v1
Both of the above now have your color stored in v1. We can now put it into your new field that you created earlier using iput:
Code:
iput v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mToggleColor:I
This puts the integer in v1 into the field in p0 (this file) and stores it as mToggleColor
Your method is not expected to return anything meaning something doesnt call it and ask for a value in reply so after this we need:
Code:
return-void
....and then to finish the method....
Code:
.end method
The final methods look like this:
Code:
.method color_toggles()V
.locals 3
iget-object v1, p0, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->mBtnImage:Landroid/widget/ImageView;
invoke-virtual {v1}, Landroid/widget/ImageView;->getContext()Landroid/content/Context;
move-result-object v1
const-string v2, "theme_color"
const v3, -0x4d06ff
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v1
iput v1, p0, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->mToggleColor:I
return-void
.end method
Code:
.method color_toggles(Landroid/content/Context;)V
.locals 3
invoke-virtual {p1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "theme_color"
const v3, -0xcc4a1a
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v1
iput v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mColor:I
return-void
.end method
Now your color can be put into your new field we need to invoke your new method. Otherwise it will just be an empty field. You can do this in a number of places. Either directly before you use it or in the methods init. We will come back to this.
In order to color an image you need to find it first. There are ways of calling the image by its id but looking for it this way will familiarise you more with smali. Images can be set using setImageResource and setImageDrawable. If you search firstly for the images id in the smalis to find the correct file and if that doesnt find anything then have a look at file names and see what you can find that looks like it might be right. In this case PowerButton smali has a method called :
Code:
.method private updateImageView(II)V
...which uses setImageResource(I)V. Sounds like a good place to start!
Code:
.method private updateImageView(II)V
.locals 2
iget-object v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v1, p1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/ImageView;
invoke-virtual {v0, p2}, Landroid/widget/ImageView;->setImageResource(I)V
return-void
.end method
We need to invoke your new method. If you are not passing context you can just do this:
Code:
invoke-virtual {p0}, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->color_toggles()V
...which will invoke your new method and put your color in your field.
Or to pass context you would do:
Code:
invoke-virtual {v1}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v1
invoke-virtual {p0, v1}, Lcom/alliance/systemui/quickpanel/PowerButton;->color_toggles(Landroid/content/Context;)V
In the above code the method you are in has a Landroid/view/View; stored in v1. You can use getContext on this and then invoke your method. The invoke says to call your method color_toggles(Landroid/content/ContextV which is in this file (p0) with the parameter v1 (the context). Now your method has run we can use iget to get the color from the field:
Code:
iget v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mColor:I
You can see in the original updateImage method that the imageView is in v0. We can now apply the color (in v1) to the image (v0).
Code:
invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setColorFilter(I)V
Final methods would look like this:
Code:
.method private updateImageView(II)V
.locals 2
invoke-virtual {p0}, Lcom/android/systemui/statusbar/policy/quicksetting/QuickSettingButton;->color_toggles()V
iget-object v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v1, p1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/ImageView;
invoke-virtual {v0, p2}, Landroid/widget/ImageView;->setImageResource(I)V
iget v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mColor:I
invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setColorFilter(I)V
return-void
.end method
or
Code:
.method private updateImageView(II)V
.locals 2
iget-object v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v1, p1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/ImageView;
invoke-virtual {v0, p2}, Landroid/widget/ImageView;->setImageResource(I)V
invoke-virtual {v1}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v1
invoke-virtual {p0, v1}, Lcom/alliance/systemui/quickpanel/PowerButton;->color_toggles(Landroid/content/Context;)V
iget v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mColor:I
invoke-virtual {v0, v1}, Landroid/widget/ImageView;->setColorFilter(I)V
return-void
.end method
Your source image should be white. You can make them semi transparent so the color is not as bright. For example the off toggles could be 50% transparent so they will only appear dim compared to the on ones.
You will notice in PowerButton smali there is another method....
Code:
.method private updateImageView(ILandroid/graphics/drawable/Drawable;)V
.locals 2
iget-object v1, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v1, p1}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/ImageView;
invoke-virtual {v0, p2}, Landroid/widget/ImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
return-void
.end method
This is the same except it uses 2 parameters (in the brackets after the name) of and (I)nteger and Landroid/graphics/drawable/Drawable rather than two (I)ntegers.
You don't HAVE to use your own method. You could just use identical code to the textColor code straight after the setImageResource and invoke setColorFilter on the ImageView rather than setTextColor on a TextView. But I think it is good practice to use a new method
PorterDuffMode
Sometimes when you implement a color picker you will get an outcome you dont want like a battery that had a a white centre and the fill in a color wouldnt show the level as it would all have the same color overlay. Instead of using setColorFilter(I)V you can use setColorFilter(ILandroid/graphics/PorterDuff$ModeV.
If you are familiar with Photoshop you may be better than me at this but basically it changes the way the color is laid over. Using different modes will give different results. As Im not great with Photoshop for me its more trial and error!
There are lots of different modes:
PorterDuff.Mode ADD Saturate(S + D)
PorterDuff.Mode CLEAR [0, 0]
PorterDuff.Mode DARKEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]
PorterDuff.Mode DST [Da, Dc]
PorterDuff.Mode DST_ATOP [Sa, Sa * Dc + Sc * (1 - Da)]
PorterDuff.Mode DST_IN [Sa * Da, Sa * Dc]
PorterDuff.Mode DST_OUT [Da * (1 - Sa), Dc * (1 - Sa)]
PorterDuff.Mode DST_OVER [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc]
PorterDuff.Mode LIGHTEN [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]
PorterDuff.Mode MULTIPLY [Sa * Da, Sc * Dc]
PorterDuff.Mode OVERLAY
PorterDuff.Mode SCREEN [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]
PorterDuff.Mode SRC [Sa, Sc]
PorterDuff.Mode SRC_ATOP [Da, Sc * Da + (1 - Sa) * Dc]
PorterDuff.Mode SRC_IN [Sa * Da, Sc * Da]
PorterDuff.Mode SRC_OUT [Sa * (1 - Da), Sc * (1 - Da)]
PorterDuff.Mode SRC_OVER [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]
PorterDuff.Mode XOR [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
The letters in CAPITALS are the what you put as the parameter.
I have found that MULTIPLY is the most useful. SRC_ATOP is used as default in setColorFilter(I)V
To use one you need to put the mode into a register. You do that using sget:
Code:
sget-object v1, Landroid/graphics/PorterDuff$Mode;->MULTIPLY:Landroid/graphics/PorterDuff$Mode;
Then you call the porterduff setcolorfilter method instead of the normal one. Like this:
invoke-virtual {v6, v12, v1}, Landroid/widget/ImageView;->setColorFilter(ILandroid/graphics/PorterDuff$ModeV
...instead of this:
invoke-virtual {v6, v12}, Landroid/widget/ImageView;->setColorFilter(I)V
There is a good article here
Please ask if anything is unclear.
Toggles
You have learnt how to get a value from the database creating a toggle is pretty straightforward. For this example I will use toggling the text on lidroid toggles but you can use this on anything from settings button in statusbar to things stopping auto scroll on toggles etc.
Again we start by finiding the method we need to mod. Look at the top of smali files for the field names. This may help you to find the item you wish to toggle. Method names will also help you find your place. In this example we can see in PowerButton smali there is a method called:
Code:
.method protected updateText()V
Obvious huh! It wont always be that easy to find so i will cover how to call something by it's ID later in this post.
In this method you can see that the text is set by calling the setText method. There are two ways to do this. The obvious thing to do is not to run this line so the text will not be set. This is the first way i will cover and it is the way that things are toggled such as ink effect or crt etc rather than showing/hiding things. I will get to that later.
TURNING THINGS ON/OFF
We need to read that value into our smali. This is done in exactly the same way as a color so if you are not sure please go back and read those posts.
This would be added the line before the setText call....
Code:
iget-object v3, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v3}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v3
...dont forget to add to .locals if you are using a new register!! That gets us context so now we can...
Code:
const-string v4, "toggle_text"
const v5, 0x1
invoke-static {v3, v4, v5}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
...which gets the value from the database which will be 1 or 0 for on/off and puts it into v3.
To toggle something we then act on that value. The if-eqz checks if a value is zero. So the next line would be:
Code:
if-eqz v3, :cond_skip_text
....as you can see, if v3 is zero then it goes to the condition skip_text.
All we need to do now is make a new cond called skip_text after the setText line so it effectively does just that.....skips the setText. Right before return-void put:
Code:
:cond_skip_text
That's it. All you have to do with a toggle to turn something on or off is skip the chunk of text that does what you want to stop. So as long as your new cond comes after it then it should work
SHOWING/HIDING
This works in exactly the same way as above but instead of skipping code you are going to use setVisibility(I)V method.
We have got the value from the database as we did before:
Code:
iget-object v3, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v3}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v3
const-string v4, "toggle_text"
const v5, 0x1
invoke-static {v3, v4, v5}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
if-nez v3, :cond_show_text
To hide something we must set visibility of the item to "gone". The value for this is 0x8. Visible is 0x1. If the database value returns 0 then the item is unchecked and so should be hidden. If it returns 1 then the item should be visible.
If the value from the database was 1 and the checkbox was ticked then you can use the value in v3 as the value for setVisibility. If it was 0 then the value needs to be set to 0x8 for "gone". We can put 0x8 into v4 here because the line will be skipped if the checkbox was checked:
Code:
const v3, 0x8
....now we add the new cond:
Code:
:cond_show_text
and invoke the set visibility which now has either 0x1 or 0x8 in it.
Code:
invoke-virtual {v1, v3}, Landroid/widget/TextView;->setVisibility(I)V
This tells the code to find the place labelled :goto_new so we add that straight after the code that sets visibility to shown. The full code would look like this....
Code:
iget-object v3, p0, Lcom/alliance/systemui/quickpanel/PowerButton;->mView:Landroid/view/View;
invoke-virtual {v3}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v3
const-string v4, "toggle_text"
const v5, 0x1
invoke-static {v3, v4, v5}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
if-nez v3, :cond_show_text
const v4, 0x8
:cond_show_text
invoke-virtual {v1, v4}, Landroid/widget/TextView;->setVisibility(I)V
Thats it!
CALLING THINGS BY ID
Say you wanted to make a show/hide for the recents button that can be added to dropdown header. You can call it by it's public ID and then use setvisibility. Create a new method like you did for coloring images (refer to that guide if unsure), get a value from the database, test for non-zero and skip to cond. You can use mCcontext here from in Phonestatusbar:
Code:
.method Update_recents()V
.locals 6
iget-object v1, p0, Lcom/android/systemui/SystemUI;->mContext:Landroid/content/Context;
invoke-virtual {v1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "recents_button"
const/4 v3, 0x1
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
if-nez v3, :cond_1
const v3, 0x8
Now to get the image we can use findViewById method. In order to use it we need the parent view that contains the image. In Phonestatusbar you can get to most stuff by using the field mStatusBarWindow.
Code:
iget-object v4, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mStatusBarWindow:Lcom/android/systemui/statusbar/phone/StatusBarWindowView;
Now we get the id of the image from public.xml and put it into a register:
Code:
const v5, 0x7f0d0014
....and then findViewById. This method expects an integer as a parameter which we have in v5...
Code:
invoke-virtual {v4, v5}, Lcom/android/systemui/statusbar/phone/StatusBarWindowView;->findViewById(I)Landroid/view/View;
move-result-object v4
Now we have the item we can setVisibility with the value in v3:
Code:
:cond_1
invoke-virtual {v4, v3}, Landroid/widget/LinearLayout;->setVisibility(I)V
In this case I used LinearLayout but you can use imageView or whatever depending what you are doing. The full method would look like this:
Code:
.method Update_recents()V
.locals 6
iget-object v1, p0, Lcom/android/systemui/SystemUI;->mContext:Landroid/content/Context;
invoke-virtual {v1}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "recents_button"
const/4 v3, 0x1
invoke-static {v1, v2, v3}, Landroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I
move-result v3
if-nez v3, :cond_1
const/4 v3, 0x8
:cond_1
iget-object v5, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mStatusBarWindow:Lcom/android/systemui/statusbar/phone/StatusBarWindowView;
const v6, 0x7f0d0014
invoke-virtual {v5, v6}, Lcom/android/systemui/statusbar/phone/StatusBarWindowView;->findViewById(I)Landroid/view/View;
move-result-object v4
invoke-virtual {v4, v3}, Landroid/widget/LinearLayout;->setVisibility(I)V
return-void
.end method
All we need to do now is to call the method. The best place for this is during makestatusbarview. I put it right after the settings button is set but you can put it in loads of places. It just invokes update_recents_button in p0 (this file):
Code:
iget-object v9, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButton:Landroid/widget/ImageView;
iget-object v10, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->mSettingsButtonListener:Landroid/view/View$OnClickListener;
invoke-virtual {v9, v10}, Landroid/widget/ImageView;->setOnClickListener(Landroid/view/View$OnClickListener;)V
[COLOR="Red"] invoke-virtual {p0}, Lcom/android/systemui/statusbar/phone/PhoneStatusBar;->update_recents_button()V[/COLOR]
Thats all for now
USEFUL POSTS:
NOTEPAD++ SMALI HIGHLIGHTING - Thanks to @majdinj
LIST OF DALVIK OPCODES - Thanks to @majdinj
last one
one more actually
Goldie you are the best. Thanks. :victory:
finally, you're the grand master
thank you
Hope my ramblings make sense!
Very good. Thanks for all your hard work
What a fantastic guide. Top work Goldieking
Sent from my PurifieD S4
Finally !!
Was thinking you had abandoned the project
Now the challenge is on for who can make the first one thats not dropdown date
Sent from my GT-I9305 using Tapatalk
Sorry buddy for no feedback on your fantastic guide, I got busy with ither stuffs.
But I must say hey you reveal the secreat of samsuck and your hard work with us.
trying to work with smali
Hi Goldieking I'm trying to modify my SecSettings.apk trying to make a mod for toggle
In Settings/display i'm trying to add a ListPreference to show something like this
{
"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"
}
In my DisplaySetting.smali i've add this in red:
Code:
.field private mSmartRotationAnimationImage:[I
.field private mSmartStayAnimationImage:[I
.field mStatusbarColor:Lcom/loser/colorpicker/ColorPickerPreference;
.field mSupportFolderType:Z
[COLOR="Red"].field private mTogglesStyle:Landroid/preference/ListPreference;[/COLOR]
.field private mTouchKeyLight:Landroid/preference/ListPreference;
In the .method public onCreate(Landroid/os/Bundle)V i've add this
Code:
const-string v12, "battery_icon_list"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/ListPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mBatteryStyle:Landroid/preference/ListPreference;
const-string v12, "battery_icon_list"
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
iget-object v13, p0, Lcom/android/settings/DisplaySettings;->mBatteryStyle:Landroid/preference/ListPreference;
invoke-static {v12}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v12
invoke-virtual {v13, v12}, Landroid/preference/ListPreference;->setValue(Ljava/lang/String;)V
iget-object v13, p0, Lcom/android/settings/DisplaySettings;->mBatteryStyle:Landroid/preference/ListPreference;
invoke-virtual {v13, p0}, Landroid/preference/SwitchPreferenceScreen;->setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V
[COLOR="Red"] const-string v12, "toggles_icon_list"
invoke-virtual {p0, v12}, Lcom/android/settings/DisplaySettings;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;
move-result-object v12
check-cast v12, Landroid/preference/ListPreference;
iput-object v12, p0, Lcom/android/settings/DisplaySettings;->mTogglesStyle:Landroid/preference/ListPreference;
const-string v12, "toggles_icon_list"
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
iget-object v13, p0, Lcom/android/settings/DisplaySettings;->mTogglesStyle:Landroid/preference/ListPreference;
invoke-static {v12}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v12
invoke-virtual {v13, v12}, Landroid/preference/ListPreference;->setValue(Ljava/lang/String;)V
iget-object v13, p0, Lcom/android/settings/DisplaySettings;->mTogglesStyle:Landroid/preference/ListPreference;
invoke-virtual {v13, p0}, Landroid/preference/SwitchPreferenceScreen;->setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V[/COLOR]
And in the .method public onPreferenceChange i' ve add this:
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
[COLOR="Red"] if-eqz v0, :cond_13 [/COLOR]
.line 1089
check-cast p2, Ljava/lang/Boolean;
invoke-virtual {p2}, Ljava/lang/Boolean;->booleanValue()Z
move-result v0
if-eqz v0, :cond_e
move v0, v6
.line 1090
:goto_6
Code:
:cond_11
move-wide v0, v4
goto/16 :goto_3
:cond_12
iget-object v1, p0, Lcom/android/settings/DisplaySettings;->mBatteryStyle:Landroid/preference/ListPreference;
if-ne p1, v1, :cond_2
check-cast p2, Ljava/lang/String;
invoke-static {p2}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
move-result v0
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "battery_icon_list"
invoke-static {v1, v2, v0}, Landroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
goto/16 :goto_4
[COLOR="Red"][/COLOR] :cond_13
iget-object v1, p0, Lcom/android/settings/DisplaySettings;->mTogglesStyle:Landroid/preference/ListPreference;
if-ne p1, v1, :cond_1
check-cast p2, Ljava/lang/String;
invoke-static {p2}, Ljava/lang/Integer;->valueOf(Ljava/lang/String;)Ljava/lang/Integer;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
move-result v0
invoke-virtual {p0}, Lcom/android/settings/DisplaySettings;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
const-string v2, "toggles_icon_list"
invoke-static {v1, v2, v0}, Landroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z
goto/16 :goto_4 [/COLOR]
.end method
The logcat show this:
Code:
W/dalvikvm( 3982): VFY: register1 v0 type 5, wanted ref
W/dalvikvm( 3982): VFY: bad arg 1 (into Ljava/lang/Object;)
W/dalvikvm( 3982): VFY: rejecting call to Ljava/lang/String;.equals (Ljava/lang/Object;)Z
W/dalvikvm( 3982): VFY: rejecting opcode 0x6e at 0x0215
W/dalvikvm( 3982): VFY: rejected Lcom/android/settings/DisplaySettings;.onPreferenceChange (Landroid/preference/Preference;Ljava/lang/Object;)Z
W/dalvikvm( 3982): Verifier rejected class Lcom/android/settings/DisplaySettings;
W/dalvikvm( 3982): Class init failed in newInstance call (Lcom/android/settings/DisplaySettings;)
D/AndroidRuntime( 3982): Shutting down VM
W/dalvikvm( 3982): threadid=1: thread exiting with uncaught exception (group=0x41af32a0)
E/AndroidRuntime( 3982): FATAL EXCEPTION: main
E/AndroidRuntime( 3982): java.lang.VerifyError: com/android/settings/DisplaySettings
E/AndroidRuntime( 3982): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime( 3982): at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime( 3982): at android.app.Fragment.instantiate(Fragment.java:577)
E/AndroidRuntime( 3982): at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1229)
E/AndroidRuntime( 3982): at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1245)
E/AndroidRuntime( 3982): at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:618)
E/AndroidRuntime( 3982): at com.android.settings.Settings.onCreate(Settings.java:191)
E/AndroidRuntime( 3982): at android.app.Activity.performCreate(Activity.java:5206)
E/AndroidRuntime( 3982): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
E/AndroidRuntime( 3982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
E/AndroidRuntime( 3982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
E/AndroidRuntime( 3982): at android.app.ActivityThread.access$700(ActivityThread.java:140)
E/AndroidRuntime( 3982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
E/AndroidRuntime( 3982): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3982): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 3982): at android.app.ActivityThread.main(ActivityThread.java:4921)
E/AndroidRuntime( 3982): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3982): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 3982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
E/AndroidRuntime( 3982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
E/AndroidRuntime( 3982): at dalvik.system.NativeStart.main(Native Method)
So i know i make errors in the .method public onPreferenceChange (Landroid/preference/Preference;Ljava/lang/ObjectZ
can you teach me how to add new lines to make it work?
Ummm.....I always use custom settings for a list which means I only gotta add a single line but in cond_d you have the same lines twice for contextualpage_settings where you move boolean result into v0 then use it as an object in the next lines. Are you sure you didnt change something there? Those four lines were already repeated?
Without looking at the file its difficult to tell but something looks wrong here...
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
[COLOR="Red"] if-eqz v0, :cond_13[/COLOR]
Sent from my GT-I9305 using Tapatalk
Goldieking said:
Ummm.....I always use custom settings for a list which means I only gotta add a single line but in cond_d you have the same lines twice for contextualpage_settings where you move boolean result into v0 then use it as an object in the next lines. Are you sure you didnt change something there? Those four lines were already repeated?
Without looking at the file its difficult to tell but something looks wrong here...
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
[COLOR="Red"] if-eqz v0, :cond_13[/COLOR]
Sent from my GT-I9305 using Tapatalk
Click to expand...
Click to collapse
I'm sorry you're right i've add this:
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
[COLOR="Red"] const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_13[/COLOR]
so i've to delete this lines?
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/ObjectZ
move-result v0
edit:I tried to change the lines above whit those:
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
[COLOR="Red"] invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_13[/COLOR]
but it doesn't work again ,you try to look in my file
View attachment DisplaySettings.zip
This is a great guide.
Thanks very much, Goldie...
remuntada78 said:
I'm sorry you're right i've add this:
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
[COLOR="Red"] const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_13[/COLOR]
so i've to delete this lines?
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/ObjectZ
move-result v0
edit:I tried to change the lines above whit those:
Code:
:cond_d
const-string v2, "contextualpage_settings"
invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_12
[COLOR="Red"] invoke-virtual {v2, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_13[/COLOR]
but it doesn't work again ,you try to look in my file
View attachment 2340166
Click to expand...
Click to collapse
Hard on phone but try this...
https://db.tt/ocnydt7E
Sent from my GT-I9305 using Tapatalk
hello recently my device have a custom rom miui 8 based on stockrom aosp android 6.0.1 (mmb29m) but have some issue, when im trying to copypaste or insert a text on application like facebook,instagram, or anyother socialmedia apps, its become force close im trying to compare with other miui8 based on cyanogenmod but still no luck.
here is a logcat
Code:
6-07 08:34:22.987 E/AndroidRuntime(27228): FATAL EXCEPTION: main
06-07 08:34:22.987 E/AndroidRuntime(27228): Process: com.miui.notes, PID: 27228
06-07 08:34:22.987 E/AndroidRuntime(27228): java.lang.VerifyError: Verifier rejected class android.widget.Editor$InsertionHandleView due to bad method void android.widget.Editor$InsertionHandleView.createAnimations() (declaration of 'android.widget.Editor$InsertionHandleView' appears in /system/framework/framework.jar:classes3.dex)
06-07 08:34:22.987 E/AndroidRuntime(27228): at android.widget.Editor$InsertionPointCursorController.getHandle(Editor.java:4623)
06-07 08:34:22.987 E/AndroidRuntime(27228): at android.widget.Editor$InsertionPointCursorController.show(Editor.java:4598)
06-07 08:34:22.987 E/AndroidRuntime(27228): at android.widget.Editor.onTouchUpEvent(Editor.java:1947)
06-07 08:34:22.987 E/AndroidRuntime(27228): at android.widget.TextView.onTouchEvent(TextView.java:8356)
06-07 08:34:22.987 E/AndroidRuntime(27228): at com.miui.notes.editor.RichEditView.onTouchEvent(RichEditView.java:1026)
06-07 08:34:22.987 E/AndroidRuntime(27228): at android.view.View.dispatchTouchEvent(View.java:9402)
06-07 08:34:22.987 E/AndroidRuntime(27228): at com.miui.notes.editor.RichEditView.dispatchTouchEvent(RichEditView.java:1018)
thats logcat when im trying to copy paste or insert text on notepad apps (miui apps)
and this is smali (maybe) thats cause forceclose
Code:
.method private createAnimations()V
.registers 10
.prologue
const/4 v8, 0x1
const/4 v7, 0x0
const/4 v6, 0x2
.line 4877
new-instance v2, Landroid/animation/AnimatorSet;
invoke-direct {v2}, Landroid/animation/AnimatorSet;-><init>()V
iput-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeIn:Landroid/animation/AnimatorSet;
.line 4878
sget-object v2, Landroid/view/View;->SCALE_X:Landroid/util/Property;
new-array v3, v6, [F
fill-array-data v3, :array_7e
invoke-static {p0, v2, v3}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;
move-result-object v0
.line 4879
.local v0, "scaleAnimatorX":Landroid/animation/ObjectAnimator;
sget-object v2, Landroid/view/View;->SCALE_Y:Landroid/util/Property;
new-array v3, v6, [F
fill-array-data v3, :array_86
invoke-static {p0, v2, v3}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;
move-result-object v1
.line 4880
.local v1, "scaleAnimatorY":Landroid/animation/ObjectAnimator;
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeIn:Landroid/animation/AnimatorSet;
new-instance v3, Lmiui/view/animation/BackEaseOutInterpolator;
invoke-direct {v3}, Lmiui/view/animation/BackEaseOutInterpolator;-><init>()V
invoke-virtual {v2, v3}, Landroid/animation/AnimatorSet;->setInterpolator(Landroid/animation/TimeInterpolator;)V
.line 4881
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeIn:Landroid/animation/AnimatorSet;
const-wide/16 v4, 0x12c
invoke-virtual {v2, v4, v5}, Landroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/AnimatorSet;
.line 4882
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeIn:Landroid/animation/AnimatorSet;
new-array v3, v6, [Landroid/animation/Animator;
aput-object v0, v3, v7
aput-object v1, v3, v8
invoke-virtual {v2, v3}, Landroid/animation/AnimatorSet;->playTogether([Landroid/animation/Animator;)V
.line 4884
new-instance v2, Landroid/animation/AnimatorSet;
invoke-direct {v2}, Landroid/animation/AnimatorSet;-><init>()V
iput-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeOut:Landroid/animation/AnimatorSet;
.line 4885
sget-object v2, Landroid/view/View;->SCALE_X:Landroid/util/Property;
new-array v3, v6, [F
fill-array-data v3, :array_8e
invoke-static {p0, v2, v3}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;
move-result-object v0
.line 4886
sget-object v2, Landroid/view/View;->SCALE_Y:Landroid/util/Property;
new-array v3, v6, [F
fill-array-data v3, :array_96
invoke-static {p0, v2, v3}, Landroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;
move-result-object v1
.line 4887
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeOut:Landroid/animation/AnimatorSet;
new-instance v3, Lmiui/view/animation/CubicEaseOutInterpolator;
invoke-direct {v3}, Lmiui/view/animation/CubicEaseOutInterpolator;-><init>()V
invoke-virtual {v2, v3}, Landroid/animation/AnimatorSet;->setInterpolator(Landroid/animation/TimeInterpolator;)V
.line 4888
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeOut:Landroid/animation/AnimatorSet;
const-wide/16 v4, 0x96
invoke-virtual {v2, v4, v5}, Landroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/AnimatorSet;
.line 4889
iget-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeOut:Landroid/animation/AnimatorSet;
new-array v3, v6, [Landroid/animation/Animator;
aput-object v0, v3, v7
aput-object v1, v3, v8
invoke-virtual {v2, v3}, Landroid/animation/AnimatorSet;->playTogether([Landroid/animation/Animator;)V
.line 4891
new-instance v2, Landroid/widget/Editor$InsertionHandleView$2;
invoke-direct {v2, p0}, Landroid/widget/Editor$InsertionHandleView$2;-><init>(Landroid/widget/Editor$InsertionHandleView;)V
iput-object v2, p0, Landroid/widget/Editor$InsertionHandleView;->mAnimationFadeOutListener:Landroid/animation/AnimatorListenerAdapter;
.line 4897
return-void
.line 4878
nop
:array_7e
.array-data 4
0x0
0x3f800000 # 1.0f
.end array-data
.line 4879
:array_86
.array-data 4
0x0
0x3f800000 # 1.0f
.end array-data
.line 4885
:array_8e
.array-data 4
0x3f800000 # 1.0f
0x0
.end array-data
.line 4886
:array_96
.array-data 4
0x3f800000 # 1.0f
0x0
.end array-data
.end method
thank you before