/* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof Ġbb - test - task , Ġlicensed Ġunder Ġthe ĠMIT ĠLicense Ġ( MIT ). Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) ĠOs ip ĠF atk ull in Ġ< os ip . fat k ull in @ gmail . com > Ċ Ġ* ĠCopyright Ġ( c ) Ġcontributors Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġru . end less code . bb test . ui . fragment Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Transition Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . V ibration Effect Ċ import Ġandroid . os . V ibr ator Ċ import Ġandroid . support . v 4 . app . Fragment Activity Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġcom . are l lo mobile . mvp . M vp AppCompat Fragment Ċ import Ġcom . are l lo mobile . mvp . presenter . Inject Presenter Ċ import Ġcom . are l lo mobile . mvp . presenter . Provide Presenter Ċ import Ġcom . bump tech . glide . signature . Object Key Ċ import Ġgun 0 9 1 2 . ted bot to mp icker . T ed Bottom Picker Ċ import Ġkotlinx . android . synt hetic . main . fragment _ edit _ user .* Ċ import Ġpermissions . dispatcher . Needs Permission Ċ import Ġpermissions . dispatcher . On Permission Denied Ċ import Ġpermissions . dispatcher . Runtime Permissions Ċ import Ġru . end less code . bb test . R Ċ import Ġru . end less code . bb test . Test App Ċ import Ġru . end less code . bb test . misc . G lide Provider Ċ import Ġru . end less code . bb test . mvp . model . User Item Ċ import Ġru . end less code . bb test . mvp . presenter . User Edit Presenter Ċ import Ġru . end less code . bb test . mvp . view . User Edit View Ċ import Ġru . end less code . bb test . ui . extension . setOn Focus Lost Listener Ċ import Ġru . end less code . bb test . ui . extension . start And Then Ċ import Ġru . end less code . bb test . ui . extension . validate Is Email Ċ import Ġru . end less code . bb test . ui . extension . validate NotBlank Ċ import Ġjavax . inject . Inject Ċ Ċ @ Runtime Permissions Ċ class ĠUser Edit Fragment Ġ: ĠM vp AppCompat Fragment (), ĠUser Edit View Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġ@ Inject Presenter ĊĠĠĠ Ġlateinit Ġvar Ġpresenter : ĠUser Edit Presenter ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġg lide Provider : ĠG lide Provider ĊĊĠĠĠ Ġprivate Ġval Ġname Field Ġby Ġlazy Ġ{ Ġname _ field Ġ} ĊĠĠĠ Ġprivate Ġval Ġs urname Field Ġby Ġlazy Ġ{ Ġs urname _ field Ġ} ĊĠĠĠ Ġprivate Ġval Ġemail Field Ġby Ġlazy Ġ{ Ġemail _ field Ġ} ĊĠĠĠ Ġprivate Ġval Ġname Input Layout Ġby Ġlazy Ġ{ Ġname _ input _ layout Ġ} ĊĠĠĠ Ġprivate Ġval Ġs urname Input Layout Ġby Ġlazy Ġ{ Ġs urname _ input _ layout Ġ} ĊĠĠĠ Ġprivate Ġval Ġemail Input Layout Ġby Ġlazy Ġ{ Ġemail _ input _ layout Ġ} ĊĠĠĠ Ġprivate Ġval Ġavatar Ġby Ġlazy Ġ{ Ġavatar _ view Ġ} ĊĠĠĠ Ġprivate Ġval Ġbtn Apply Ġby Ġlazy Ġ{ Ġbutton _ apply Ġ} ĊĠĠĠ Ġprivate Ġval Ġbtn Clear Ġby Ġlazy Ġ{ Ġbutton _ clear Ġ} ĊĠĠĠ Ġprivate Ġval Ġchange Avatar Ġby Ġlazy Ġ{ Ġchange _ avatar Ġ} ĊĠĠĠ Ġprivate Ġval Ġavatar Update Indicator Ġby Ġlazy Ġ{ Ġavatar _ update _ indicator Ġ} ĊĊĠĠĠ Ġ@ Provide Presenter ĊĠĠĠ Ġfun Ġprovide Presenter (): ĠUser Edit Presenter Ġ= Ġpresenter ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠTest App . users Component . inject ( this ) ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . inflate ( R . layout . fragment _ edit _ user , Ġcontainer , Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView ?, ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( arguments Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . on Cre te View Created () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition : ĠInt Ġ= Ġarguments . getInt (" position ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser : ĠUser Item Ġ= Ġarguments . get Parcelable (" user ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . on Update View Created ( position , Ġuser ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Clear . setOnClickListener Ġ{ Ġpresenter . on Clear Clicked () Ġ} ĊĠĠĠĠĠĠĠ Ġbtn Apply . setOnClickListener Ġ{ Ġif Ġ( validate Fields ()) Ġpresenter . on Apply Clicked () Ġelse Ġsh ake Apply Button () Ġ} ĊĠĠĠĠĠĠĠ Ġchange Avatar . setOnClickListener Ġ{ Ġopen Image Sector With Permission Check () Ġ} ĊĊĠĠĠĠĠĠĠ Ġname Field . setOn Focus Lost Listener Ġ{ Ġvalidate Name Field () Ġ} ĊĠĠĠĠĠĠĠ Ġs urname Field . setOn Focus Lost Listener Ġ{ Ġvalidate S urname Field () Ġ} ĊĠĠĠĠĠĠĠ Ġemail Field . setOn Focus Lost Listener Ġ{ Ġvalidate Email Field () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Needs Permission ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠ Ġfun Ġopen Image Sector () Ġ{ ĊĠĠĠĠĠĠĠ ĠT ed Bottom Picker . Builder ( context ). setOn Image Selected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . update Avatar ( it . path ) ĊĠĠĠĠĠĠĠ Ġ}. create (). show (( context Ġas ĠFragment Activity ). support FragmentManager ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Permission Denied ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠ Ġfun Ġon Permission Denied () Ġ= Ġpresenter . on Permission Denied () ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġon Request Permissions Result ( request Code , Ġgrant Results ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsh ake Apply Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsh ake Ġ= ĠAnimation Utils . load Animation ( this . context , ĠR . anim . shake ) ĊĠĠĠĠĠĠĠ Ġbtn Apply . start Animation ( shake ) ĊĠĠĠĠĠĠĠ Ġthis . vi br ate ( duration Ġ= Ġ 1 5 , Ġdelay Ġ= Ġ 1 0 , Ġtimes Ġ= Ġ 2 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvi br ate ( duration : ĠLong , Ġdelay : ĠLong , Ġtimes : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvi br ator Ġ= Ġcontext . getSystem Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠ Ġif Ġ( vi br ator . has V ibr ator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpattern Ġ= Ġlong ArrayOf ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( times ) Ġ{ Ġpattern Ġ+= Ġduration Ġ+ Ġdelay Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( V ibration Effect . create Wave form ( pattern , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( pattern , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Fields (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalidate Name Field () Ġand Ġvalidate S urname Field () Ġand Ġvalidate Email Field () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Name Field (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġname Field . validate NotBlank ( name Input Layout ) ĊĠĠĠĠĠĠĠ Ġpresenter . new Name Ġ= Ġname Field . text . toString () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠisValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate S urname Field (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġs urname Field . validate NotBlank ( surname Input Layout ) ĊĠĠĠĠĠĠĠ Ġpresenter . new S urname Ġ= Ġs urname Field . text . toString () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠisValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Email Field (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġemail Field . validate Is Email ( email Input Layout ) ĊĠĠĠĠĠĠĠ Ġpresenter . new Email Ġ= Ġemail Field . text . toString () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠisValid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetData ( name : ĠString , Ġs urname : ĠString , Ġemail : ĠString , Ġavatar Url : ĠString , Ġsignature : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġname Field . setText ( name ) ĊĠĠĠĠĠĠĠ Ġs urname Field . setText ( surname ) ĊĠĠĠĠĠĠĠ Ġemail Field . setText ( email ) ĊĠĠĠĠĠĠĠ Ġset Avatar ( avatar Url , Ġsignature ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Avatar ( path : ĠString , Ġsignature : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg lide Provider . request . clone (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder ( R . color . transparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( R . drawable . ic _ avatar _ placeholder _ 2 4 px ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride ( avatar . width , Ġavatar . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignature ( Object Key ( signature )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( avatar ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Avatar Updating Indicator () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Bg Ġ= Ġchange Avatar . background Ġas ĠTransition Drawable ĊĠĠĠĠĠĠĠ Ġval Ġindicator Bg Anim Ġ= Ġavatar Update Indicator . background Ġas ĠTransition Drawable ĊĠĠĠĠĠĠĠ Ġindicator Bg Anim . reset Transition () ĊĠĠĠĠĠĠĠ Ġavatar Update Indicator . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġoverlay Bg . start Transition ( 3 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhide Avatar Update Indicator () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Bg Anim Ġ= Ġchange Avatar . background Ġas ĠTransition Drawable ĊĠĠĠĠĠĠĠ Ġval Ġindicator Bg Anim Ġ= Ġavatar Update Indicator . background Ġas ĠTransition Drawable ĊĊĠĠĠĠĠĠĠ Ġoverlay Bg Anim . reverse Transition ( 3 0 0 ) ĊĠĠĠĠĠĠĠ Ġindicator Bg Anim . start And Then ( 1 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġavatar Update Indicator . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Fields () Ġ{ ĊĠĠĠĠĠĠĠ Ġname Field . setText ("") ĊĠĠĠĠĠĠĠ Ġs urname Field . setText ("") ĊĠĠĠĠĠĠĠ Ġemail Field . setText ("") ĊĠĠĠ Ġ} Ċ } Ċ