@@ -46,6 +46,29 @@ type ResTableType struct {
4646 Config ResTableConfig
4747}
4848
49+ // ScreenLayout bits
50+ const (
51+ MASK_SCREENSIZE = 0x0f
52+ SCREENSIZE_ANY = 0x01
53+ SCREENSIZE_SMALL = 0x02
54+ SCREENSIZE_NORMAL = 0x03
55+ SCREENSIZE_LARGE = 0x04
56+ SCREENSIZE_XLARGE = 0x05
57+
58+ MASK_SCREENLONG = 0x30
59+ SHIFT_SCREENLONG = 4
60+ SCREENLONG_ANY = 0x00
61+ SCREENLONG_NO = 0x10
62+ SCREENLONG_YES = 0x20
63+
64+ MASK_LAYOUTDIR = 0xC0
65+ SHIFT_LAYOUTDIR = 6
66+ LAYOUTDIR_ANY = 0x00
67+ LAYOUTDIR_LTR = 0x40
68+ LAYOUTDIR_RTL = 0x80
69+ )
70+
71+ // UIMode bits
4972const (
5073 MASK_UI_MODE_TYPE = 0x0f
5174 UI_MODE_TYPE_ANY = 0x01
@@ -354,6 +377,38 @@ func (c *ResTableConfig) IsMoreSpecificThan(o *ResTableConfig) bool {
354377 }
355378 }
356379
380+ // screen layout
381+ if c .ScreenLayout != 0 || o .ScreenLayout != 0 {
382+ if ((c .ScreenLayout ^ o .ScreenLayout ) & MASK_LAYOUTDIR ) != 0 {
383+ if (c .ScreenLayout & MASK_LAYOUTDIR ) != 0 {
384+ return false
385+ }
386+ if (o .ScreenLayout & MASK_LAYOUTDIR ) != 0 {
387+ return true
388+ }
389+ }
390+ }
391+
392+ // screen layout
393+ if c .ScreenLayout != 0 || o .ScreenLayout != 0 {
394+ if ((c .ScreenLayout ^ o .ScreenLayout ) & MASK_SCREENSIZE ) != 0 {
395+ if (c .ScreenLayout & MASK_SCREENSIZE ) != 0 {
396+ return false
397+ }
398+ if (o .ScreenLayout & MASK_SCREENSIZE ) != 0 {
399+ return true
400+ }
401+ }
402+ if ((c .ScreenLayout ^ o .ScreenLayout ) & MASK_SCREENLONG ) != 0 {
403+ if (c .ScreenLayout & MASK_SCREENLONG ) != 0 {
404+ return false
405+ }
406+ if (o .ScreenLayout & MASK_SCREENLONG ) != 0 {
407+ return true
408+ }
409+ }
410+ }
411+
357412 // orientation
358413 if c .Orientation != o .Orientation {
359414 if c .Orientation != 0 {
@@ -461,7 +516,42 @@ func (c *ResTableConfig) IsBetterThan(o *ResTableConfig, r *ResTableConfig) bool
461516 }
462517 }
463518
464- // TODO: screen layout
519+ // screen layout
520+ if c .ScreenLayout != 0 || o .ScreenLayout != 0 {
521+ myLayoutdir := c .ScreenLayout & MASK_LAYOUTDIR
522+ oLayoutdir := o .ScreenLayout & MASK_LAYOUTDIR
523+ if (myLayoutdir ^ oLayoutdir ) != 0 && (r .ScreenLayout & MASK_LAYOUTDIR ) != 0 {
524+ return myLayoutdir > oLayoutdir
525+ }
526+ }
527+
528+ // screen layout
529+ if c .ScreenLayout != 0 || o .ScreenLayout != 0 {
530+ mySL := c .ScreenLayout & MASK_SCREENSIZE
531+ oSL := o .ScreenLayout & MASK_SCREENSIZE
532+ if (mySL ^ oSL ) != 0 && (r .ScreenLayout & MASK_SCREENSIZE ) != 0 {
533+ fixedMySL := mySL
534+ fixedOSL := oSL
535+ if (r .ScreenLayout & MASK_SCREENSIZE ) >= SCREENSIZE_NORMAL {
536+ if fixedMySL == 0 {
537+ fixedMySL = SCREENSIZE_NORMAL
538+ }
539+ if fixedOSL == 0 {
540+ fixedOSL = SCREENSIZE_NORMAL
541+ }
542+ }
543+ if fixedMySL == fixedOSL {
544+ return mySL != 0
545+ } else {
546+ return fixedMySL > fixedOSL
547+ }
548+ }
549+
550+ if ((c .ScreenLayout ^ o .ScreenLayout )& MASK_SCREENLONG ) != 0 &&
551+ (r .ScreenLayout & MASK_SCREENLONG ) != 0 {
552+ return (c .ScreenLayout & MASK_SCREENLONG ) != 0
553+ }
554+ }
465555
466556 // orientation
467557 if c .Orientation != o .Orientation || r .Orientation != 0 {
@@ -537,9 +627,26 @@ func (c *ResTableConfig) Match(settings *ResTableConfig) bool {
537627 return false
538628 }
539629
540- // TODO: screen config
541- // TODO: screen type
630+ // screen layout
631+ layoutDir := c .ScreenLayout & MASK_LAYOUTDIR
632+ setLayoutDir := settings .ScreenLayout & MASK_LAYOUTDIR
633+ if layoutDir != 0 && layoutDir != setLayoutDir {
634+ return false
635+ }
636+
637+ screenSize := c .ScreenLayout & MASK_SCREENSIZE
638+ setScreenSize := settings .ScreenLayout & MASK_SCREENSIZE
639+ if screenSize != 0 && screenSize > setScreenSize {
640+ return false
641+ }
642+
643+ screenLong := c .ScreenLayout & MASK_SCREENLONG
644+ setScreenLong := settings .ScreenLayout & MASK_SCREENLONG
645+ if screenLong != 0 && screenLong != setScreenLong {
646+ return false
647+ }
542648
649+ // ui mode
543650 uiModeType := c .UIMode & MASK_UI_MODE_TYPE
544651 setUIModeType := settings .UIMode & MASK_UI_MODE_TYPE
545652 if uiModeType != 0 && uiModeType != setUIModeType {
0 commit comments