mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-11 00:12:24 +01:00
launcher: a patched Waze, signed with someone else's key, loses the red X and can start as the map app
This commit is contained in:
1 parent
0177975bc8
commit
db6f1b8e82
3 files changed
+31
-3
No files matched your search
@@ -239,6 +239,7 @@ internal fun launchEntry(entry: Entry, navigator: CarNavigator, frame: CarEnviro
|
|||||||
/** The app launcher: every app as an icon grid, grouped Phone, Maps, Music, Messaging, Web, Screen sharing, Settings. */
|
/** The app launcher: every app as an icon grid, grouped Phone, Maps, Music, Messaging, Web, Screen sharing, Settings. */
|
||||||
@Composable
|
@Composable
|
||||||
fun CarLauncher() {
|
fun CarLauncher() {
|
||||||
|
val context = LocalContext.current
|
||||||
val navigator = LocalCarNavigator.current
|
val navigator = LocalCarNavigator.current
|
||||||
val frame by CarEnvironment.frame.collectAsState()
|
val frame by CarEnvironment.frame.collectAsState()
|
||||||
|
|
||||||
@@ -254,7 +255,7 @@ fun CarLauncher() {
|
|||||||
val id = entry.componentId
|
val id = entry.componentId
|
||||||
return Tile(
|
return Tile(
|
||||||
entry.label, entry.icon, entry.builtIn?.glyph,
|
entry.label, entry.icon, entry.builtIn?.glyph,
|
||||||
broken = pkg != null && (KnownApps.isBroken(pkg) || (entry.template != null && KnownApps.screenBroken(pkg))),
|
broken = pkg != null && (KnownApps.isBroken(context, pkg) || (entry.template != null && KnownApps.screenBroken(pkg))),
|
||||||
onLongClick = id?.let { { navigator.showAppMenu(it) } },
|
onLongClick = id?.let { { navigator.showAppMenu(it) } },
|
||||||
) { openApp(entry, id?.let { running[it] }, navigator, frame) }
|
) { openApp(entry, id?.let { running[it] }, navigator, frame) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ object CarServices {
|
|||||||
_hasNavApps.value = navApps.isNotEmpty()
|
_hasNavApps.value = navApps.isNotEmpty()
|
||||||
// Never auto-pick one already known to fail outright - a driver who plugs in should
|
// Never auto-pick one already known to fail outright - a driver who plugs in should
|
||||||
// land on a map, not on the one tile marked with a red X.
|
// land on a map, not on the one tile marked with a red X.
|
||||||
val candidates = navApps.filterNot { KnownApps.isBroken(it.component.packageName) }
|
val candidates = navApps.filterNot { KnownApps.isBroken(ctx, it.component.packageName) }
|
||||||
val last = CarSettings.lastNav.value
|
val last = CarSettings.lastNav.value
|
||||||
// The one used last, or - first run, nothing on record yet - whichever comes first:
|
// The one used last, or - first run, nothing on record yet - whichever comes first:
|
||||||
// a driver who plugs in for the first time shouldn't have to go pick one by hand
|
// a driver who plugs in for the first time shouldn't have to go pick one by hand
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
package app.seb3thehacker.gearslip.host
|
package app.seb3thehacker.gearslip.host
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import java.security.MessageDigest
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Apps that have been run through Gearslip from start to finish and behave. The launcher marks
|
* Apps that have been run through Gearslip from start to finish and behave. The launcher marks
|
||||||
* them so a driver can pick something that works without finding out at the wheel.
|
* them so a driver can pick something that works without finding out at the wheel.
|
||||||
@@ -65,7 +69,30 @@ object KnownApps {
|
|||||||
"com.generalmagic.magicearth", // Magic Earth: never gets past connecting
|
"com.generalmagic.magicearth", // Magic Earth: never gets past connecting
|
||||||
)
|
)
|
||||||
|
|
||||||
fun isBroken(packageName: String): Boolean = packageName in broken
|
fun isBroken(context: Context, packageName: String): Boolean =
|
||||||
|
packageName in broken && !patched(context, packageName)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The certificate each broken app's own publisher signs it with. A copy signed with another
|
||||||
|
* key has been patched to accept Gearslip, like Waze with the waze-gearslip Morphe patch, and
|
||||||
|
* works.
|
||||||
|
*/
|
||||||
|
private val officialSigners = mapOf(
|
||||||
|
"com.waze" to "03637f6c5d8f604e6fdb79a6ffbfa578de4e318f8da22fc6106665247f8807d7",
|
||||||
|
)
|
||||||
|
|
||||||
|
/** Whether the installed copy is signed by someone other than its publisher. */
|
||||||
|
private fun patched(context: Context, packageName: String): Boolean {
|
||||||
|
val official = officialSigners[packageName] ?: return false
|
||||||
|
val signers = runCatching {
|
||||||
|
context.packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES)
|
||||||
|
.signingInfo?.apkContentsSigners
|
||||||
|
}.getOrNull() ?: return false
|
||||||
|
val sha256 = MessageDigest.getInstance("SHA-256")
|
||||||
|
return signers.isNotEmpty() && signers.none { cert ->
|
||||||
|
sha256.digest(cert.toByteArray()).joinToString("") { "%02x".format(it) } == official
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shown on the launcher with a yellow mark: starts and can be used, but not cleanly enough to
|
* Shown on the launcher with a yellow mark: starts and can be used, but not cleanly enough to
|
||||||
|
|||||||
Reference in new issue
Block a user