package Ġru . lap ov . cri st mas app . utils Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Inflater Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . widget . Frame Layout Ċ import Ġru . lap ov . cri st mas app . R Ċ Ċ class ĠFlip View Ġ: ĠFrame Layout Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġset Right Out : ĠAn imator Set Ġ= ĠAn imator Set () ĊĠĠĠ Ġprivate Ġvar Ġset Left In : ĠAn imator Set Ġ= ĠAn imator Set () ĊĠĠĠ Ġprivate Ġvar Ġcard Front Layout : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcard Back Layout : ĠView ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġview Ġis Ġset Ġto Ġflip Ġon Ġtouch Ġor Ġnot . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġor Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġwhether Ġview Ġshould Ġbe Ġf lipped Ġon Ġtouch Ġor Ġnot ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflip On Touch Ġvalue Ġ( true Ġor Ġfalse ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Flip On Touch Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġflip Duration : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġflip Ġis Ġenabled Ġor Ġnot ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġor Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable Ġ/ ĠDisable Ġflip Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflip Enabled Ġtrue Ġor Ġfalse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Flip Enabled : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhich Ġflip Ġstate Ġis Ġcurrently Ġon Ġof Ġthe Ġflip Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġcurrent Ġstate Ġof Ġflip Ġview ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent Flip State Ġ= ĠFlip State . FRONT _ SIDE ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġon Card Flip Listener : ĠOn Card Flip Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġfront Ġside Ġof Ġflip Ġview Ġis Ġvisible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġfront Ġside Ġof Ġflip Ġview Ġis Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Front Side : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Flip State Ġ== ĠFlip State . FRONT _ SIDE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġback Ġside Ġof Ġflip Ġview Ġis Ġvisible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġback Ġside Ġof Ġflip Ġview Ġis Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Back Side : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcurrent Flip State Ġ== ĠFlip State . BACK _ SIDE ĊĊĠĠĠ Ġenum Ġclass ĠFlip State Ġ{ ĊĠĠĠĠĠĠĠ ĠFR ONT _ SIDE , ĊĠĠĠĠĠĠĠ ĠBACK _ SIDE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSetting ĠDefault ĠValues ĊĠĠĠĠĠĠĠ Ġis Flip On Touch Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġflip Duration Ġ= ĠDEFAULT _ FLI P _ DURATION ĊĠĠĠĠĠĠĠ Ġis Flip Enabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġload Animations () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Flip View Ġcan Ġhost Ġonly Ġtwo Ġdirect Ġchildren !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfind Views () ĊĠĠĠĠĠĠĠ Ġchange Camera Distance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd View ( v : ĠView , Ġpos : ĠInt , Ġparams : ĠViewGroup . LayoutParams ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Flip View Ġcan Ġhost Ġonly Ġtwo Ġdirect Ġchildren !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . addView ( v , Ġpos , Ġparams ) ĊĊĠĠĠĠĠĠĠ Ġfind Views () ĊĠĠĠĠĠĠĠ Ġchange Camera Distance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove View ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . remove View ( v ) ĊĊĠĠĠĠĠĠĠ Ġfind Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove All Views In Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . removeAll Views In Layout () ĊĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġthe Ġstate ĊĠĠĠĠĠĠĠ Ġcurrent Flip State Ġ= ĠFlip State . FRONT _ SIDE ĊĊĠĠĠĠĠĠĠ Ġfind Views () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIn validation Ġsince Ġwe Ġuse Ġthis Ġalso Ġon Ġremove View ĊĠĠĠĠĠĠĠ Ġcard Back Layout Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcard Front Layout Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġchild Count ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġinvalidate Ġflip Ġstate Ġif Ġwe Ġhave Ġa Ġsingle Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Flip State Ġ= ĠFlip State . FRONT _ SIDE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( child Count Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout Ġ= Ġget Child At ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Back Layout Ġ= Ġget Child At ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Flip On Touch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout ?. visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( card Back Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Back Layout ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Animations () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Right Out Ġ= ĠAn imator Inflater . load Animator ( context , ĠR . anim ator . anim ator _ flip _ out ) Ġas ĠAn imator Set ĊĠĠĠĠĠĠĠ Ġset Left In Ġ= ĠAn imator Inflater . load Animator ( context , ĠR . anim ator . anim ator _ flip _ in ) Ġas ĠAn imator Set ĊĠĠĠĠĠĠĠ Ġset Right Out . interpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĠĠĠĠĠĠĠ Ġset Left In . interpol ator Ġ= ĠAccel erate De cel erate Interpolator () ĊĊĠĠĠĠĠĠĠ Ġset Right Out . addListener ( object Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( anim ator : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( anim ator : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Card Flip Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Card Flip Listener ?. on Flip ( current Flip State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Flip State Ġ== ĠFlip State . FRONT _ SIDE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Back Layout ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Back Layout ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( anim ator : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( anim ator : ĠAn imator ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġset Flip Duration ( flip Duration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Camera Distance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= Ġ 8 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġresources . display Metrics . density Ġ* Ġdistance ĊĊĠĠĠĠĠĠĠ Ġif Ġ( card Front Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Front Layout ?. camera Distance Ġ= Ġscale ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( card Back Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Back Layout ?. camera Distance Ġ= Ġscale ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPlay Ġthe Ġanimation Ġof Ġf li pping Ġand Ġflip Ġthe Ġview Ġfor Ġone Ġside ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflip The View () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Flip Enabled Ġ|| Ġchild Count Ġ< Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( set Right Out . isRunning Ġ|| Ġset Left In . isRunning ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġcard Back Layout ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġcard Front Layout ?. visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġcurrent Flip State Ġ= Ġif Ġ( current Flip State Ġ== ĠFlip State . FRONT _ SIDE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFrom Ġfront Ġto Ġback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . setTarget ( card Front Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . setTarget ( card Back Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . start () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlip State . BACK _ SIDE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfrom Ġback Ġto Ġfront ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . setTarget ( card Back Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . setTarget ( card Front Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . start () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlip State . FRONT _ SIDE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġflip To State ( state : ĠFlip State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . current Flip State Ġ== Ġstate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflip The View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFlip Ġthe Ġview Ġfor Ġone Ġside Ġwith Ġor Ġwithout Ġanimation . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwith Animation Ġtrue Ġmeans Ġflip Ġview Ġwith Ġanimation Ġotherwise Ġwithout Ġanimation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflip The View ( with Animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ< Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! with Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . duration Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . duration Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Flip Enabled Ġ= Ġis Flip Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Flip Enabled Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġflip The View () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Left In . duration Ġ= Ġflip Duration . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Right Out . duration Ġ= Ġflip Duration . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Flip Enabled Ġ= Ġold Flip Enabled ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflip The View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġduration Ġof Ġflip Ġin Ġmilliseconds ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġduration Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Flip Duration (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflip Duration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġflip Ġduration Ġ( in Ġmilliseconds ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġflip Duration Ġduration Ġin Ġmilliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Flip Duration ( flip Duration : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . flip Duration Ġ= Ġflip Duration ĊĠĠĠĠĠĠĠ Ġif Ġ( set Right Out . child Animations . size Ġ< Ġ 2 Ġ|| Ġset Left In . child Animations . size Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// set Right Out . set Duration ( flip Duration ); ĊĠĠĠĠĠĠĠ Ġset Right Out . child Animations [ 0 ]. duration Ġ= Ġflip Duration . to Long () ĊĠĠĠĠĠĠĠ Ġset Right Out . child Animations [ 1 ]. start Delay Ġ= Ġ( flip Duration Ġ/ Ġ 2 ). to Long () ĊĊĠĠĠĠĠĠĠ Ġ// set Left In . set Duration ( flip Duration ); ĊĠĠĠĠĠĠĠ Ġset Left In . child Animations [ 1 ]. duration Ġ= Ġflip Duration . to Long () ĊĠĠĠĠĠĠĠ Ġset Left In . child Animations [ 2 ]. start Delay Ġ= Ġ( flip Duration Ġ/ Ġ 2 ). to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Card Flip Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Flip ( newState : ĠFlip State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠFlip View :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ FLI P _ DURATION Ġ= Ġ 3 0 0 ĊĠĠĠ Ġ} Ċ }