package Ġcom . program mers box . ot ak uman ager Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . webkit . URL Util Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . Component Activity Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . compose . animation . Animated Visibility Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . click able Ċ import Ġandroidx . compose . foundation . layout . Arrange ment Ċ import Ġandroidx . compose . foundation . layout . Column Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . remember Scroll State Ċ import Ġandroidx . compose . foundation . vertical Scroll Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Che vron Right Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . runtime . rx java 2 . subscribe As State Ċ import Ġandroidx . compose . runtime . save able . remember Save able Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . layout . Content Scale Ċ import Ġandroidx . compose . ui . platform . Local Context Ċ import Ġandroidx . compose . ui . platform . Local View Ċ import Ġandroidx . compose . ui . res . p ainter Resource Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . datastore . core . DataStore Ċ import Ġandroidx . datastore . preferences . core . Preferences Ċ import Ġandroidx . datastore . preferences . core . edit Ċ import Ġandroidx . datastore . preferences . core . string Preferences Key Ċ import Ġandroidx . datastore . preferences . preferences DataStore Ċ import Ġcom . al orm a . settings . comp os ables . Settings Group Ċ import Ġcom . al orm a . settings . comp os ables . Settings Menu Link Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . firebase . auth . Firebase User Ċ import Ġcom . program mers box . help ful utils . request Permissions Ċ import Ġcom . program mers box . logging utils . Lo ged Ċ import Ġcom . program mers box . shared utils . App Update Ċ import Ġcom . program mers box . shared utils . Firebase Authentication Ċ import Ġcom . program mers box . shared utils . Main Logo Ċ import Ġcom . program mers box . shared utils . app Update Check Ċ import Ġcom . program mers box . u iv iew s . Build Config Ċ import Ġcom . program mers box . u iv iew s . Generic Info Ċ import Ġcom . program mers box . u iv iew s . utils . open In Custom Chrome Browser Ċ import Ġcom . sky do ves . land sc ap ist . glide . G lide Image Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġorg . k oin . core . component . K oin Component Ċ import Ġorg . k oin . core . component . inject Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ val ĠContext . data Store : ĠData Store < Preferences > Ġby Ġpreferences DataStore (" ot aku settings ") Ċ val ĠTHE ME _ SETTING Ġ= Ġstring Preferences Key (" theme ") Ċ Ċ @ Experimental Animation Api Ċ @ Composable Ċ fun ĠO t aku Settings ( activity : ĠComponent Activity , Ġgeneric Info : ĠGeneric Info ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġvertical Arrange ment Ġ= ĠArrange ment . spaced By ( 5 . dp ), ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 5 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. vertical Scroll ( remember Scroll State ()) ĊĠĠĠ Ġ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġ// add Ġscaffold Ġand Ġthe Ġtitle Ġwill Ġbe Ġsettings ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġremember Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġremember Ġ{ ĠComposite Disposable () Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġaccount Info Ġby Ġremember Ġ{ Ġmutable State Of < Firebase User ? >( null ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpackage Manager Ġ= ĠLocal Context . current . package Manager ĊĊĠĠĠĠĠĠĠ ĠLa unched Effect ( Unit ) Ġ{ ĠFirebase Authentication . auth . add Auth State Listener Ġ{ Ġaccount Info Ġ= Ġit . currentUser Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ ĠDis posable Effect ( account Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{ Ġdis posable . dispose () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSettings Group ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . account _ category _ title ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Model Ġ= Ġaccount Info ?. photoUrl Ġ?: ĠR . drawable . ot ak uman ager _ logo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= ĠContent Scale . Crop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Builder Ġ= Ġ{ ĠG lide . with ( Local View . current ). as Drawable (). circle Crop () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġaccount Info ?. displayName Ġ?: Ġ" User ", Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Authentication . currentUser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . log Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . are You S ure Log Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . yes ) Ġ{ Ġd , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Authentication . sign Out () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . no ) Ġ{ Ġd , Ġ_ Ġ-> Ġd . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠFirebase Authentication . signIn ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSettings Group ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . about ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Update Ġby Ġapp Update Check ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe As State ( initial Ġ= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent App Info Ġ= Ġremember Save able Ġ{ Ġpackage Manager ?. get Package Info ( activity . packageName , Ġ 0 )?. version Name . or Empty () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . current Version , Ġcurrent App Info ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . press _ to _ check _ for _ updates ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Update . get Update ()?. let ( app Update Check :: onNext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĠToast . makeText ( activity , Ġ" Done ĠChecking ", ĠToast . LENGTH _ SHORT ). show () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnimated Visibility ( visible Ġ= ĠApp Update . check For Update ( current App Info , Ġapp Update ?. update _ real _ version . or Empty ())) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . update To , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . getString ( R . string . current Version , Ġapp Update ?. update _ real _ version . or Empty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . please _ update _ for _ latest _ features ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . update ) Ġ{ Ġd , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . request Permissions ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE , ĠManifest . permission . READ _ EXTERNAL _ STORAGE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Check . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġa Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis A pk Already There Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . get External Files Dir ( Environment . DIRECTORY _ DOWNLOAD S ) !!. absolute Path Ġ+ Ġ"/", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . let ( generic Info . apk String ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is A pk Already There . exists ()) Ġis A pk Already There . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload A pk ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . download Url ( generic Info . apk String ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . let ( generic Info . apk String ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). start Downloading A pk () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Neutral Button ( R . string . goto Browser ) Ġ{ Ġd , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . open In Custom Chrome Browser (" https :// github . com / j ake purple 1 3 / Ot aku World / releases / latest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . not Now ) Ġ{ Ġd , Ġ_ Ġ-> Ġd . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠImage ( p ainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . ic _ baseline _ system _ update _ alt _ 2 4 ), Ġcontent Description Ġ= Ġnull ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . update _ available ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġstring Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠR . string . current Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update ?. update _ real _ version . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ 5 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġupdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Default . Che vron Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . click able ( onClick Ġ= Ġupdate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠImage ( p ainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . github _ icon ), Ġcontent Description Ġ= Ġnull ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . view _ on _ github ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// subtitle Ġ= Ġ{ ĠText ( text Ġ= Ġ"", Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ Ġactivity . open In Custom Chrome Browser (" https :// github . com / j ake purple 1 3 / Ot aku World /") Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Default . Che vron Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . click able ( onClick Ġ= Ġ{ Ġactivity . open In Custom Chrome Browser (" https :// github . com / j ake purple 1 3 / Ot aku World /") Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠSettings Group ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġ" Ot aku ĠApps ", Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSetting Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" M anga World ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . m ang aw orld _ logo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . program mers box . m ang aw orld ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager , Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSetting Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ime World ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . anime world _ logo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . program mers box . anime world ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager , Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSetting Item ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No vel World ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . no vel world _ logo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . program mers box . no vel world ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager , Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Preference < List Preference >(" theme _ setting ") ?. let Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . set DefaultValue (" system ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . setOn Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" system " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" light " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dark " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let ( AppCompat Delegate :: setDefault Night Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( p . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" system " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" light " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dark " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let ( AppCompat Delegate :: setDefault Night Mode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ ĠSettings Group ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . general _ menu _ title ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Ġby Ġactivity . data Store . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit [ THEME _ SETTING ] Ġ?: Ġ" System " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect As State ( initial Ġ= Ġ" System ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme List Ġ= ĠarrayOf (" System ", Ġ" Light ", Ġ" Dark ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠImage ( p ainter Ġ= Ġpainter Resource ( id Ġ= ĠR . drawable . ic _ baseline _ settings _ brightness _ 2 4 ), Ġcontent Description Ġ= Ġnull ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġstring Resource ( id Ġ= ĠR . string . theme _ choice _ title ), Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Ġ= Ġ{ ĠText ( text Ġ= Ġtheme , Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . choose _ a _ theme ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIcon ( R . drawable . ic _ baseline _ settings _ brightness _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( theme List , Ġtheme List . indexOf ( theme )) Ġ{ Ġd , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch ( Dispatch ers . IO ) Ġ{ Ġactivity . data Store . edit Ġ{ Ġit [ THEME _ SETTING ] Ġ= Ġtheme List [ i ] Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( theme List [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" System " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ FOLLOW _ SYSTEM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Light " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Dark " Ġ-> ĠAppCompat Delegate . MODE _ N IGHT _ YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let ( AppCompat Delegate :: setDefault Night Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . cancel ) Ġ{ Ġd , Ġ_ Ġ-> Ġd . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ fun ĠSetting Item ( text : ĠString , Ġicon : ĠInt , ĠpackageName : ĠString , Ġpackage Manager : ĠPackage Manager , Ġactivity : ĠComponent Activity ) Ġ{ ĊĠĠĠ Ġval Ġworld Ġ= Ġremember Ġ{ Ġpackage Manager . get Launch Intent For Package ( packageName ) Ġ} ĊĊĠĠĠ Ġval Ġversion Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġpackage Manager . get Package Info ( packageName , ĠPackage Manager . GET _ ACTIV ITIES ). version Name ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( world Ġ!= Ġnull ) Ġactivity . startActivity ( world ) ĊĠĠĠĠĠĠĠ Ġelse Ġactivity . open In Custom Chrome Browser (" https :// github . com / j ake purple 1 3 / Ot aku World /") ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠSettings Menu Link ( ĊĠĠĠĠĠĠĠ Ġicon Ġ= Ġ{ ĠImage ( p ainter Ġ= Ġpainter Resource ( id Ġ= Ġicon ), Ġcontent Description Ġ= Ġtext ) Ġ}, ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ{ ĠText ( text Ġ= Ġtext , Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp )) Ġ}, ĊĠĠĠĠĠĠĠ Ġsubtitle Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġif Ġ( world Ġ!= Ġnull ) Ġ" Installed Ġ- ĠVersion : Ġ$ version " Ġelse Ġ" Not ĠInstalled ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . padding ( start Ġ= Ġ 5 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠonClick Ġ= ĠonClick , ĊĠĠĠĠĠĠĠ Ġaction Ġ= Ġ{ ĠIcon ( image Vector Ġ= ĠIcons . Default . Che vron Right , Ġcontent Description Ġ= Ġnull , Ġmodifier Ġ= ĠModifier . click able ( onClick Ġ= ĠonClick )) Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠDownload A pk ( val Ġcontext : ĠContext , Ġprivate Ġval Ġdownload Url : ĠString , Ġprivate Ġval Ġoutput Name : ĠString ) Ġ: ĠCor outine Scope , ĠK oin Component Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob Ġ= ĠJob () ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . Main Ġ+ Ġjob Ġ// Ġto Ġrun Ġcode Ġin ĠMain ( UI ) ĠThread ĊĊĠĠĠ Ġprivate Ġval Ġlogo : ĠMain Logo Ġby Ġinject () ĊĊĠĠĠ Ġ// Ġcall Ġthis Ġmethod Ġto Ġcancel Ġa Ġcoroutine Ġwhen Ġyou Ġdon 't Ġneed Ġit Ġanymore , ĊĠĠĠ Ġ// Ġe . g . Ġwhen Ġuser Ġcloses Ġthe Ġscreen ĊĠĠĠ Ġfun Ġcancel () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Downloading A pk () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( URL Util . isValid Url ( download Url )) Ġexecute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbar : ĠAlertDialog ĊĊĠĠĠ Ġprivate Ġfun Ġexecute () Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠ Ġon Pre Execute () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdo In Background () Ġ// Ġruns Ġin Ġbackground Ġthread Ġwithout Ġblocking Ġthe ĠMain ĠThread ĊĠĠĠĠĠĠĠ Ġon Post Execute ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon Progress Update ( var arg Ġvalues : ĠInt ?) Ġ= Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues [ 0 ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbar . setMessage ( if Ġ( it Ġ> Ġ 9 9 ) Ġcontext . getString ( R . string . finish ing _ dots ) Ġelse Ġcontext . getString ( R . string . download ing _ dots , Ġit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġdo In Background (): ĠBoolean Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġ// Ġto Ġrun Ġcode Ġin ĠBackground ĠThread ĊĠĠĠĠĠĠĠ Ġ// Ġdo Ġasync Ġwork ĊĠĠĠĠĠĠĠ Ġvar Ġflag Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( download Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . request Method Ġ= Ġ" GET " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠEnvironment . get External Storage Directory (). toString () Ġ+ Ġ"/ Download /" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= ĠFile ( file , Ġoutput Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outputFile . exists ()) ĠoutputFile . delete () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġc . inputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Size Ġ= Ġc . content Length . toFloat () Ġ// size Ġof Ġapk ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen 1 : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdownloaded Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( inputStream . read ( buffer ). also Ġ{ Ġlen 1 Ġ= Ġit Ġ} Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf os . write ( buffer , Ġ 0 , Ġlen 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdownloaded Ġ+= Ġlen 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Progress Update (( downloaded Ġ* Ġ 1 0 0 Ġ/ Ġtotal Size ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf os . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĠoutputFile . delete () Ġelse Ġopen New Version ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLo ged . e (" Update ĠError : Ġ" Ġ+ Ġe . message , Ġ" Download A pk ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn @ with Context Ġflag ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRuns Ġon Ġthe ĠMain ( UI ) ĠThread ĊĠĠĠ Ġprivate Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġshow Ġprogress ĊĠĠĠĠĠĠĠ Ġbar Ġ= ĠMaterial AlertDialog Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . updating _ dots ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . download ing _ dots _ no _ percent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIcon ( logo . logo Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠRuns Ġon Ġthe ĠMain ( UI ) ĠThread ĊĠĠĠ Ġprivate Ġfun Ġon Post Execute ( result : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhide Ġprogress ĊĠĠĠĠĠĠĠ Ġbar . dismiss () ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġif Ġ( result Ġ== Ġtrue ) ĠR . string . finished Downloading Ġelse ĠR . string . error Try Again , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen New Version ( location : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠ Ġintent . setData And Type ( get Uri FromFile ( location ), Ġ" application / vnd . android . package - archive ") ĊĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Uri FromFile ( location : ĠString ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . from File ( File ( location Ġ+ Ġoutput Name )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( context , Ġcontext . packageName Ġ+ Ġ". provider ", ĠFile ( location Ġ+ Ġoutput Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }