ref: icon preference rating
This commit is contained in:
@@ -202,20 +202,18 @@ private extension Tbl_Parser {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If `ref.entry != 0`, lookup resource with matching id
|
/// Lookup resource with matching id. Choose the icon with the highest density.
|
||||||
func getIconDirect(_ ref: TblTableRef) -> String? {
|
func getIconDirect(_ ref: TblTableRef) -> String? {
|
||||||
guard ref.entry != 0, let res = try? self.getResource(ref) else {
|
guard let res = try? self.getResource(ref) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var best: ResValue? = nil
|
var best: ResValue? = nil
|
||||||
var bestScore: UInt16 = 0
|
var bestScore: UInt16 = 0
|
||||||
for e in res.entries {
|
for e in res.entries {
|
||||||
let density = e.config.screenType.density
|
switch e.config.screenType.density {
|
||||||
if density == .any || density == .None {
|
case .Default, .any, .None: continue
|
||||||
continue
|
case let density:
|
||||||
}
|
if density.rawValue > bestScore, let val = e.entry.value {
|
||||||
if let val = e.entry.value {
|
|
||||||
if density.rawValue > bestScore {
|
|
||||||
bestScore = density.rawValue
|
bestScore = density.rawValue
|
||||||
best = val
|
best = val
|
||||||
}
|
}
|
||||||
@@ -224,7 +222,8 @@ private extension Tbl_Parser {
|
|||||||
return best?.resolve(self.stringPool)
|
return best?.resolve(self.stringPool)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// if `ref.entry == 0`, iterate over all entries and search for attribute name `ic_launcher`
|
/// Iterate over all entries and choose best-rated icon file.
|
||||||
|
/// Rating prefers files which have an attribute name `"app_icon"` or `"ic_launcher"`.
|
||||||
func getIconIndirect(_ ref: TblTableRef) -> String? {
|
func getIconIndirect(_ ref: TblTableRef) -> String? {
|
||||||
// sadly we cannot just `getResource()` because that can point to an app banner
|
// sadly we cannot just `getResource()` because that can point to an app banner
|
||||||
guard let pkg = try? self.getPackage(ref.package),
|
guard let pkg = try? self.getPackage(ref.package),
|
||||||
@@ -232,24 +231,30 @@ private extension Tbl_Parser {
|
|||||||
let (_, types) = try? pkg.getType(ref.type) else {
|
let (_, types) = try? pkg.getType(ref.type) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// density is 120-640
|
||||||
|
let rates: [String: UInt16] = [
|
||||||
|
"app_icon": 1000,
|
||||||
|
"ic_launcher": 800,
|
||||||
|
"ic_launcher_foreground": 200,
|
||||||
|
]
|
||||||
var best: ResValue? = nil
|
var best: ResValue? = nil
|
||||||
var bestScore: UInt16 = 0
|
var bestScore: UInt16 = 0
|
||||||
for typ in types {
|
for typ in types {
|
||||||
let density = typ.config.screenType.density
|
switch typ.config.screenType.density {
|
||||||
if density == .any || density == .None {
|
case .any, .None: continue
|
||||||
continue
|
case let density:
|
||||||
}
|
try? typ.iterValues {
|
||||||
try? typ.iterValues { _, entry in
|
if let val = $1.value {
|
||||||
let attrName = pool.getStringCached(entry.key)
|
let attrName = pool.getStringCached($1.key)
|
||||||
guard attrName == "ic_launcher", let val = entry.value else {
|
let score = density.rawValue + (rates[attrName] ?? 0)
|
||||||
return
|
if score > bestScore {
|
||||||
}
|
bestScore = score
|
||||||
if density.rawValue > bestScore {
|
|
||||||
bestScore = density.rawValue
|
|
||||||
best = val
|
best = val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return best?.resolve(self.stringPool)
|
return best?.resolve(self.stringPool)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user