@@ -244,3 +244,238 @@ func readTableTypeSpec(sr *io.SectionReader) ([]uint32, error) {
244244 }
245245 return flags , nil
246246}
247+
248+ func (c * ResTableConfig ) IsMoreSpecificThan (o * ResTableConfig ) bool {
249+ // imsi
250+ if (c .Mcc != 0 && c .Mnc != 0 ) || (o .Mcc != 0 && o .Mnc != 0 ) {
251+ if c .Mcc != o .Mcc {
252+ if c .Mcc != 0 {
253+ return false
254+ }
255+ if o .Mnc != 0 {
256+ return true
257+ }
258+ }
259+ if c .Mnc != o .Mnc {
260+ if c .Mnc != 0 {
261+ return false
262+ }
263+ if o .Mnc != 0 {
264+ return true
265+ }
266+ }
267+ }
268+
269+ // locale
270+ if (c .Language [0 ] != 0 && c .Country [0 ] != 0 ) || (o .Language [0 ] != 0 && o .Country [0 ] != 0 ) {
271+ if c .Language [0 ] != o .Language [0 ] {
272+ if c .Language [0 ] != 0 {
273+ return false
274+ }
275+ if o .Language [0 ] != 0 {
276+ return true
277+ }
278+ }
279+ if c .Country [0 ] != o .Country [0 ] {
280+ if c .Country [0 ] != 0 {
281+ return false
282+ }
283+ if o .Country [0 ] != 0 {
284+ return true
285+ }
286+ }
287+ }
288+
289+ // orientation
290+ if c .Orientation != o .Orientation {
291+ if c .Orientation != 0 {
292+ return false
293+ }
294+ if o .Orientation != 0 {
295+ return true
296+ }
297+ }
298+
299+ // TODO: uimode
300+
301+ // touchscreen
302+ if c .Touchscreen != o .Touchscreen {
303+ if c .Touchscreen != 0 {
304+ return false
305+ }
306+ if o .Touchscreen != 0 {
307+ return true
308+ }
309+ }
310+
311+ // TODO: input
312+
313+ // screen size
314+ if (c .ScreenWidth != 0 && c .ScreenHeight != 0 ) || (o .ScreenWidth != 0 && o .ScreenHeight != 0 ) {
315+ if c .ScreenWidth != o .ScreenWidth {
316+ if c .ScreenWidth != 0 {
317+ return false
318+ }
319+ if o .ScreenWidth != 0 {
320+ return true
321+ }
322+ }
323+ if c .ScreenHeight != o .ScreenHeight {
324+ if c .ScreenHeight != 0 {
325+ return false
326+ }
327+ if o .ScreenHeight != 0 {
328+ return true
329+ }
330+ }
331+ }
332+
333+ //version
334+ if (c .SDKVersion != 0 && c .SDKVersion != 0 ) || (o .MinorVersion != 0 && o .MinorVersion != 0 ) {
335+ if c .SDKVersion != o .SDKVersion {
336+ if c .SDKVersion != 0 {
337+ return false
338+ }
339+ if o .SDKVersion != 0 {
340+ return true
341+ }
342+ }
343+ if c .MinorVersion != o .MinorVersion {
344+ if c .MinorVersion != 0 {
345+ return false
346+ }
347+ if o .MinorVersion != 0 {
348+ return true
349+ }
350+ }
351+ }
352+
353+ return false
354+ }
355+
356+ func (c * ResTableConfig ) IsBetterThan (o * ResTableConfig , r * ResTableConfig ) bool {
357+ if r == nil {
358+ return c .IsMoreSpecificThan (o )
359+ }
360+
361+ // imsi
362+ if (c .Mcc != 0 && c .Mnc != 0 ) || (o .Mcc != 0 && o .Mnc != 0 ) {
363+ if c .Mcc != o .Mcc && r .Mcc != 0 {
364+ return c .Mcc != 0
365+ }
366+ if c .Mnc != o .Mnc && r .Mnc != 0 {
367+ return c .Mnc != 0
368+ }
369+ }
370+
371+ // locale
372+ if (c .Language [0 ] != 0 && c .Country [0 ] != 0 ) || (o .Language [0 ] != 0 && o .Country [0 ] != 0 ) {
373+ if c .Language [0 ] != o .Language [0 ] && r .Language [0 ] != 0 {
374+ return c .Language [0 ] != 0
375+ }
376+ if c .Country [0 ] != o .Country [0 ] && r .Country [0 ] != 0 {
377+ return c .Country [0 ] != 0
378+ }
379+ }
380+
381+ // TODO: screen layout
382+
383+ // orientation
384+ if c .Orientation != o .Orientation && r .Orientation != 0 {
385+ return c .Orientation != 0
386+ }
387+
388+ // TODO: uimode
389+
390+ // TODO: screen type
391+
392+ // TODO: input
393+
394+ // screen size
395+ if (c .ScreenWidth != 0 && c .ScreenHeight != 0 ) || (o .ScreenWidth != 0 && o .ScreenHeight != 0 ) {
396+ if c .ScreenWidth != o .ScreenWidth && r .ScreenWidth != 0 {
397+ return c .ScreenWidth != 0
398+ }
399+ if c .ScreenHeight != o .ScreenHeight && r .ScreenHeight != 0 {
400+ return c .ScreenHeight != 0
401+ }
402+ }
403+
404+ // version
405+ if (c .SDKVersion != 0 && c .SDKVersion != 0 ) || (o .MinorVersion != 0 && o .MinorVersion != 0 ) {
406+ if c .SDKVersion != o .SDKVersion && r .SDKVersion != 0 {
407+ return c .SDKVersion > o .SDKVersion
408+ }
409+ if c .MinorVersion != o .MinorVersion {
410+ return c .MinorVersion != 0
411+ }
412+ }
413+
414+ return false
415+ }
416+
417+ func (c * ResTableConfig ) Match (settings * ResTableConfig ) bool {
418+ // match imsi
419+ if c .Mcc != 0 && c .Mnc != 0 {
420+ if settings .Mcc == 0 {
421+ if c .Mcc != 0 {
422+ return false
423+ }
424+ } else {
425+ if c .Mcc != 0 && c .Mcc != settings .Mcc {
426+ return false
427+ }
428+ }
429+ if settings .Mnc == 0 {
430+ if c .Mnc != 0 {
431+ return false
432+ }
433+ } else {
434+ if c .Mnc != 0 && c .Mnc != settings .Mnc {
435+ return false
436+ }
437+ }
438+ }
439+
440+ // match locale
441+ if c .Language [0 ] != 0 && c .Country [0 ] != 0 {
442+ if settings .Language [0 ] != 0 && c .Language [0 ] != 0 &&
443+ ! (settings .Language [0 ] == c .Language [0 ] && settings .Language [1 ] == c .Language [1 ]) {
444+ return false
445+ }
446+ if settings .Country [0 ] != 0 && c .Country [0 ] != 0 &&
447+ ! (settings .Country [0 ] == c .Country [0 ] && settings .Country [1 ] == c .Country [1 ]) {
448+ return false
449+ }
450+ }
451+
452+ // TODO: screen config
453+ // TODO: screen type
454+ // TODO: input
455+
456+ // screen size
457+ if c .ScreenWidth != 0 && c .ScreenHeight != 0 {
458+ if settings .ScreenWidth != 0 && c .ScreenWidth != 0 &&
459+ c .ScreenWidth != settings .ScreenWidth {
460+ return false
461+ }
462+ if settings .ScreenHeight != 0 && c .ScreenHeight != 0 &&
463+ c .ScreenHeight != settings .ScreenHeight {
464+ return false
465+ }
466+ }
467+
468+ // version
469+ if c .SDKVersion != 0 && c .MinorVersion != 0 {
470+ if settings .SDKVersion != 0 && c .SDKVersion != 0 &&
471+ c .SDKVersion > settings .SDKVersion {
472+ return false
473+ }
474+ if settings .MinorVersion != 0 && c .MinorVersion != 0 &&
475+ c .MinorVersion != settings .MinorVersion {
476+ return false
477+ }
478+ }
479+
480+ return true
481+ }
0 commit comments