package Ġinfo . h ann es . floating view Ċ Ċ import Ġandroid . animation . Time Interpolator Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . PixelFormat Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Message Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view .* Ċ import Ġandroid . view . animation . Over shoot Interpolator Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . core . view . View Compat Ċ import Ġandroidx . dynamic animation . animation .* Ċ import Ġandroidx . dynamic animation . animation . Dynamic Animation . On Animation Update Listener Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* Ġhttp :// stackoverflow . com / questions / 1 8 5 0 3 0 5 0 / how - to - create - drag gab ble - system - alert - in - android Ċ Ġ*/ Ċ internal Ġclass ĠFloating View ( context : ĠContext ) Ġ: ĠFrame Layout ( context ), ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġwindow Manager : ĠWindow Manager Ġ= Ġcontext . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĠĠĠ Ġval Ġwindow LayoutParams : ĠWindow Manager . LayoutParams Ġ= ĠWindow Manager . LayoutParams () ĊĠĠĠ Ġprivate Ġvar Ġvelocity Tracker : ĠVe locity Tracker ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġview Configuration : ĠView Configuration ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmove Threshold Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmaximum Fl ing Velocity Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmaximum X Velocity Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmaximum Y Velocity Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġthrow Move Threshold Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġval Ġmetrics : ĠDisplay Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠ Ġprivate Ġvar Ġtouch Down Time : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġscreen Touch Down X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġscreen Touch Down Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmove Accept Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġscreen Touch X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġscreen Touch Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlocal Touch X Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlocal Touch Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġinit X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinit Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġinitial Animation Running Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġanimate Initial Move Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġbase StatusBar Height : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġbase StatusBar Rot ated Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstatus Bar Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbase NavigationBar Height Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNavigation Ġbar 's Ġheight ĊĠĠĠĠ Ġ* ĠPl aced Ġbottom Ġon Ġthe Ġscreen ( tablet ) ĊĠĠĠĠ Ġ* ĠOr Ġplaced Ġvert ically Ġon Ġthe Ġscreen ( phone ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġbase NavigationBar Rot ated Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġnavigation Bar Vertical Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġnavigation Bar Horizontal Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtouch X Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtouch Y Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmove Edge Animator : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġmove Edge Interpolator : ĠTime Interpolator ĊĠĠĠ Ġprivate Ġval Ġmove Limit Rect 1 : ĠRect ĊĠĠĠ Ġprivate Ġval Ġposition Limit Rect : ĠRect ĊĠĠĠ Ġprivate Ġvar Ġdraggable Ġ= Ġfalse ĊĠĠĠ Ġvar Ġshape Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġval Ġanimation Handler : ĠFloating Animation Handler ĊĠĠĠ Ġprivate Ġval Ġlong Press Handler : ĠLong Press Handler ĊĠĠĠ Ġprivate Ġvar Ġover Margin Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġover Margin X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġover Margin Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġon Touch Listener : ĠOn Touch Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlong Pressed Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmove Direction : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġdynamic Ġphysics - based Ġanimations Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġuse Physics : ĠBoolean ĊĠĠĠ Ġprivate Ġval Ġtablet : ĠBoolean ĊĠĠĠ Ġprivate Ġvar Ġrotation : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCut out Ġsafe Ġinset Ġrect ( Same Ġas ĠFloating View Manager 's Ġm Safe Inset Rect ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġsafe Inset Rect : ĠRect ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Metrics ( metrics ) ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . width Ġ= ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . height Ġ= ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . type Ġ= ĠOVER LAY _ TYPE ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . flags Ġ= ĠWindow Manager . LayoutParams . FLAG _ NOT _ FOCUS ABLE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ LAYOUT _ NO _ LIMIT S Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ NOT _ TO UCH _ MOD AL Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . FLAG _ HARD WARE _ AC CELER ATED ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . format Ġ= ĠPixel Format . TRANSL UC ENT ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . gravity Ġ= ĠGr avity . LEFT Ġor ĠGr avity . BOTTOM ĊĠĠĠĠĠĠĠ Ġanimation Handler Ġ= ĠFloating Animation Handler ( this ) ĊĠĠĠĠĠĠĠ Ġlong Press Handler Ġ= ĠLong Press Handler ( this ) ĊĠĠĠĠĠĠĠ Ġmove Edge Interpolator Ġ= ĠOver shoot Interpolator ( MOVE _ TO _ EDGE _ OVER SHO OT _ T ENSION ) ĊĠĠĠĠĠĠĠ Ġmove Direction Ġ= ĠFloating View Manager . MOVE _ DIRECTION _ DEFAULT ĊĠĠĠĠĠĠĠ Ġuse Physics Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġtablet Ġ= Ġresources . configuration . screen Layout Ġand ĠConfiguration . SCREEN LAYOUT _ SIZE _ MASK Ġ>= ĠConfiguration . SCREEN LAYOUT _ SIZE _ LARGE ĊĠĠĠĠĠĠĠ Ġrotation Ġ= Ġwindow Manager . default Display . rotation ĊĠĠĠĠĠĠĠ Ġmove Limit Rect 1 Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġposition Limit Rect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġsafe Inset Rect Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġbase StatusBar Height Ġ= Ġget System Ui Dimension Pixel Size ( resources , Ġ" status _ bar _ height ") ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġlandscape Ġresource Ġid ĊĠĠĠĠĠĠĠ Ġval Ġstatus Bar Land scape Res Id Ġ= Ġresources . getIdentifier (" status _ bar _ height _ land scape ", Ġ" dim en ", Ġ" android ") ĊĠĠĠĠĠĠĠ Ġbase StatusBar Rot ated Height Ġ= Ġif Ġ( status Bar Land scape Res Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget System Ui Dimension Pixel Size ( resources , Ġ" status _ bar _ height _ land scape ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase StatusBar Height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInit Ġphysics - based Ġanimation Ġproperties ĊĠĠĠĠĠĠĠ Ġupdate View Configuration () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDetect ĠNavigation Bar ĊĠĠĠĠĠĠĠ Ġif Ġ( has Soft NavigationBar ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Height Ġ= Ġget System Ui Dimension Pixel Size ( resources , Ġ" navigation _ bar _ height ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Name Ġ= Ġif Ġ( tablet ) Ġ" navigation _ bar _ height _ land scape " Ġelse Ġ" navigation _ bar _ width " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Rot ated Height Ġ= Ġget System Ui Dimension Pixel Size ( resources , Ġres Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Rot ated Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Tree Observer . add On Pre Draw Listener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Soft NavigationBar (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Display Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Real Metrics ( real Display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreal Display Metrics . height Pixels Ġ> Ġmetrics . height Pixels Ġ|| Ġreal Display Metrics . width Pixels Ġ> Ġmetrics . width Pixels ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġold Ġdevice Ġcheck Ġflow ĊĠĠĠĠĠĠĠ Ġ// ĠNavigation Ġbar Ġexists Ġ( config _ show NavigationBar Ġis Ġtrue , Ġor Ġboth Ġthe Ġmenu Ġkey Ġand Ġthe Ġback Ġkey Ġare Ġnot Ġexists ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġval Ġresources Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġval Ġhas Menu Key Ġ= ĠView Configuration . get ( context ). has Permanent Menu Key () ĊĠĠĠĠĠĠĠ Ġval Ġhas Back Key Ġ= ĠKey Character Map . device HasKey ( KeyEvent . KEYCODE _ BACK ) ĊĠĠĠĠĠĠĠ Ġval Ġshow NavigationBar Res Id Ġ= Ġresources . getIdentifier (" config _ show NavigationBar ", Ġ" bool ", Ġ" android ") ĊĠĠĠĠĠĠĠ Ġval Ġhas NavigationBar Config Ġ= Ġshow NavigationBar Res Id Ġ!= Ġ 0 Ġ&& Ġresources . getBoolean ( show NavigationBar Res Id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhas NavigationBar Config Ġ|| Ġ! has Menu Key Ġ&& Ġ! has Back Key ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġrefresh Limit Rect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ Ġupdate View Configuration () ĊĠĠĠĠĠĠĠ Ġrefresh Limit Rect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġview Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( init X Ġ== ĠDEFAULT _ X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( init Y Ġ== ĠDEFAULT _ Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Y Ġ= Ġmetrics . height Pixels Ġ- Ġstatus Bar Height Ġ- Ġmeasured Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . x Ġ= Ġinit X ĊĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġinit Y ĊĠĠĠĠĠĠĠ Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To ( init X , Ġinit Y , Ġinit X , Ġinit Y , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Animation Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Edge ( init X , Ġinit Y , Ġanimate Initial Move ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdraggable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonUpdate System Layout ( is Hide StatusBar : ĠBoolean , Ġis Hide NavigationBar : ĠBoolean , Ġis Por trait : ĠBoolean , Ġwindow Rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate StatusBar Height ( is Hide StatusBar , Ġis Por trait ) ĊĠĠĠĠĠĠĠ Ġupdate Touch X Offset ( is Hide NavigationBar , Ġwindow Rect . left ) ĊĠĠĠĠĠĠĠ Ġtouch Y Offset Ġ= Ġif Ġ( is Por trait ) Ġsafe Inset Rect . top Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġupdate NavigationBar Offset ( is Hide NavigationBar , Ġis Por trait , Ġwindow Rect ) ĊĠĠĠĠĠĠĠ Ġrefresh Limit Rect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate StatusBar Height ( is Hide StatusBar : ĠBoolean , Ġis Por trait : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Hide StatusBar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 .( No ĠCut out ) No ĠStatus Bar (= 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 .( Has ĠCut out ) StatusBar Ġis Ġnot Ġincluded Ġin Ġm Metrics . height Pixels Ġ(= 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHas ĠCut out ĊĠĠĠĠĠĠĠ Ġval Ġhas Top Cut out Ġ= Ġsafe Inset Rect . top Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( has Top Cut out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Height Ġ= Ġif Ġ( is Por trait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase StatusBar Rot ated Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġcut out ĊĠĠĠĠĠĠĠ Ġstatus Bar Height Ġ= Ġif Ġ( is Por trait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase StatusBar Height ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase StatusBar Rot ated Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Touch X Offset ( is Hide NavigationBar : ĠBoolean , Ġwindow Left Offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Bottom Cut out Ġ= Ġsafe Inset Rect . bottom Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( has Bottom Cut out ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch X Offset Ġ= Ġwindow Left Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġcut out ĊĠĠĠĠĠĠĠ Ġ// Ġtouch ĠX Ġoffset ( navigation Ġbar Ġis Ġdisplayed Ġand Ġit Ġis Ġon Ġthe Ġleft Ġside Ġof Ġthe Ġdevice ) ĊĠĠĠĠĠĠĠ Ġtouch X Offset Ġ= Ġif Ġ(! is Hide NavigationBar Ġ&& Ġwindow Left Offset Ġ> Ġ 0 ) Ġbase NavigationBar Rot ated Height Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate NavigationBar Offset ( is Hide NavigationBar : ĠBoolean , Ġis Por trait : ĠBoolean , Ġwindow Rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent NavigationBar Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent NavigationBar Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnavigation Bar Vertical Diff Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġhas Soft NavigationBar Ġ= Ġhas Soft NavigationBar () ĊĠĠĠĠĠĠĠ Ġ// Ġauto Ġhide Ġnavigation Ġbar ( G alaxy ĠS 8 , ĠS 9 Ġand Ġso Ġon .) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Display Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Real Metrics ( real Display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent NavigationBar Height Ġ= Ġreal Display Metrics . height Pixels Ġ- Ġwindow Rect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent NavigationBar Width Ġ= Ġreal Display Metrics . width Pixels Ġ- Ġmetrics . width Pixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Vertical Diff Ġ= Ġbase NavigationBar Height Ġ- Ġcurrent NavigationBar Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Hide NavigationBar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Vertical Offset Ġ= Ġif Ġ( navigation Bar Vertical Diff Ġ!= Ġ 0 Ġ&& Ġbase NavigationBar Height Ġ== Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! has Soft NavigationBar Ġ&& Ġbase NavigationBar Height Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Soft NavigationBar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 . auto Ġhide Ġmode Ġ-> Ġshow Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 2 . show Ġmode Ġ-> Ġauto Ġhide Ġmode Ġ-> Ġhome ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshow Ġmode Ġ-> Ġhome ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- current NavigationBar Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnormal Ġdevice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Horizontal Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġpor trait , Ġis Ġdisplayed Ġat Ġthe Ġbottom Ġof Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġif Ġ( is Por trait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġauto Ġhide Ġnavigation Ġbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Vertical Offset Ġ= Ġif Ġ(! has Soft NavigationBar Ġ&& Ġbase NavigationBar Height Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Horizontal Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis Ġa ĠTable t , Ġit Ġwill Ġappear Ġat Ġthe Ġbottom Ġof Ġthe Ġscreen . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis ĠPhone , Ġit Ġwill Ġappear Ġon Ġthe Ġside Ġof Ġthe Ġscreen ĊĠĠĠĠĠĠĠ Ġif Ġ( tablet ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Vertical Offset Ġ= Ġbase NavigationBar Rot ated Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Horizontal Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Vertical Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Bar Horizontal Offset Ġ= Ġif Ġ(! has Soft NavigationBar Ġ&& Ġbase NavigationBar Rot ated Height Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( has Soft NavigationBar Ġ&& Ġbase NavigationBar Rot ated Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent NavigationBar Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase NavigationBar Rot ated Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Configuration () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Configuration Ġ= ĠView Configuration . get ( context ) ĊĠĠĠĠĠĠĠ Ġmove Threshold Ġ= Ġview Configuration !!. scaled Touch S lop . toFloat () ĊĠĠĠĠĠĠĠ Ġmaximum Fl ing Velocity Ġ= Ġview Configuration !!. scaled Maximum Fl ing Velocity . toFloat () ĊĠĠĠĠĠĠĠ Ġmaximum X Velocity Ġ= Ġmaximum Fl ing Velocity Ġ/ ĠMAX _ X _ VE LOC ITY _ SCALE _ DOWN _ VALUE ĊĠĠĠĠĠĠĠ Ġmaximum Y Velocity Ġ= Ġmaximum Fl ing Velocity Ġ/ ĠMAX _ Y _ VE LOC ITY _ SCALE _ DOWN _ VALUE ĊĠĠĠĠĠĠĠ Ġthrow Move Threshold Ġ= Ġmaximum Fl ing Velocity Ġ/ ĠTHROW _ THRESHOLD _ SCALE _ DOWN _ VALUE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe ĠPosition Limit Rect Ġand ĠMove Limit Rect Ġaccording Ġto Ġthe Ġscreen Ġsize Ġchange . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Limit Rect () Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Animation () ĊĠĠĠĠĠĠĠ Ġval Ġold Position Limit Width Ġ= Ġposition Limit Rect . width () ĊĠĠĠĠĠĠĠ Ġval Ġold Position Limit Height Ġ= Ġposition Limit Rect . height () ĊĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Metrics ( metrics ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġmeasured Width ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġmeasured Height ĊĠĠĠĠĠĠĠ Ġval Ġnew Screen Width Ġ= Ġmetrics . width Pixels ĊĠĠĠĠĠĠĠ Ġval Ġnew Screen Height Ġ= Ġmetrics . height Pixels ĊĠĠĠĠĠĠĠ Ġmove Limit Rect 1 [- width , Ġ- height Ġ* Ġ 2 , Ġnew Screen Width Ġ+ Ġwidth Ġ+ Ġnavigation Bar Horizontal Offset ] Ġ= Ġnew Screen Height Ġ+ Ġheight Ġ+ Ġnavigation Bar Vertical Offset ĊĠĠĠĠĠĠĠ Ġposition Limit Rect [- over Margin Ġ- Ġover Margin X , Ġ 0 , Ġnew Screen Width Ġ- Ġwidth Ġ+ Ġover Margin Ġ+ Ġover Margin Y Ġ+ Ġnavigation Bar Horizontal Offset ] Ġ= Ġnew Screen Height Ġ- Ġstatus Bar Height Ġ- Ġheight Ġ+ Ġnavigation Bar Vertical Offset ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitial Ġanimation Ġstop Ġwhen Ġthe Ġdevice Ġrot ates ĊĠĠĠĠĠĠĠ Ġval Ġnew Rotation Ġ= Ġwindow Manager . default Display . rotation ĊĠĠĠĠĠĠĠ Ġif Ġ( animate Initial Move Ġ&& Ġrotation Ġ!= Ġnew Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Animation Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġanimation Ġis Ġrunning Ġand Ġthe Ġdevice Ġis Ġnot Ġrot ating ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Animation Running Ġ&& Ġrotation Ġ== Ġnew Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Edge ( window LayoutParams . x , Ġwindow LayoutParams . y , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġis Ġa Ġscreen Ġchange Ġduring Ġthe Ġoperation , Ġmove Ġto Ġthe Ġappropriate Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Accept ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Edge ( window LayoutParams . x , Ġwindow LayoutParams . y , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew X Ġ= Ġ( window LayoutParams . x Ġ* Ġposition Limit Rect . width () Ġ/ Ġold Position Limit Width . toFloat () Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoal Position X Ġ= ĠMath . min ( Math . max ( position Limit Rect . left , Ġnew X ), Ġposition Limit Rect . right ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Y Ġ= Ġ( window LayoutParams . y Ġ* Ġposition Limit Rect . height () Ġ/ Ġold Position Limit Height . toFloat () Ġ+ Ġ 0 . 5 f ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoal Position Y Ġ= ĠMath . min ( Math . max ( position Limit Rect . top , Ġnew Y ), Ġposition Limit Rect . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove To ( window LayoutParams . x , Ġwindow LayoutParams . y , Ġgoal Position X , Ġgoal Position Y , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrotation Ġ= Ġnew Rotation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( move Edge Animator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator !!. removeAll Update Listeners () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdispatch Touch Event ( event , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdispatch Touch Event ( event , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdispatch Touch Event ( event : ĠMotion Event , Ġis On Intercept Touch Event : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ!= ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! draggable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBlock Ġwhile Ġinitial Ġdisplay Ġanimation Ġis Ġrunning ĊĠĠĠĠĠĠĠ Ġif Ġ( initial Animation Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscreen Touch X Ġ= Ġevent . raw X ĊĠĠĠĠĠĠĠ Ġscreen Touch Y Ġ= Ġevent . raw Y ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġevent . action ĊĠĠĠĠĠĠĠ Ġvar Ġis WaitFor MoveTo Edge Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Touch Down X Ġ= Ġscreen Touch X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Touch Down Y Ġ= Ġscreen Touch Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Touch X Ġ= Ġevent . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Touch Y Ġ= Ġevent . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Accept Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Scale ( SCALE _ PRES SED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Tracker Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġa Ġnew ĠVe locity Tracker Ġobject Ġto Ġwatch Ġthe Ġvelocity Ġof Ġa Ġmotion . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= ĠVe locity Tracker . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReset Ġthe Ġvelocity Ġtracker Ġback Ġto Ġits Ġinitial Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker !!. clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . update Touch Position ( x By Touch . toFloat (), Ġy By Touch . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . remove Messages ( Floating Animation Handler . ANIM ATION _ IN _ TO UCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . send Animation Message ( Floating Animation Handler . ANIM ATION _ IN _ TO UCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Handler . remove Messages ( Long Press Handler . LONG _ PRES SED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Handler . send Empty Message Delayed ( Long Press Handler . LONG _ PRES SED , ĠLONG _ PRESS _ TIMEOUT . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Down Time Ġ= Ġevent . down Time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Movement ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Animation Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ MOVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Accept ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Handler . remove Messages ( Long Press Handler . LONG _ PRES SED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch Down Time Ġ!= Ġevent . down Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! is On Intercept Touch Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! move Accept Ġ&& ĠMath . abs ( screen Touch X Ġ- Ġscreen Touch Down X ) Ġ< Ġmove Threshold Ġ&& ĠMath . abs ( screen Touch Y Ġ- Ġscreen Touch Down Y ) Ġ< Ġmove Threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! is On Intercept Touch Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Accept Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . update Touch Position ( x By Touch . toFloat (), Ġy By Touch . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompute Ġoffset Ġand Ġrestore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Movement ( event ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ UP Ġ|| Ġaction Ġ== ĠMotion Event . ACTION _ CANCEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcompute Ġvelocity Ġtracker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker !!. compute Current Velocity ( CURRENT _ VE LOC ITY _ UNITS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Is Long Pressed Ġ= Ġlong Pressed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Handler . remove Messages ( Long Press Handler . LONG _ PRES SED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch Down Time Ġ!= Ġevent . down Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . remove Messages ( Floating Animation Handler . ANIM ATION _ IN _ TO UCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Scale ( SCALE _ NORMAL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdestroy ĠVe locity Tracker Ġ(# 1 0 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! move Accept Ġ&& Ġvelocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker !!. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen ĠACTION _ UP Ġis Ġdone Ġ( when Ġnot Ġpressed Ġor Ġmoved ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ UP Ġ&& Ġ! tmp Is Long Pressed Ġ&& Ġ! move Accept ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġa Ġmove Ġafter Ġchecking Ġwhether Ġit Ġis Ġfinished Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis WaitFor MoveTo Edge Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( on Touch Listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Touch Listener !!. on Touch ( this , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLazy Ġexecution Ġof Ġmove To Edge ĊĠĠĠĠĠĠĠ Ġif Ġ( is WaitFor MoveTo Edge Ġ&& Ġanimation Handler . state Ġ!= ĠFloating ViewState . STATE _ FIN ISH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinclude Ġdevice Ġrotation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Edge ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( velocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker !!. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvelocity Tracker Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ! is On Intercept Touch Event Ġ|| Ġmove Accept ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Movement ( event : ĠMotion Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġevent . raw X Ġ- Ġevent . x ĊĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġevent . raw Y Ġ- Ġevent . y ĊĠĠĠĠĠĠĠ Ġevent . offset Location ( delta X , Ġdelta Y ) ĊĠĠĠĠĠĠĠ Ġvelocity Tracker !!. add Movement ( event ) ĊĠĠĠĠĠĠĠ Ġevent . offset Location (- delta X , Ġ- delta Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Long Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġlong Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġchild Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Child At ( i ). perform Long Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Visibility ( visibility : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ!= ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancel Long Press () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Scale ( SCALE _ NORMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Accept ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove To Edge ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Handler . remove Messages ( Floating Animation Handler . ANIM ATION _ IN _ TO UCH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Press Handler . remove Messages ( Long Press Handler . LONG _ PRES SED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . setVisibility ( visibility ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset On Touch Listener ( listener : ĠOn Touch Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Touch Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove To Edge ( with Animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent X Ġ= Ġx By Touch ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Y Ġ= Ġy By Touch ĊĠĠĠĠĠĠĠ Ġmove To Edge ( current X , Ġcurrent Y , Ġwith Animation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove To Edge ( start X : ĠInt , Ġstart Y : ĠInt , Ġwith Animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgoal Position X Ġ= Ġget Goal Position X ( start X , Ġstart Y ) ĊĠĠĠĠĠĠĠ Ġval Ġgoal Position Y Ġ= Ġget Goal Position Y ( start X , Ġstart Y ) ĊĠĠĠĠĠĠĠ Ġmove To ( start X , Ġstart Y , Ġgoal Position X , Ġgoal Position Y , Ġwith Animation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove To ( current X : ĠInt , Ġcurrent Y : ĠInt , Ġgoal Position X Val : ĠInt , Ġgoal Position Y Val : ĠInt , Ġwith Animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgoal Position X Ġ= Ġgoal Position X Val ĊĠĠĠĠĠĠĠ Ġvar Ġgoal Position Y Ġ= Ġgoal Position Y Val ĊĠĠĠĠĠĠĠ Ġgoal Position X Ġ= ĠMath . min ( Math . max ( position Limit Rect . left , Ġgoal Position X ), Ġposition Limit Rect . right ) ĊĠĠĠĠĠĠĠ Ġgoal Position Y Ġ= ĠMath . min ( Math . max ( position Limit Rect . top , Ġgoal Position Y ), Ġposition Limit Rect . bottom ) ĊĠĠĠĠĠĠĠ Ġif Ġ( with Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġphysics Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Physics Animation Ġ= Ġuse Physics Ġ&& Ġvelocity Tracker Ġ!= Ġnull Ġ&& Ġmove Direction Ġ!= ĠFloating View Manager . MOVE _ DIRECTION _ NE ARE ST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Physics Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Physics Animation ( goal Position X , Ġcurrent Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Object Animation ( current X , Ġcurrent Y , Ġgoal Position X , Ġgoal Position Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window LayoutParams . x Ġ!= Ġgoal Position X Ġ|| Ġwindow LayoutParams . y Ġ!= Ġgoal Position Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . x Ġ= Ġgoal Position X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġgoal Position Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocal Touch X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġlocal Touch Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġscreen Touch Down X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġscreen Touch Down Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġmove Accept Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart ĠPhysics - based Ġanimation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgoal Position X Ġgoal Ġposition ĠX Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Y ĠĠĠĠĠ Ġcurrent ĠY Ġcoordinate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Physics Animation ( goal Position X : ĠInt , Ġcurrent Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġstart ĠX Ġcoordinate Ġanimation ĊĠĠĠĠĠĠĠ Ġval Ġcontains Limit Rect Width Ġ= Ġwindow LayoutParams . x Ġ< Ġposition Limit Rect . right Ġ&& Ġwindow LayoutParams . x Ġ> Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠ Ġ// ĠIf ĠMOVE _ DIRECTION _ NONE , Ġplay Ġfl ing Ġanimation ĊĠĠĠĠĠĠĠ Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ NONE Ġ&& Ġcontains Limit Rect Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvelocity X Ġ= ĠMath . min ( Math . max ( velocity Tracker !!. x Velocity , Ġ- maximum X Velocity ), Ġmaximum X Velocity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Fl ing Animation X ( velocity X ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Spring Animation X ( goal Position X ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġstart ĠY Ġcoordinate Ġanimation ĊĠĠĠĠĠĠĠ Ġval Ġcontains Limit Rect Height Ġ= Ġwindow LayoutParams . y Ġ< Ġposition Limit Rect . bottom Ġ&& Ġwindow LayoutParams . y Ġ> Ġposition Limit Rect . top ĊĠĠĠĠĠĠĠ Ġval Ġvelocity Y Ġ= Ġ- Math . min ( Math . max ( velocity Tracker !!. y Velocity , Ġ- maximum Y Velocity ), Ġmaximum Y Velocity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( contains Limit Rect Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Fl ing Animation Y ( velocity Y ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Spring Animation Y ( current Y , Ġvelocity Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Object Animation ( current X : ĠInt , Ġcurrent Y : ĠInt , Ġgoal Position X : ĠInt , Ġgoal Position Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( goal Position X Ġ== Ġcurrent X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// to Ġmove Ġonly Ġy Ġcoord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator Ġ= ĠValue Animator . of Int ( current Y , Ġgoal Position Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator ?. add Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġ( animation . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Init Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġmove Ġonly Ġx Ġcoord Ġ( to Ġleft Ġor Ġright ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġgoal Position Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator Ġ= ĠValue Animator . of Int ( current X , Ġgoal Position X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator ?. add Update Listener Ġ{ Ġanimation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . x Ġ= Ġ( animation . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Init Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmove Edge Animator ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠMOVE _ TO _ EDGE _ DURATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= Ġmove Edge Interpolator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Spring Animation X ( goal Position X : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġspring X ĊĠĠĠĠĠĠĠ Ġval Ġspring X Ġ= ĠSpring Force ( goal Position X . toFloat ()) ĊĠĠĠĠĠĠĠ Ġspring X . d amping Ratio Ġ= ĠAN IM ATION _ SPR ING _ X _ DA MP ING _ RATIO ĊĠĠĠĠĠĠĠ Ġspring X . st iff ness Ġ= ĠAN IM ATION _ SPR ING _ X _ ST IFF NESS ĊĠĠĠĠĠĠĠ Ġ// Ġspring Animation ĊĠĠĠĠĠĠĠ Ġval Ġspring Animation X Ġ= ĠSpring Animation ( Float Value Holder ()) ĊĠĠĠĠĠĠĠ Ġspring Animation X . set Start Velocity ( velocity Tracker !!. x Velocity ) ĊĠĠĠĠĠĠĠ Ġspring Animation X . set Start Value ( window LayoutParams . x . toFloat ()) ĊĠĠĠĠĠĠĠ Ġspring Animation X . spring Ġ= Ġspring X ĊĠĠĠĠĠĠĠ Ġspring Animation X . minimum Visible Change Ġ= ĠDynamic Animation . MIN _ VISIBLE _ CHANGE _ PIXEL S ĊĠĠĠĠĠĠĠ Ġspring Animation X . add Update Listener ( On Animation Update Listener Ġ{ Ġanimation , Ġvalue , Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath . round ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġmoving , Ġor Ġthe Ġtouch Ġoperation Ġis Ġcontinuing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window LayoutParams . x Ġ== Ġx Ġ|| Ġvelocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Animation Update Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġx Ġcoordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . x Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġspring Animation X . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Spring Animation Y ( current Y : ĠInt , Ġvelocity Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠSpring Force ĊĠĠĠĠĠĠĠ Ġval Ġspring Y Ġ= ĠSpring Force ( if Ġ( current Y Ġ< Ġmetrics . height Pixels Ġ/ Ġ 2 ) Ġposition Limit Rect . top . toFloat () Ġelse Ġposition Limit Rect . bottom . toFloat ()) ĊĠĠĠĠĠĠĠ Ġspring Y . d amping Ratio Ġ= ĠSpring Force . DA MP ING _ RATIO _ LOW _ BOUN CY ĊĠĠĠĠĠĠĠ Ġspring Y . st iff ness Ġ= ĠSpring Force . ST IFF NESS _ LOW ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠSpring Animation ĊĠĠĠĠĠĠĠ Ġval Ġspring Animation Y Ġ= ĠSpring Animation ( Float Value Holder ()) ĊĠĠĠĠĠĠĠ Ġspring Animation Y . set Start Velocity ( velocity Y ) ĊĠĠĠĠĠĠĠ Ġspring Animation Y . set Start Value ( window LayoutParams . y . toFloat ()) ĊĠĠĠĠĠĠĠ Ġspring Animation Y . spring Ġ= Ġspring Y ĊĠĠĠĠĠĠĠ Ġspring Animation Y . minimum Visible Change Ġ= ĠDynamic Animation . MIN _ VISIBLE _ CHANGE _ PIXEL S ĊĠĠĠĠĠĠĠ Ġspring Animation Y . add Update Listener ( On Animation Update Listener Ġ{ Ġanimation , Ġvalue , Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠMath . round ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġmoving , Ġor Ġthe Ġtouch Ġoperation Ġis Ġcontinuing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window LayoutParams . y Ġ== Ġy Ġ|| Ġvelocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Animation Update Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġy Ġcoordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġspring Animation Y . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Fl ing Animation X ( velocity X : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfl ing Animation X Ġ= ĠF ling Animation ( Float Value Holder ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . set Start Velocity ( velocity X ) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . set MaxValue ( position Limit Rect . right . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . set MinValue ( position Limit Rect . left . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . set Start Value ( window LayoutParams . x . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . f riction Ġ= ĠAN IM ATION _ FL ING _ X _ FR I CTION ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . minimum Visible Change Ġ= ĠDynamic Animation . MIN _ VISIBLE _ CHANGE _ PIXEL S ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . add Update Listener ( On Animation Update Listener Ġ{ Ġanimation , Ġvalue , Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath . round ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġmoving , Ġor Ġthe Ġtouch Ġoperation Ġis Ġcontinuing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window LayoutParams . x Ġ== Ġx Ġ|| Ġvelocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Animation Update Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġy Ġcoordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . x Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġfl ing Animation X . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Fl ing Animation Y ( velocity Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfl ing Animation Y Ġ= ĠF ling Animation ( Float Value Holder ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . set Start Velocity ( velocity Y ) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . set MaxValue ( position Limit Rect . bottom . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . set MinValue ( position Limit Rect . top . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . set Start Value ( window LayoutParams . y . toFloat ()) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . f riction Ġ= ĠAN IM ATION _ FL ING _ Y _ FR I CTION ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . minimum Visible Change Ġ= ĠDynamic Animation . MIN _ VISIBLE _ CHANGE _ PIXEL S ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . add Update Listener ( On Animation Update Listener Ġ{ Ġanimation , Ġvalue , Ġvelocity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= ĠMath . round ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġmoving , Ġor Ġthe Ġtouch Ġoperation Ġis Ġcontinuing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( window LayoutParams . y Ġ== Ġy Ġ|| Ġvelocity Tracker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Animation Update Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġy Ġcoordinate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow LayoutParams . y Ġ= Ġy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Layout () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġfl ing Animation Y . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġit Ġis Ġattached Ġto Ġthe ĠWindow Ġand Ġcall ĠWindow Manager . update Layout () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate View Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! View Compat . is Attached To Window ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwindow Manager . update View Layout ( this , Ġwindow LayoutParams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġanimation Ġinitialization Ġflag ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġanimation Ġ[ Value Animator ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Init Animation ( animation : ĠValue Animator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( animate Initial Move Ġ&& Ġanimation . duration Ġ<= Ġanimation . current Play Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Animation Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġfinal Ġpoint Ġof Ġmovement Ġ( X Ġcoordinate ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstart X ĠInitial Ġvalue Ġof ĠX Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Y ĠInitial Ġvalue Ġof ĠY Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ return ĠEnd Ġpoint Ġof ĠX Ġcoordinate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Goal Position X ( start X : ĠInt , Ġstart Y : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgoal Position X Ġ= Ġstart X ĊĊĠĠĠĠĠĠĠ Ġ// ĠMove Ġto Ġleft Ġor Ġright Ġedges ĊĠĠĠĠĠĠĠ Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ DEFAULT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Move Right Edge Ġ= Ġstart X Ġ> Ġ( metrics . width Pixels Ġ- Ġwidth ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position X Ġ= Ġif Ġ( is Move Right Edge ) Ġposition Limit Rect . right Ġelse Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position X Ġ= Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position X Ġ= Ġposition Limit Rect . right ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ NE ARE ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Left Right Ġ= Ġmin ( start X , Ġposition Limit Rect . width () Ġ- Ġstart X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Top Bottom Ġ= Ġmin ( start Y , Ġposition Limit Rect . height () Ġ- Ġstart Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Left Right Ġ< Ġdist Top Bottom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Move Right Edge Ġ= Ġstart X Ġ> Ġ( metrics . width Pixels Ġ- Ġwidth ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position X Ġ= Ġif Ġ( is Move Right Edge ) Ġposition Limit Rect . right Ġelse Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ TH RO WN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position X Ġ= Ġif Ġ( velocity Tracker Ġ!= Ġnull Ġ&& Ġvelocity Tracker !!. x Velocity Ġ> Ġthrow Move Threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Limit Rect . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( velocity Tracker Ġ!= Ġnull Ġ&& Ġvelocity Tracker !!. x Velocity Ġ< Ġ- throw Move Threshold ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Move Right Edge Ġ= Ġstart X Ġ> Ġ( metrics . width Pixels Ġ- Ġwidth ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Move Right Edge ) Ġposition Limit Rect . right Ġelse Ġposition Limit Rect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgoal Position X ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġfinal Ġpoint Ġof Ġmovement Ġ( Y Ġcoordinate ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstart X ĠInitial Ġvalue Ġof ĠX Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġstart Y ĠInitial Ġvalue Ġof ĠY Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ return ĠEnd Ġpoint Ġof ĠY Ġcoordinate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Goal Position Y ( start X : ĠInt , Ġstart Y : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgoal Position Y Ġ= Ġstart Y ĊĊĠĠĠĠĠĠĠ Ġ// ĠMove Ġto Ġtop / bottom / left / right Ġedges ĊĠĠĠĠĠĠĠ Ġif Ġ( move Direction Ġ== ĠFloating View Manager . MOVE _ DIRECTION _ NE ARE ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Left Right Ġ= ĠMath . min ( start X , Ġposition Limit Rect . width () Ġ- Ġstart X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Top Bottom Ġ= ĠMath . min ( start Y , Ġposition Limit Rect . height () Ġ- Ġstart Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Left Right Ġ>= Ġdist Top Bottom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Move Top Edge Ġ= Ġstart Y Ġ< Ġ( metrics . height Pixels Ġ- Ġheight ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoal Position Y Ġ= Ġif Ġ( is Move Top Edge ) Ġposition Limit Rect . top Ġelse Ġposition Limit Rect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgoal Position Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( move Edge Animator Ġ!= Ġnull Ġ&& Ġmove Edge Animator !!. is Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmove Edge Animator Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Scale ( new Scale : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ<= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget View Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget View . scale X Ġ= Ġnew Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget View . scale Y Ġ= Ġnew Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġnew Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġnew Scale ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Drag gable ( is Drag gable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraggable Ġ= Ġis Drag gable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Over Margin ( margin : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġover Margin Ġ= Ġmargin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Over Margin X ( margin : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġover Margin X Ġ= Ġmargin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Over Margin Y ( margin : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġover Margin Y Ġ= Ġmargin ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Move Direction ( move Direction Val : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmove Direction Ġ= Ġmove Direction Val ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġdynamic Ġphysics - based Ġanimations Ġor Ġnot ĊĠĠĠĠ Ġ* ĠWarning : ĠCan Ġnot Ġbe Ġused Ġbefore ĠAPI Ġ 1 6 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuse Physics Val ĠSetting Ġthis Ġto Ġfalse Ġwill Ġrevert Ġto Ġusing Ġa ĠValue Animator Ġ( default Ġis Ġtrue ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġuse Physics ( use Physics Val : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuse Physics Ġ= Ġuse Physics Val Ġ&& ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Init Coords ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit X Ġ= Ġx ĊĠĠĠĠĠĠĠ Ġinit Y Ġ= Ġy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Animate Initial Move ( animate Initial Move : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . animate Initial Move Ġ= Ġanimate Initial Move ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Window Drawing Rect ( out Rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent X Ġ= Ġx By Touch ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Y Ġ= Ġy By Touch ĊĠĠĠĠĠĠĠ Ġout Rect [ current X , Ġcurrent Y , Ġcurrent X Ġ+ Ġwidth ] Ġ= Ġcurrent Y Ġ+ Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġx By Touch : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( screen Touch X Ġ- Ġlocal Touch X Ġ- Ġtouch X Offset ). toInt () ĊĊĠĠĠ Ġprivate Ġval Ġy By Touch : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( metrics . height Pixels Ġ+ Ġnavigation Bar Vertical Offset Ġ- Ġ( screen Touch Y Ġ- Ġlocal Touch Y Ġ+ Ġheight Ġ- Ġtouch Y Offset )). toInt () ĊĊĠĠĠ Ġfun Ġset Normal () Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation Handler . state Ġ= ĠFloating ViewState . STATE _ NORMAL ĊĠĠĠĠĠĠĠ Ġanimation Handler . update Touch Position ( x By Touch . toFloat (), Ġy By Touch . toFloat ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Intersect ing ( center X : ĠInt , Ġcenter Y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation Handler . state Ġ= ĠFloating ViewState . STATE _ INTER SECT ING ĊĠĠĠĠĠĠĠ Ġanimation Handler . update Target Position ( center X . toFloat (), Ġcenter Y . toFloat ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Finish ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġanimation Handler . state Ġ= ĠFloating ViewState . STATE _ FIN ISH ING ĊĠĠĠĠĠĠĠ Ġmove Accept Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstate : ĠFloating ViewState ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġanimation Handler . state ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġcut out 's Ġsafe Ġinset Ġarea ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Safe Inset Rect ( safe Inset Rect Val : ĠRect ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsafe Inset Rect . set ( safe Inset Rect Val ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠFloating Animation Handler ( floating View : ĠFloating View ) Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠstartTime : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstart X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġstart Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm State : ĠFloating ViewState ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Is Change State Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtouch Position X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtouch Position Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Target Position X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Target Position Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Floating View : ĠWeak Reference < Floating View > Ġ= ĠWeak Reference ( floating View ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloating View Ġ= Ġm Floating View . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( floating View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Messages ( ANIM ATION _ IN _ TO UCH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Code Ġ= Ġmsg . what ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Type Ġ= Ġmsg . arg 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġfloating View . window LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Is Change State Ġ|| Ġanimation Type Ġ== ĠTYPE _ FIRST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= Ġif Ġ( m Is Change State ) ĠSystem Clock . uptime Millis () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġparams . x . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Ġ= Ġparams . y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Change State Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelapsed Time Ġ= ĠSystem Clock . uptime Millis () Ġ- ĠstartTime . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtracking Target Time Rate Ġ= ĠMath . min ( elapsed Time Ġ/ ĠCAP TURE _ DURATION _ M ILL IS , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m State Ġ== ĠFloating ViewState . STATE _ NORMAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Position Ġ= Ġcalc Animation Position ( tracking Target Time Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Limit Rect Ġ= Ġfloating View . move Limit Rect 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Position X Ġ= ĠMath . min ( Math . max ( move Limit Rect . left , Ġtouch Position X . toInt ()), Ġmove Limit Rect . right ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Position Y Ġ= ĠMath . min ( Math . max ( move Limit Rect . top , Ġtouch Position Y . toInt ()), Ġmove Limit Rect . bottom ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ= Ġ( start X Ġ+ Ġ( target Position X Ġ- Ġstart X ) Ġ* Ġbase Position ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ= Ġ( start Y Ġ+ Ġ( target Position Y Ġ- Ġstart Y ) Ġ* Ġbase Position ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloating View . update View Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage At Time ( new Message ( animation Code , ĠTYPE _ UPDATE ), ĠSystem Clock . uptime Millis () Ġ+ ĠAN IM ATION _ REFRESH _ TIME _ M ILL IS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m State Ġ== ĠFloating ViewState . STATE _ INTER SECT ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Position Ġ= Ġcalc Animation Position ( tracking Target Time Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Position X Ġ= Ġm Target Position X Ġ- Ġfloating View . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Position Y Ġ= Ġm Target Position Y Ġ- Ġfloating View . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . x Ġ= Ġ( start X Ġ+ Ġ( target Position X Ġ- Ġstart X ) Ġ* Ġbase Position ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . y Ġ= Ġ( start Y Ġ+ Ġ( target Position Y Ġ- Ġstart Y ) Ġ* Ġbase Position ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloating View . update View Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage At Time ( new Message ( animation Code , ĠTYPE _ UPDATE ), ĠSystem Clock . uptime Millis () Ġ+ ĠAN IM ATION _ REFRESH _ TIME _ M ILL IS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsend Animation Message Delayed ( animation : ĠInt , Ġdelay Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage At Time ( new Message ( animation , ĠTYPE _ FIRST ), ĠSystem Clock . uptime Millis () Ġ+ Ġdelay Millis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġsend Animation Message ( animation : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( new Message ( animation , ĠTYPE _ FIRST )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Touch Position ( position X : ĠFloat , Ġposition Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Position X Ġ= Ġposition X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Position Y Ġ= Ġposition Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Target Position ( center X : ĠFloat , Ġcenter Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Position X Ġ= Ġcenter X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Target Position Y Ġ= Ġcenter Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġstate : ĠFloating ViewState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġm State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m State Ġ!= ĠnewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Change State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm State Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN IM ATION _ REFRESH _ TIME _ M ILL IS Ġ= Ġ 1 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAP TURE _ DURATION _ M ILL IS Ġ= Ġ 3 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠAN IM ATION _ IN _ TO UCH Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ FIRST Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTYPE _ UPDATE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalc Animation Position ( time Rate : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġy = 0 . 5 5 sin ( 8 . 0 5 6 4 x - ÏĢ / 2 )+ 0 . 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( time Rate Ġ<= Ġ 0 . 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 . 5 5 Ġ* ĠMath . sin ( 8 . 0 5 6 4 Ġ* Ġtime Rate Ġ- ĠMath . PI Ġ/ Ġ 2 ) Ġ+ Ġ 0 . 5 5 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 4 Ġ* ĠMath . pow ( 0 . 4 1 7 Ġ* Ġtime Rate Ġ- Ġ 0 . 3 4 1 , Ġ 2 . 0 ) Ġ- Ġ 4 Ġ* ĠMath . pow ( 0 . 4 1 7 Ġ- Ġ 0 . 3 4 1 , Ġ 2 . 0 ) Ġ+ Ġ 1 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġanimation ĠAN IM ATION _ IN _ TO UCH ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype ĠĠĠĠĠ ĠTYPE _ FIRST , TYPE _ UPDATE ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠMessage ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġnew Message ( animation : ĠInt , Ġtype : ĠInt ): ĠMessage Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠMessage . obtain () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . what Ġ= Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . arg 1 Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm State Ġ= ĠFloating ViewState . STATE _ NORMAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠLong Press Handler ( view : ĠFloating View ) Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Floating View : ĠWeak Reference < Floating View > Ġ= ĠWeak Reference ( view ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġm Floating View . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Messages ( LONG _ PRES SED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . on Long Click () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠLONG _ PRES SED Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSC ALE _ PRES SED Ġ= Ġ 0 . 9 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSC ALE _ NORMAL Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMOVE _ TO _ EDGE _ DURATION Ġ= Ġ 4 5 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMOVE _ TO _ EDGE _ OVER SHO OT _ T ENSION Ġ= Ġ 1 . 2 5 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN IM ATION _ SPR ING _ X _ DA MP ING _ RATIO Ġ= Ġ 0 . 7 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN IM ATION _ SPR ING _ X _ ST IFF NESS Ġ= Ġ 3 5 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN IM ATION _ FL ING _ X _ FR I CTION Ġ= Ġ 1 . 7 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAN IM ATION _ FL ING _ Y _ FR I CTION Ġ= Ġ 1 . 7 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCURRENT _ VE LOC ITY _ UNITS Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLONG _ PRESS _ TIMEOUT Ġ= Ġ( 1 . 5 f Ġ* ĠView Configuration . getLong Press Timeout ()). toInt () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ X _ VE LOC ITY _ SCALE _ DOWN _ VALUE Ġ= Ġ 9 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ Y _ VE LOC ITY _ SCALE _ DOWN _ VALUE Ġ= Ġ 8 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTHROW _ THRESHOLD _ SCALE _ DOWN _ VALUE Ġ= Ġ 9 f ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ X Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ Y Ġ= ĠInt . MIN _ VALUE ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ WIDTH Ġ= ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ HEIGHT Ġ= ĠViewGroup . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠOVER LAY _ TYPE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget System Ui Dimension Pixel Size ( resources : ĠResources , Ġres Name : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpixel Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Id Ġ= Ġresources . getIdentifier ( res Name , Ġ" dim en ", Ġ" android ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Size Ġ= Ġresources . get Dimension Pixel Size ( res Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpixel Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOVER LAY _ TYPE Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ<= ĠBuild . VERSION _ CODES . N _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . TYPE _ PRIORITY _ PHONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWindow Manager . LayoutParams . TYPE _ APPLICATION _ OVER LAY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }