/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 Ġå¤§ åīį èī¯ ä»ĭ Ġ( OH MA E ĠR y os uke ) Ċ Ġ* Ċ Ġ* ĠThis Ġsoftware Ġis Ġreleased Ġunder Ġthe ĠMIT ĠLicense . Ċ Ġ* Ġhttp :// opensource . org / licenses / MIT Ċ Ġ*/ Ċ Ċ package Ġnet . mm 2 d . orientation . control Ċ Ċ import Ġandroid . content . Context Ċ import Ġdagger . h ilt . android . qual ifiers . ApplicationContext Ċ import Ġnet . mm 2 d . orientation . util . Pow ers Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . atan Ċ Ċ @ Singleton Ċ class ĠOrientation Helper Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ ApplicationContext Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontroller : ĠOrientation Controller Ġ= ĠOrientation Controller ( context ) ĊĠĠĠ Ġprivate Ġval Ġsensor Helper : ĠSensor Helper Ġ= ĠSensor Helper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġ{ Ġcontroller . isEnabled Ġ&& Ġrequested Orientation . uses Sensor () Ġ}, ĊĠĠĠĠĠĠĠ Ġthis :: sensor Result ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġvar Ġrequested Orientation : ĠOrientation Ġ= ĠOrientation . INVALID ĊĠĠĠ Ġprivate Ġvar Ġis Land scape Device : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġupdate ( orientation : ĠOrientation , Ġlandscape Device : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( requested Orientation Ġ== Ġorientation Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . isEnabled Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Land scape Device Ġ== Ġlandscape Device ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequested Orientation Ġ= Ġorientation ĊĠĠĠĠĠĠĠ ĠControl Status Receiver . update Orientation ( context , Ġorientation ) ĊĠĠĠĠĠĠĠ Ġis Land scape Device Ġ= Ġlandscape Device ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation . uses Sensor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! controller . isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( Orientation . UNSPECIFIED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Pow ers . is Interactive ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Helper . start Sensor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Helper . stop Sensor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( orientation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . stop () ĊĠĠĠĠĠĠĠ Ġsensor Helper . stop Sensor () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġminimum Co erc ion ( x : ĠFloat , Ġy : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( requested Orientation Ġ== ĠOrientation . SENSOR _ POR TRA IT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! controller . orientation . is Por trait ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( if Ġ( y Ġ> Ġ 0 ) ĠOrientation . POR TRA IT Ġelse ĠOrientation . RE VERSE _ POR TRA IT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( requested Orientation Ġ== ĠOrientation . SENSOR _ LAND SC APE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! controller . orientation . is Land scape ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( if Ġ( x Ġ> Ġ 0 ) ĠOrientation . LAND SC APE Ġelse ĠOrientation . RE VERSE _ LAND SC APE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsensor Result ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! controller . isEnabled ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( is Land scape Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Orientation By Sensor ( y , Ġ- x , Ġz ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Orientation By Sensor ( x , Ġy , Ġz ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Orientation By Sensor ( x : ĠFloat , Ġy : ĠFloat , Ġz : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( minimum Co erc ion ( x , Ġy )) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( z ). let Ġ{ Ġit Ġ> Ġabs ( x ) Ġ&& Ġit Ġ> Ġabs ( y ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ// ĠZ æĪĲ åĪĨ ãģĮ å¤§ ãģį ãģĦ åł´åĲĪãģ¯ åĪ¤æĸŃ ãģĹãģªãģĦ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrotation Ġ= Ġcalculate Angle ( x , Ġy ). to Rotation () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( requested Orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . SENSOR _ POR TRA IT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . SENSOR _ LAND SC APE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Up Side Down ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . SENSOR _ LI E _ LEFT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor L ie Left ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . SENSOR _ LI E _ RIGHT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor L ie Right ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . SENSOR _ HEAD STAND Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsensor Head stand ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsensor Up Side Down ( rotation : ĠRotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Orientation Ġ= Ġwhen Ġ( rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 0 Ġ-> ĠOrientation . POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 9 0 Ġ-> ĠOrientation . LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 1 8 0 Ġ-> ĠOrientation . RE VERSE _ POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 2 7 0 Ġ-> ĠOrientation . RE VERSE _ LAND SC APE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( controller . orientation Ġ== Ġtarget Orientation ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( requested Orientation Ġ== ĠOrientation . SENSOR _ POR TRA IT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Orientation . is Por trait ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( target Orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( requested Orientation Ġ== ĠOrientation . SENSOR _ LAND SC APE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Orientation . is Land scape ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( target Orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsensor L ie Left ( rotation : ĠRotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Orientation Ġ= Ġwhen Ġ( rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 0 Ġ-> ĠOrientation . RE VERSE _ LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 9 0 Ġ-> ĠOrientation . POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 1 8 0 Ġ-> ĠOrientation . LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 2 7 0 Ġ-> ĠOrientation . RE VERSE _ POR TRA IT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( controller . orientation Ġ== Ġtarget Orientation ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( target Orientation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsensor L ie Right ( rotation : ĠRotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Orientation Ġ= Ġwhen Ġ( rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 0 Ġ-> ĠOrientation . LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 9 0 Ġ-> ĠOrientation . RE VERSE _ POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 1 8 0 Ġ-> ĠOrientation . RE VERSE _ LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 2 7 0 Ġ-> ĠOrientation . POR TRA IT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( controller . orientation Ġ== Ġtarget Orientation ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( target Orientation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsensor Head stand ( rotation : ĠRotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Orientation Ġ= Ġwhen Ġ( rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 0 Ġ-> ĠOrientation . RE VERSE _ POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 9 0 Ġ-> ĠOrientation . RE VERSE _ LAND SC APE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 1 8 0 Ġ-> ĠOrientation . POR TRA IT ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRotation . ROT ATION _ 2 7 0 Ġ-> ĠOrientation . LAND SC APE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( controller . orientation Ġ== Ġtarget Orientation ) Ġreturn ĊĠĠĠĠĠĠĠ Ġcontroller . set Orientation ( target Orientation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠRotation Ġ{ ĊĠĠĠĠĠĠĠ ĠROT ATION _ 0 , ĊĠĠĠĠĠĠĠ ĠROT ATION _ 9 0 , ĊĠĠĠĠĠĠĠ ĠROT ATION _ 1 8 0 , ĊĠĠĠĠĠĠĠ ĠROT ATION _ 2 7 0 , ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠDouble . to Rotation (): ĠRotation Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ< Ġ 1 Ġ/ Ġ 8 . 0 Ġ-> ĠRotation . ROT ATION _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ< Ġ 3 Ġ/ Ġ 8 . 0 Ġ-> ĠRotation . ROT ATION _ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ< Ġ 5 Ġ/ Ġ 8 . 0 Ġ-> ĠRotation . ROT ATION _ 1 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ< Ġ 7 Ġ/ Ġ 8 . 0 Ġ-> ĠRotation . ROT ATION _ 2 7 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRotation . ROT ATION _ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ è§Ĵ åº¦ ãĤĴ [ 0 - 1 ] ãģ§ è¡¨ çı¾ ĊĠĠĠ Ġ// Ġar ct an ( x / y )/ 2 ÏĢ ãģ§ y è» ¸ ãģĭãĤī æĻĤ è¨Ī åĽŀ ãĤĬ ãģ« [ 0 - 0 . 2 5 ][ - 0 . 2 5 - 0 ][ 0 - 0 . 2 5 ][ - 0 . 2 5 - 0 ] ãģ¨ãģĦãģĨ åĢ¤ ãģĮ åıĸ ãĤī ãĤĮãĤĭ ãĢĤ ĊĠĠĠ Ġ// Ġ ãģĵãĤĮ ãĤĴ æĻĤ è¨Ī åĽŀ ãĤĬ ãģ« [ 0 - 1 ] ãģ« ãģªãĤĭ ãĤĪãģĨãģ« è¨Ī ç®Ĺ ãģĻãĤĭ ãĢĤ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Angle ( x : ĠFloat , Ġy : ĠFloat ): ĠDouble Ġ= ĊĠĠĠĠĠĠĠ Ġ( atan ( x Ġ/ Ġy ) Ġ/ Ġ( 2 Ġ* ĠMath . PI )). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġ 0 ) Ġ( if Ġ( it Ġ> Ġ 0 ) Ġit Ġelse Ġ 1 Ġ+ Ġit ) Ġelse Ġ 0 . 5 Ġ+ Ġit ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ