package Ġde . mark us fis ch . android . binary eye . app Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Environment Ċ import Ġandroid . support . annotation . MainThread Ċ import Ġandroid . widget . EditText Ċ import Ġde . mark us fis ch . android . binary eye . R Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ fun Ġadd Suffix IfNot Given ( name : ĠString , Ġsuffix : ĠString ): ĠString Ġ{ Ċ ĉ val Ġtrimmed Ġ= Ġname . trim () Ċ ĉ return Ġif Ġ( suffix . isNotEmpty () Ġ&& Ġ! trimmed . endsWith ( suffix )) Ġ{ Ċĉ ĉ "$ trimmed $ suffix " Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ trimmed Ċ ĉ } Ċ } Ċ Ċ // ĠDialog s Ġdoesn 't Ġhave Ġany Ġroot Ġlayout , Ġneed Ġto Ġbe Ġinfl ated Ġwith Ġnull Ġroot Ċ @ Suppress (" Inf late Params ") Ċ @ MainThread Ċ suspend Ġfun ĠActivity . ask For FileName ( suffix : ĠString Ġ= Ġ"") : ĠString ? Ġ{ Ċ ĉ val Ġview Ġ= Ġlayout Inflater . inflate ( R . layout . dialog _ save _ file , Ġnull ) Ċ ĉ val Ġedit Text Ġ= Ġview . findViewById < EditText >( R . id . file _ name ) Ċ ĉ return Ġalert Dialog < String >( this Ġas ĠContext ) Ġ{ Ġresume Ġ-> Ċĉ ĉ setView ( view ) Ċĉ ĉ set Positive Button ( android . R . string . ok ) Ġ{ Ġ_, Ġ_ Ġ-> Ċĉĉ ĉ resume ( edit Text . text . toString ()) Ċĉ ĉ } Ċ ĉ } ?. let Ġ{ Ġname Ġ-> Ċĉ ĉ add Suffix IfNot Given ( name , Ġsuffix ) Ċ ĉ } Ċ } Ċ Ċ suspend Ġfun ĠFlow < ByteArray >. write ToFile ( name : ĠString ): ĠInt Ġ{ Ċ ĉ return Ġtry Ġ{ Ċĉ ĉ val Ġfile Ġ= ĠFile ( Ċĉĉ ĉ Environment . get External Storage Public Directory ( Ċĉĉĉ ĉ Environment . DIRECTORY _ DOWNLOAD S Ċĉĉ ĉ ), Ċĉĉ ĉ name Ċĉ ĉ ) Ċĉ ĉ if Ġ( file . exists ()) Ġ{ Ċĉĉ ĉ return ĠR . string . error _ file _ exists Ċĉ ĉ } Ċĉ ĉ collect Ġ{ Ġbytes Ġ-> Ċĉĉ ĉ file . append Bytes ( bytes ) Ċĉ ĉ } Ċĉ ĉ R . string . saved _ in _ downloads Ċ ĉ } Ġcatch Ġ( e : ĠIOException ) Ġ{ Ċĉ ĉ R . string . error _ saving _ binary _ data Ċ ĉ } Ċ } Ċ