Skip to content

Commit 6b9fbd5

Browse files
committed
screen layout をサポート
1 parent 0634bd6 commit 6b9fbd5

1 file changed

Lines changed: 110 additions & 3 deletions

File tree

table.go

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
4972
const (
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

Comments
 (0)