/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . ui . gesture Ċ Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . composed Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Event Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Event Pass Ċ import Ġandroidx . compose . ui . input . pointer . Pointer Input Filter Ċ import Ġandroidx . compose . ui . input . pointer . changed To Up Ignore Cons umed Ċ import Ġandroidx . compose . ui . platform . Density Ambient Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġkotlin . math . absolute Value Ċ Ċ // ĠTODO ( b / 1 4 3 8 7 7 4 6 4 ): ĠImplement Ġa Ġ" can Ġscale Ġin Ġ/ Ġcan Ġscale Ġout " Ġcheck Ġso Ġthat Ġscale Ġs lop Ġis Ġonly Ċ // Ġ Ġsur passed Ġin Ġthe Ġappropriate Ġdirection ? Ċ /** Ċ Ġ* ĠThis Ġgesture Ġdetector Ġdetect s Ġwhen Ġa Ġuser 's Ġpointer Ġinput Ġis Ġintended Ġto Ġinclude Ġscaling . Ċ Ġ* Ċ Ġ* ĠThis Ġgesture Ġdetector Ġis Ġvery Ġsimilar Ġto Ġ[ raw Scale Gesture Filter ] Ġexcept Ġthat Ġinstead Ġof Ċ Ġ* Ġproviding Ġcallbacks Ġfor Ġscaling , Ġit Ġinstead Ġprovides Ġone Ġcallback Ġfor Ġwhen Ġa Ġuser Ġis Ġint ending Ċ Ġ* Ġto Ġscale . Ġ ĠIt Ġdoes Ġso Ġusing Ġthe Ġsame Ġsemantics Ġas Ġ[ raw Scale Gesture Filter ], Ġand Ġsimply Ġwaits Ċ Ġ* Ġuntil Ġthe Ġuser Ġhas Ġscaled Ġjust Ġenough Ġto Ġsuggest Ġthe Ġuser Ġis Ġtruly Ġintended Ġto Ġscale . Ċ Ġ* Ċ Ġ* ĠThe Ġgesture Ġis Ġconsidered Ġto Ġinclude Ġscaling Ġwhen Ġthe Ġabsolute Ġcumulative Ġaverage Ġchange Ġin Ċ Ġ* Ġdistance Ġof Ġall Ġpointers Ġfrom Ġthe Ġaverage Ġpointer Ġover Ġtime Ġsur passes Ġa Ġparticular Ġvalue Ċ Ġ* Ġ( currently Ġ[ Scale S lop ]). Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġif Ġthe Ġ[ Scale S lop ] Ġis Ġ 5 Ġpixels Ġand Ġ 2 Ġpointers Ġwere Ġ 1 Ġpixel Ġaway Ġfrom Ġeach Ċ Ġ* Ġother Ġand Ġnow Ġare Ġ 1 1 . 0 0 0 0 1 Ġpixels Ġaway Ġfrom Ġeach Ġother , Ġthe Ġs lop Ġwill Ġhave Ġbeen Ġsur passed Ġand Ċ Ġ* Ġ[ on Scale S lop Exceeded ] Ġwill Ġbe Ġcalled Ġ( both Ġpointers Ġare Ġslightly Ġmore Ġthan Ġ 5 Ġpixels Ġaway Ġfrom Ċ Ġ* Ġthe Ġaverage Ġof Ġthe Ġpointers Ġthan Ġthey Ġwere ). Ċ Ġ*/ Ċ fun ĠModifier . scale S lop Exceeded Gesture Filter ( ĊĠĠĠ Ġon Scale S lop Exceeded : Ġ() Ġ-> ĠUnit Ċ ): ĠModifier Ġ= Ġcomposed Ġ{ ĊĠĠĠ Ġval Ġscale S lop Ġ= Ġwith ( Density Ambient . current ) Ġ{ ĠScale S lop . to Px () Ġ} ĊĠĠĠ Ġval Ġfilter Ġ= Ġremember Ġ{ ĠScale S lop Exceeded Gesture Filter ( scale S lop ) Ġ} ĊĠĠĠ Ġ// ĠTODO ( b / 1 2 9 7 8 4 0 1 0 ): ĠConsider Ġalso Ġallowing ĠonStart , Ġon Scale , Ġand Ġon End Ġto Ġbe Ġset Ġindividually . ĊĠĠĠ Ġfilter . on Scale S lop Exceeded Ġ= Ġon Scale S lop Exceeded ĊĠĠĠ ĠPointer Input Modifier Impl ( filter ) Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ param Ġscale S lop ĠThe Ġabsolute Ġcumulative Ġaverage Ġchange Ġin Ġdistance Ġof Ġall Ġpointers Ġfrom Ġthe Ċ Ġ* Ġaverage Ġpointer Ġover Ġtime Ġthat Ġmust Ġbe Ġsur passed Ġto Ġindicate Ġthe Ġuser Ġis Ġtrying Ġto Ġscale . Ċ Ġ* Ċ Ġ* Ġ@ see Ġscale S lop Exceeded Gesture Filter Ċ Ġ*/ Ċ internal Ġclass ĠScale S lop Exceeded Gesture Filter ( private Ġval Ġscale S lop : ĠFloat ) Ġ: ĠPointer Input Filter Ċ () Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġon Scale S lop Exceeded : Ġ() Ġ-> ĠUnit ĊĊĠĠĠ Ġvar Ġpassed S lop Ġ= Ġfalse ĊĠĠĠ Ġvar Ġscale Diff Total Ġ= Ġ 0 f ĊĊĠĠĠ Ġoverride Ġfun Ġon Pointer Event ( ĊĠĠĠĠĠĠĠ Ġpointer Event : ĠPointer Event , ĊĠĠĠĠĠĠĠ Ġpass : ĠPointer Event Pass , ĊĠĠĠĠĠĠĠ Ġbounds : ĠInt Size ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġpointer Event . changes ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pass Ġ== ĠPointer Event Pass . Main ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! passed S lop ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrently Down Changes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . filter Ġ{ Ġit . current . down Ġ&& Ġit . previous . down Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currently Down Changes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdimension Information Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrently Down Changes . calculate All Dimension Information () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Difference Ġ= Ġdimension Information . calculate Scale Difference () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Diff Total Ġ+= Ġscale Difference ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale Diff Total . absolute Value Ġ> Ġscale S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassed S lop Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scale S lop Exceeded . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( passed S lop Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ== ĠPointer Event Pass . Final Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanges . all Ġ{ Ġit . changed To Up Ignore Cons umed () Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassed S lop Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Diff Total Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġpassed S lop Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġscale Diff Total Ġ= Ġ 0 f ĊĠĠĠ Ġ} Ċ } Ċ