I've been happily using my Galaxy S II for the last few months, and of course I've replaced the original firmware with a custom one.
However, recently a colleague acquired one as well. His had the stock Orange firmware, and has a special app called "Signal Boost". Searching around, I found that this is actually an implementation of GAN / UMA. I'd heard of this technology, but wasn't aware it was available with Android. As it turns out, it has been implemented by Kineto. The net effect is the phone will tunnel through your local WIFI and use that instead of the GSM network. This is quite handy if you're in a crap signal area. Of course, your mobile nework has to support it, and luckily Orange do in the UK.
I'm using cyanogenmod 7.1 on my phone, and as this is a proprietary impementation of GAN, it is not included. However, they have included the kernel-side device, gan-eth required by the proprietary user space code, which makes things a lot easier.
Basically, we need to extract a few files from the Orange ROM and add them into the cyanogen ROM on the phone, and that's about it: I have it working on my phone now.
The following instructions are using Linux for the extraction, and cyanogenmod on the phone, but I assume they'll be similar for other ROMs.
Oh, and obviously doing this is entirely at your own risk, will void your warranty and eat your gerbils etc etc.
You will need:
- Orange UK rom image downloaded from this page. Grab the BVKG3 one for Orange UK.
- The simg2img utility from here (you'll need to compile it). If you run Arch Linux, there's an AUR build for it called "ext4_utils".
- ADB, and developer mode enabled on the phone.
The following will extract the files on the Linux machine:
7z x GT-I9100_ORA_I9100BVKG3_I9100BVKG2_I9100ORAKG3.exe tar xf GT-I9100_ORA_I9100BVKG3_I9100BVKG2_I9100ORAKG3.TAR simg2img cache.img cache.raw mkdir c mount -o loop cache.raw c cp c/recovery/sec_csc.zip . unzip sec_csc.zip umount c simg2img factoryfs.img factoryfs.raw mount -o loop factoryfs.raw c cp c/lib/libsec-ril.so . umount c
Now, copy and paste the following into a text file called "default.prop":
rild.libpath=/system/lib/librilswitch.so rilswitch.vendorlibpath=/system/lib/libsec-ril.so rilswitch.ganlibpath=/system/lib/libganril.so
After that, you'll have all the files needed. Plug in your phone to USB to push the files across with adb as follows:
adb shell remount -o rw,remount /system adb push system/lib/libganril.so /system/lib adb push system/lib/libkineto.so /system/lib adb push system/lib/librilswitch.so /system/lib adb push system/app/WiFi-Calling.apk /system/app adb push libsec_ril.so /system/lib adb push default.prop /system
Finally, reboot the phone, go to the Signal boost app, and enable it. After a few seconds (assuming your wifi is strong enough) the red house icon on your status bar should go green, and the GSM signal bars should drop to 0. If you use "adb logcat", you can see lots of output as it negotiates the connection.
I originally tried this using the libsec-ril.so that came with cyanogen, but logcat showed rild crashed as soon as I tried to enable wifi calling. The one from the orange rom solved this. I'm assuming it either needs some sort of co-operation from the hardware RIL, or unloading the RIL on the fly hadn't ever really been tested before.
It sounds like its switching the RIL implementation on the fly, which is quite cool.
I wish this was a standard feature of android; it might encourage more networks to support it.