package Ġcom . kar umi . shot . compose Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Build Ċ import Ġandroidx . compose . ui . test . Semantics Node Interaction Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . kar umi . shot . Android Storage Info Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ class ĠScreen shot Saver ( private Ġval ĠpackageName : ĠString , Ġprivate Ġval Ġbitmap Generator : ĠSem antics Node Bitmap Generator ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscreenshots Folder : ĠString Ġ= Ġ"${ Android Storage Info . storage BaseUrl }/ screenshots /$ packageName / screenshots - compose - default /" ĊĠĠĠ Ġprivate Ġval Ġmetadata File : ĠString Ġ= Ġ"$ screenshots Folder / metadata . json " ĊĠĠĠ Ġprivate Ġval Ġgson : ĠGson Ġ= ĠGson () ĊĊĠĠĠ Ġfun Ġsave Screenshot ( screenshot : ĠScreen shot To Save ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= Ġget Bitmap From Screenshot To Save ( screenshot ) ĊĠĠĠĠĠĠĠ Ġcreate Screenshots Folder If DoesNotExist () ĊĠĠĠĠĠĠĠ Ġsave Screenshot Bitmap ( bitmap , Ġscreenshot . data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bitmap From Screenshot To Save ( screenshot : ĠScreen shot To Save ) Ġ= Ġwhen Ġ( screenshot . source ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠScreen shot Source . Bitmap Ġ-> Ġscreenshot . source . bitmap ĊĠĠĠĠĠĠĠ Ġis ĠScreen shot Source . Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Generator . generate Bitmap ( screenshot . source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Can 't Ġextract Ġbitmap Ġfrom Ġnode Ġin Ġa ĠSDK Ġversion Ġlower Ġthan ĠBuild . VERSION _ CODES . O ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Metadata ( session : ĠScreen shot Test Session ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Screenshots Folder If DoesNotExist () ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġsession . get Screenshot Session Metadata () ĊĠĠĠĠĠĠĠ Ġval Ġserialized Metadata Ġ= Ġgson . toJson ( metadata ) ĊĠĠĠĠĠĠĠ Ġsave Serialized Metadata ( serialized Metadata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Screenshots Folder If DoesNotExist () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFile ( screenshots Folder ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! folder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfolder . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Serialized Metadata ( serialized Metadata : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete File IfExists ( metadata File ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate File IfNot Exists ( metadata File ) ĊĠĠĠĠĠĠĠ Ġval Ġprint Writer Ġ= Ġfile . print Writer () ĊĠĠĠĠĠĠĠ Ġprint Writer . print ( serialized Metadata ) ĊĠĠĠĠĠĠĠ Ġprint Writer . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Screenshot Bitmap ( bitmap : ĠBitmap , Ġdata : ĠScreen shot Metadata ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreenshot Path Ġ= Ġget Screenshot Sd Card Path ( data ) ĊĠĠĠĠĠĠĠ Ġdelete File IfExists ( screenshot Path ) ĊĠĠĠĠĠĠĠ Ġcreate File IfNot Exists ( screenshot Path ) ĊĠĠĠĠĠĠĠ Ġval Ġfile OutputStream Ġ= ĠFileOutputStream ( screenshot Path ) ĊĠĠĠĠĠĠĠ Ġfile OutputStream . use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile OutputStream . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete File IfExists ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate File IfNot Exists ( path : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Screenshot Sd Card Path ( data : ĠScreen shot Metadata ): ĠString Ġ= Ġ"$ screenshots Folder ${ data . name }. png " Ċ } Ċ Ċ data Ġclass ĠScreen shot To Save ( val Ġsource : ĠScreen shot Source , Ġval Ġdata : ĠScreen shot Metadata ) Ċ Ċ sealed Ġclass ĠScreen shot Source Ġ{ ĊĠĠĠ Ġdata Ġclass ĠNode ( val Ġnode : ĠSem antics Node Interaction ) Ġ: ĠScreen shot Source () ĊĠĠĠ Ġdata Ġclass ĠBitmap ( val Ġbitmap : Ġandroid . graphics . Bitmap ) Ġ: ĠScreen shot Source () Ċ } Ċ