package Ġcom . ir ware . remote Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Radio Group Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . appcompat . view . menu . Menu Builder Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . radio button . Material RadioButton Ċ import Ġcom . ir ware . remote . ui . adapters . Settings Adapter Ċ import Ġorg . json . JSONObject ĊĊ Ċ class ĠSettings Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cyclerView : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Adapter : ĠRecyclerView . Adapter < *> ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Manager : ĠRecyclerView . LayoutManager ĊĊĠĠĠ Ġ@ Suppress Lint (" Use Compat Loading For Draw ables ", Ġ" Restricted Api ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġwhen ( get SharedPreferences (" theme _ setting ", ĠContext . MODE _ PRIVATE ). getInt (" application _ theme ", if Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ Ġ 0 Ġ} else { Ġ 2 Ġ})) ĊĠĠĠĠĠĠĠ Ġ{ 1 -> ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ NO ); 2 -> ĠAppCompat Delegate . setDefault Night Mode ( AppCompat Delegate . MODE _ N IGHT _ YES )} ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ settings ) ĊĊĠĠĠĠĠĠĠ Ġview Manager Ġ= ĠLinearLayoutManager ( this ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġfragment List Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġval Ġmenu Ġ= ĠMenu Builder ( this ) ĊĠĠĠĠĠĠĠ ĠMenu Inflater ( this ). inflate ( R . menu . activity _ main _ drawer , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġmenu . visible Items . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment List . add ( it . title . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 .. 1 ) Ġif ( fragment List . size Ġ!= Ġ 0 Ġ) Ġfragment List . remove At ( fragment List . size Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġview Adapter Ġ= ĠSettings Adapter ( array ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Item (" Application ĠTheme "," UI Ġtheme Ġfor Ġi RW a RE ĠApplication ", Ġselection Dialog (" Application ĠTheme ", ĠR . drawable . icon _ theme , Ġ" application _ theme ", Ġarray ListOf (" Follow ĠSystem ĠTheme ", Ġ" Light ĠTheme ", Ġ" Dark ĠTheme "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheme Changed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( when ( get SharedPreferences (" settings ", ĠContext . MODE _ PRIVATE ). getInt (" application _ theme ", Ġ 0 )){ 1 Ġ-> Ġ{ AppCompat Delegate . MODE _ N IGHT _ NO } Ġ 2 Ġ-> Ġ{ AppCompat Delegate . MODE _ N IGHT _ YES } Ġelse Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}), ĠR . drawable . icon _ theme ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Item (" Home ĠFragment "," Fragment Ġthat Ġopens Ġon Ġapp Ġlaunch ", Ġselection Dialog (" Home ĠFragment ", ĠR . drawable . icon _ home , Ġ" home _ fragment ", Ġfragment List , Ġnull ), ĠR . drawable . icon _ home ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġre cyclerView Ġ= ĠfindViewById < RecyclerView >( R . id . settings _ list ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= Ġview Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġview Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( item . itemId ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Apply Shared Pref ", Ġ" Inf late Params ") ĊĠĠĠ Ġprivate Ġfun Ġselection Dialog ( title : ĠString , Ġicon : ĠInt , Ġpref Name : ĠString , Ġopt List : ĠList < String >, Ġaction : ĠRunnable ?): AlertDialog { ĊĠĠĠĠĠĠĠ Ġval Ġpref Ġ= Ġget SharedPreferences (" settings ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġpref . edit () ĊĊĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠRadio Group ( this ) ĊĠĠĠĠĠĠĠ Ġcontent . set Padding Relative ( 2 4 , Ġ 0 , 0 , 0 ) ĊĠĠĠĠĠĠĠ Ġopt List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradio Button Ġ= ĠMaterial RadioButton ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . text Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . id Ġ= Ġopt List . indexOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . addView ( radioButton ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button . layout Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName ( radioButton . parent . java Class . name ). classes [ 1 ]. get Constructor ( Int :: class . java , ĠInt :: class . java ). newInstance ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . WRAP _ CONTENT ) Ġas ĠViewGroup . LayoutParams ? ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setView ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIcon ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button (" Cancel "){ _, _-> } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Apply "){ _, _-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . put Int ( pref Name , Ġcontent . checked RadioButton Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ?. run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠĠĠĠĠ Ġdialog . setOn Show Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . window ?. setBackground Drawable Resource ( R . drawable . layout _ border _ round _ corner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . window ?. setLayout (( MainActivity . size . x Ġ* Ġ 0 . 8 ). toInt (), ĠWindow Manager . LayoutParams . WRAP _ CONTENT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . check ( pref . getInt ( pref Name , 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . layout Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName ( content . parent . java Class . name ). classes [ 0 ]. get Constructor ( Int :: class . java , ĠInt :: class . java ). newInstance ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . WRAP _ CONTENT ) Ġas ĠViewGroup . LayoutParams ? ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdialog ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġvar Ġtheme Changed Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠSettings Item ( var Ġtitle : ĠString , Ġvar Ġsubtitle : ĠString , Ġvar Ġdialog : Dialog ?, Ġvar Ġicon Res : ĠInt Ġ= Ġ 0 , Ġvar Ġclick Action : ĠRunnable ? Ġ= Ġnull ) Ċ