I have made another script listening directly to Location API.
I use it in my car’s head unit for GPS speedometer.
Although GPS speed can be obtained with my other script that takes data from Torque, this one makes it unnecessary to use Torque, and may get data updates just a little bit sooner.
The variables set by script are:
gps_live – boolean – indicates that location API is ready (i.e. enabled and ready)
gps_speed – float – the speed in m/s (must be multiplied by 3.6 to get km/h)
To use, make text with binding like follows:
($gps_speed * 3.6).toFixed(0)
Also, text display can be bound to $gps_live
The script requires a permission which is missing in LLX:
android.permission.ACCESS_FINE_LOCATION
To make it work, either wait for developers to add a permission APK for that, or use this xposed module by Lukas Morawietz (if you are using xposed framework): https://play.google.com/store/apps/details?id=com.faendir.lightning_launcher.permission_manager
— cut —
LL.bindClass(“android.location.LocationManager”);
LL.bindClass(“android.location.LocationProvider”);
LL.bindClass(“android.location.LocationListener”);
LL.getVariables()
.edit()
.setBoolean(“gps_live”, true)
.setFloat(“gps_speed”, 0)
.commit();
var locationManager = LL.getContext().getSystemService(Context.LOCATION_SERVICE);
var locationListener = new LocationListener({
onLocationChanged: function(location) {
if(!location.hasSpeed()) return;
var speed = location.getSpeed();
LL.getVariables()
.edit()
.setFloat(“gps_speed”, speed)
.commit();
},
onProviderDisabled: function(provider) {
LL.getVariables()
.edit()
.setBoolean(“gps_live”, false)
.commit();
},
onProviderEnabled: function(provider) {
LL.getVariables()
.edit()
.setBoolean(“gps_live”, true)
.commit();
},
onStatusChanged: function(provider, status, extras) {
LL.getVariables()
.edit()
.setBoolean(“gps_live”, status == LocationProvider.AVAILABLE)
.commit();
}
});
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
— cut –
Lukas Morawietz
So I confirm the colors
Red when not applied and black when applied
On system theme here
V1.6 before Apply and After


Developers, please create new permission package with
android.permisssion.ACCESS_FINE_LOCATION
and maybe it is also worth adding
android.permisssion.ACCESS_COARSE_LOCATION
Thanks!
]]>My LLx at the moment
My LLx at the moment
I love it
Just Pierre Hébert could you check why I can’t use scripts on resumed event of the widgets
]]>I am a new user for this launcher and couldn’t find how to put “unread count” on icons I want such as messaging…
I am a new user for this launcher and couldn’t find how to put “unread count” on icons I want such as messaging Gmail e-mail and phone app. Help pls 😞
I would like to share my script for users of Torque https://play.google.com/store/apps/details?id=org.prowl.torque
This script allows reading any PIDs from Torque service, for latter use in bindings.
Set it to be run on desktop load.
It will set the following variables:
tq_live – boolean – whether we are connected to Torque service
tq_ecu – boolean – whether Torque is connected to Engine ECU
tq_version – integer – the version of Torque
tq_xxx – float – the value of pid, where xxx is a name of pid as configured at the top of script, you may configure multiple PIDs; see below
— cut —
var refreshInterval = 200;
var pids = [
{pid: 0xff1001, name: “gps_speed”},
{pid: 0xff123A, name: “gps_locked”},
{pid: 0x0c, name: “rpm”},
{pid: 0x42, name: “voltage”}
];
LL.bindClass(“android.os.Parcel”);
LL.bindClass(“android.content.ServiceConnection”);
var binder = null;
var timer = null;
function callSvc(code, fp, fr, def) {
if (binder == null) return def;
var p = Parcel.obtain();
var r = Parcel.obtain();
try {
p.writeInterfaceToken(“org.prowl.torque.remote.ITorqueService”);
if (fp != null) fp(p);
binder.transact(code, p, r, 0);
return r.readExceptionCode() == 0 && (fr != null) ? fr(r) : def;
}
catch (err) {
return def;
}
finally {
r.recycle();
p.recycle();
}
}
// int getVersion()
function getVersion() { return callSvc(
1,
null,
function(r) { return r.readInt(); },
0
); }
// float getValueForPid(long pid, boolean triggersDataRefresh);
function getValueForPid(pid, refresh) { return callSvc(
2,
function(p) { p.writeLong(pid); p.writeByte(refresh ? 1 : 0); },
function(r) { return r.readFloat(); },
0
); }
// boolean isConnectedToECU();
function isConnectedToECU() { return callSvc(
15,
null,
function(r) { return r.readByte() != 0; },
false
); }
function reset() {
var v = LL.getVariables().edit();
v.setBoolean(“tq_live”, false);
v.setBoolean(“tq_ecu”, false);
v.setInteger(“tq_version”, 0);
for(var i = 0; i < pids.length; i++)
v.setFloat(“tq_” + pids[i].name, 0);
v.commit();
}
function refresh() {
if (binder == null) return;
var v = LL.getVariables().edit();
v.setBoolean(“tq_ecu”, isConnectedToECU());
for(var i = 0; i < pids.length; i++)
v.setFloat(“tq_” + pids[i].name, getValueForPid(pids[i].pid, true));
v.commit();
timer = setTimeout(refresh, refreshInterval);
}
var conn = new ServiceConnection({
onServiceConnected: function (n, b) {
binder = b;
var v = LL.getVariables().edit();
v.setBoolean(“tq_live”, true);
v.setInteger(“tq_version”, getVersion());
v.commit();
refresh();
},
onServiceDisconnected: function(n) {
binder = null;
reset();
}
});
reset();
var intent = new Intent();
intent.setClassName(“org.prowl.torque”, “org.prowl.torque.remote.TorqueService”);
var success = LL.getContext().bindService(intent, conn, 1);
— cut —




D5 Creation