package Ġjp . co . ze ppelin . nec . he arable . ui . permissions Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . navigation . fragment . Nav Host Fragment Ċ import Ġjp . co . ze ppelin . nec . he arable . R Ċ import Ġjp . co . ze ppelin . nec . he arable . domain . helpers . Z ep Log Ċ import Ġjp . co . ze ppelin . nec . he arable . permissions . I Permissions Contract Ċ import Ġjp . co . ze ppelin . nec . he arable . ui . vm . ViewModel Common Ċ import Ġjp . co . ze ppelin . nec . he arable . ui . vm . ViewModel Common Factory Ċ Ċ /** Ċ Ġ* ĠScreen Ġexplaining Ġto Ġuser Ġwhy Ġlocation Ġpermission Ġrequired Ġby Ġapp Ċ Ġ* Ċ Ġ* Ġ( c ) Ġ 2 0 2 0 ĠZe ppelin ĠInc ., ĠSh i bu ya , ĠTok yo ĠJ AP AN Ċ Ġ*/ Ċ @ kotlin x . coroutines . Internal Cor outines Api Ċ @ kotlin x . coroutines . Experimental Cor outines Api Ċ class ĠEx plain Permission Location Frag Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠEx plain Permission Location Frag :: class . java . simple Name ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠViewModel Common ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbutton Next : ĠButton ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġactivity ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠviewModel Factory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Common Factory ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Provider ( this , ĠviewModel Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( ViewModel Common :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠException ("$ TAG :: on Activity Created (): ĠERROR : ĠInvalid ĠActivity ") ĊĊĠĠĠĠĠĠĠ ĠviewModel . location Permission Granted . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġpermission Status Single Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Status Single . getContent IfNot Handled ()?. let Ġ{ Ġpermission Status Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( permission Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI Permissions Contract . Permission Status . Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNav Host Fragment . find Nav Controller ( this @ Explain Permission Location Frag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( Explain Permission Location Frag Directions . action Nav Permission Location Explain To Nav Confirm He arable Id ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI Permissions Contract . Permission Status . Denied , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI Permissions Contract . Permission Status . Per manently Denied Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ ep Log . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Activity Created (): Ġlocation Ġpermission Ġdenied Ġ( possibly Ġper manently )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . check Permission Or Take To Settings If Per manently Denied Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġinflater . inflate ( R . layout . frag _ explain _ permission _ location , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbutton Next Ġ= Ġroot . findViewById ( R . id . button Next ) ĊĠĠĠĠĠĠĠ Ġbutton Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . check Permission Or Take To Settings If Per manently Denied Location () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcase Ġof Ġuser Ġnavig ating Ġback Ġfrom Ġsystem Ġsettings Ġafter Ġgrant ing Ġpermission ĊĠĠĠĠĠĠĠ ĠviewModel . check And Request Permissions Bluetooth N Location () ĊĠĠĠ Ġ} Ċ } Ċ