package Ġcom . be eline 0 9 . dater ange picker Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . os . V ibration Effect Ċ import Ġandroid . os . V ibr ator Ċ import Ġandroid . provider . Settings Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġutility Ġclass Ġto Ġhandle Ġh aptic Ġfeedback . Ċ Ġ*/ Ċ class ĠH aptic Feedback Controller ( private Ġval ĠmContext : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Content Observer : ĠContent Observer ĊĊĠĠĠ Ġprivate Ġvar Ġm V ibr ator : ĠV ibr ator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Is Glob ally Enabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Last V ibrate : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Content Observer Ġ= Ġobject Ġ: ĠContent Observer ( null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Is Glob ally Enabled Ġ= Ġcheck Global Setting ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġto Ġsetup Ġthe Ġcontroller . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( has V ibrate Permission ( mContext )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm V ibr ator Ġ= ĠmContext . getSystem Service ( Service . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġa Ġlistener Ġfor Ġchanges Ġin Ġh aptic Ġfeedback Ġsettings ĊĠĠĠĠĠĠĠ Ġm Is Glob ally Enabled Ġ= Ġcheck Global Setting ( mContext ) ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠSettings . System . get Uri For ( Settings . System . H AP T IC _ FEED BACK _ ENABLED ) ĊĠĠĠĠĠĠĠ ĠmContext . content Resolver . register Content Observer ( uri , Ġfalse , Ġm Content Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġto Ġverify Ġthat Ġvi br ate Ġpermission Ġhas Ġbeen Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAllows Ġusers Ġof Ġthe Ġlibrary Ġto Ġdisabled Ġvi br ate Ġsupport Ġif Ġdesired . ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif ĠV ibrate Ġpermission Ġhas Ġbeen Ġgranted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas V ibrate Permission ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠ Ġval Ġhas Perm Ġ= Ġpm . check Permission ( android . Manifest . permission . V IB RATE , Ġcontext . packageName ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Perm Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġwhen Ġyou Ġdon 't Ġneed Ġthe Ġcontroller Ġanymore . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġm V ibr ator Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠmContext . content Resolver . unregister Content Observer ( m Content Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTry Ġto Ġvi br ate . ĠTo Ġprevent Ġthis Ġbecoming Ġa Ġsingle Ġcontinuous Ġvi br ation , Ġnothing Ġwill ĊĠĠĠĠ Ġ* Ġhappen Ġif Ġwe Ġhave Ġvi br ated Ġvery Ġrecently . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtry V ibrate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mV ibr ator Ġ!= Ġnull Ġ&& Ġm Is Glob ally Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem Clock . uptime Millis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġtry Ġto Ġvi br ate Ġeach Ġindividual Ġtick Ġdis cret ely . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( now Ġ- Ġm Last V ibrate Ġ>= ĠV IB RATE _ DELAY _ MS ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm V ibr ator !!. vi br ate ( V ibration Effect . create One Shot ( V IB RATE _ LENGTH _ MS . to Long (), ĠV ibration Effect . DEFAULT _ AMP LIT UDE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm V ibr ator !!. vi br ate ( V IB RATE _ LENGTH _ MS . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last V ibrate Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV IB RATE _ DELAY _ MS Ġ= Ġ 1 2 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV IB RATE _ LENGTH _ MS Ġ= Ġ 5 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck Global Setting ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSettings . System . getInt ( context . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . System . H AP T IC _ FEED BACK _ ENABLED , Ġ 0 ) Ġ== Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ