package Ġapp . l awn ch air . bug report Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Pending Intent . FLAG _ IM MUT ABLE Ċ import Ġandroid . app . Pending Intent . FLAG _ UPDATE _ CURRENT Ċ import Ġandroid . content .* Ċ import Ġandroid . graphics . drawable . Icon Ċ import Ġandroid . net . Uri Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . content . getSystem Service Ċ import Ġcom . android . launcher 3 . Build Config Ċ import Ġcom . android . launcher 3 . R Ċ Ċ class ĠBug Report Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġintent . get Parcelable Extra < Bug Report >(" report ") !! ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOPY _ ACTION Ġ-> Ġcopy Report ( context , Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUP LOAD _ ACTION Ġ-> Ġstart Upload ( context , Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUP LOAD _ COMPLETE _ ACTION Ġ-> Ġnotify ( context , Ġreport ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Report ( context : ĠContext , Ġreport : ĠBug Report ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Data Ġ= ĠClip Data . new Plain Text ( context . getString ( R . string . l awn ch air _ bug _ report ), Ġreport . link Ġ?: Ġreport . contents ) ĊĠĠĠĠĠĠĠ Ġcontext . getSystem Service < Clipboard Manager >() !!. set Primary Clip ( clip Data ) ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , ĠR . string . copied _ toast , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Upload ( context : ĠContext , Ġreport : ĠBug Report ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify ( context , Ġreport , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġcontext . start Service ( Intent ( context , ĠU plo ader Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" report ", Ġreport )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġnotification Channel Id Ġ= Ġ"${ Build Config . APPLICATION _ ID }. Bug Report " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġstatus Channel Id Ġ= Ġ"${ Build Config . APPLICATION _ ID }. status " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGROUP _ KEY Ġ= Ġ"${ Build Config . APPLICATION _ ID }. cr ashes " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠGROUP _ ID Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOPY _ ACTION Ġ= Ġ"${ Build Config . APPLICATION _ ID }. bug report . COPY " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUP LOAD _ ACTION Ġ= Ġ"${ Build Config . APPLICATION _ ID }. bug report . UPLOAD " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUP LOAD _ COMPLETE _ ACTION Ġ= Ġ"${ Build Config . APPLICATION _ ID }. bug report . UPLOAD _ COMPLETE " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnotify ( context : ĠContext , Ġreport : ĠBug Report , Ġuploading : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġcontext . getSystem Service < Notification Manager >() !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Id Ġ= Ġreport . notification Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification . Builder ( context , Ġnotification Channel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( report . getTitle ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( report . description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ bug _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( context , ĠR . color . bug Notification Color )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group ( GROUP _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set When ( report . timestamp ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġmanager . active Notifications . filter Ġ{ Ġit . group Key Ġ== ĠGROUP _ KEY Ġ}. count () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsummary Ġ= Ġif Ġ( count Ġ> Ġ 9 9 Ġ|| Ġcount Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . bug report _ group _ summary _ multiple ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . bug report _ group _ summary , Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup Builder Ġ= ĠNotification . Builder ( context , Ġnotification Channel Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( context . getString ( R . string . bug report _ channel _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( summary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ bug _ notification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( context , ĠR . color . bug Notification Color )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification . Inbox Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Big Content Title ( summary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Summary Text ( context . getString ( R . string . bug report _ channel _ name ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group Summary ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Group ( GROUP _ KEY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġreport . getFile Uri ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . link Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW , ĠUri . parse ( report . link )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Open Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġnotification Id , Ġopen Intent , ĠFLAG _ UPDATE _ CURRENT Ġor ĠFLAG _ IM MUT ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Intent ( pending Open Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( file Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Intent Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData And Type ( file Uri , Ġ" text / plain ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Open Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġnotification Id , Ġopen Intent , ĠFLAG _ UPDATE _ CURRENT Ġor ĠFLAG _ IM MUT ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Intent ( pending Open Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Share Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġnotification Id , Ġreport . create Share Intent ( context ), ĠFLAG _ UPDATE _ CURRENT Ġor ĠFLAG _ IM MUT ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= ĠIcon . create With Resource ( context , ĠR . drawable . ic _ share ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Action Builder Ġ= ĠNotification . Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon , Ġcontext . getString ( R . string . action _ share ), Ġpending Share Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addAction ( share Action Builder . build ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . link Ġ!= Ġnull Ġ|| Ġfile Uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Intent Ġ= ĠIntent ( COPY _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Package ( Build Config . APPLICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" report ", Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Copy Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġnotification Id , Ġcopy Intent , ĠFLAG _ UPDATE _ CURRENT Ġor ĠFLAG _ IM MUT ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Text Ġ= Ġif Ġ( report . link Ġ!= Ġnull ) ĠR . string . action _ copy _ link Ġelse ĠR . string . action _ copy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Icon Ġ= ĠIcon . create With Resource ( context , ĠR . drawable . ic _ copy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopy Action Builder Ġ= ĠNotification . Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Icon , Ġcontext . getString ( copy Text ), Ġpending Copy Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addAction ( copy Action Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( upload ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Progress ( 0 , Ġ 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( report . link Ġ== Ġnull Ġ&& ĠU plo ader Utils . is Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Intent Ġ= ĠIntent ( UPLOAD _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Package ( Build Config . APPLICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" report ", Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Upload Intent Ġ= ĠPending Intent . get Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , Ġnotification Id , Ġupload Intent , ĠFLAG _ UPDATE _ CURRENT Ġor ĠFLAG _ IM MUT ABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Text Ġ= Ġif Ġ( report . upload Error ) ĠR . string . action _ upload _ error Ġelse ĠR . string . action _ upload _ crash _ report ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Icon Ġ= ĠIcon . create With Resource ( context , ĠR . drawable . ic _ upload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupload Action Builder Ġ= ĠNotification . Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupload Icon , Ġcontext . getString ( upload Text ), Ġpending Upload Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . addAction ( upload Action Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . notify ( notification Id , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . notify ( GROUP _ ID , Ġgroup Builder . build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ