/* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠC urity ĠAB Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġio . curity . ha ap ide mo Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġio . curity . ha ap ide mo . flow . Ha api Flow Configuration Ċ import Ġio . curity . ha ap ide mo . ui . settings .* Ċ import Ġio . curity . ha ap ide mo . ui . settings . profile .* Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ Ċ class ĠProfile Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠProfile ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠProfile Adapter ( ĊĠĠĠĠĠĠĠ Ġclick Handler Ġ= Ġ{ Ġcontent , Ġposition Ġ-> Ġselect Item ( content , Ġposition ) Ġ}, ĊĠĠĠĠĠĠĠ Ġtoggle Handler Ġ= Ġ{ Ġposition Ġ-> Ġtoggle Item ( position ) Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġscopes Adapter Ġ= ĠS copes Adapter ( check Handler Ġ= Ġ{ Ġindex Ġ-> ĠviewModel . toggle Scope ( index ) Ġ}) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ profile ) ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠfindViewById ( R . id . re cyclerView ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig String Ġ= Ġintent . getString Extra ( EXTRA _ H AA PI _ CONFIGURATION ) ĊĠĠĠĠĠĠĠ Ġif Ġ( config String Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Missing Ġextra Ġarguments , Ġuse ĠProfile Activity . new Intent (...) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration : ĠHa api Flow Configuration Ġ= ĠJson . decode FromString ( config String ) ĊĠĠĠĠĠĠĠ Ġval ĠisActive Configuration Ġ= Ġintent . getBoolean Extra ( EXTRA _ H AA PI _ IS _ ACTIVE _ CONFIGURATION , Ġfalse ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProfile ViewModel Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHa api Flow Configuration Repository ( data Store Ġ= Ġconfiguration DataStore ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration Ġ= Ġconfiguration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisActive Configuration Ġ= ĠisActive Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). get ( Profile ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . list LiveData . observe ( this ) Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . scopes LiveData . observe ( this ) Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscopes Adapter . submit List ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbutton : ĠButton Ġ= ĠfindViewById ( R . id . button ) ĊĊĠĠĠĠĠĠĠ Ġbutton . visibility Ġ= Ġif Ġ( isActive Configuration ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġbutton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Configuration Active () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Assert ") ĊĠĠĠ Ġprivate Ġfun Ġselect Item ( item : ĠProfile Item , Ġat Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProfile Item . Content Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle ( item . header ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Text Ġ= ĠEditText ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Text . setText ( item . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setView ( input Text ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Positive Button (" Save ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update ( input Text . text . toString (), Ġat Index Ġ= ĠProfile Index . from Int ( at Index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Negative Button (" Cancel ") Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProfile Item . Loading Action Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch MetaData ( Coroutine ExceptionHandler ({ Ġ_, Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Profile Activity , Ġexception . toString (), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ Ġassert ( value Ġ= Ġfalse , Ġlazy Message Ġ= Ġ{ Ġ" Profile Item . Type Ġis Ġnot Ġhandled " Ġ}) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Configuration Active () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . make Configuration Active () ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Item ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . update Boolean ( index Ġ= ĠProfile Index . from Int ( index )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ H AA PI _ CONFIGURATION Ġ= Ġ" io . curity . ha ap ide mo . profile Activity . extra _ configuration " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ H AA PI _ IS _ ACTIVE _ CONFIGURATION Ġ= Ġ" io . curity . ha ap ide mo . profile Activity . extra _ is _ active _ configuration " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġha api Configuration : ĠHa api Flow Configuration , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠisActive Configuration : ĠBoolean ): ĠIntent ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠProfile Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ H AA PI _ CONFIGURATION , ĠJson . encode ToString ( ha api Configuration )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ H AA PI _ IS _ ACTIVE _ CONFIGURATION , ĠisActive Configuration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠProfile Index Ġ{ ĊĠĠĠ ĠSection Base Configuration , ĊĠĠĠ ĠItem Name , ĊĠĠĠ ĠItem ClientId , ĊĠĠĠ ĠItem Base URL , ĊĠĠĠ ĠItem Redirect URI , ĊĠĠĠ ĠSection MetaData , ĊĠĠĠ ĠItem MetaData URL , ĊĠĠĠ ĠItem Loading MetaData , ĊĠĠĠ ĠSection Endpoints , ĊĠĠĠ ĠItem Token Endpoint URI , ĊĠĠĠ ĠItem Authorization Endpoint URI , ĊĠĠĠ ĠSection Supported Scopes , ĊĠĠĠ ĠItem Scopes , ĊĠĠĠ ĠSection Toggle s , ĊĠĠĠ ĠItem Follow Redirect , ĊĠĠĠ ĠItem Automatic Polling , ĊĠĠĠ ĠItem Auto Authorization Ch allen ged , ĊĠĠĠ ĠItem SSL Trust Verification ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Int ( value : ĠInt ) Ġ= Ġvalues (). first Ġ{ Ġit . ordinal Ġ== Ġvalue Ġ} ĊĠĠĠ Ġ} Ċ }