package Ġdev . flutter community . plus . share Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . core . content . File Provider Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠHandles Ġshare Ġintent . ĠThe Ġ` context ` Ġand Ġ` activity ` Ġare Ġused Ġto Ġstart Ġthe Ġshare Ċ Ġ* Ġintent . ĠThe Ġ` activity ` Ġmight Ġbe Ġnull Ġwhen Ġconstructing Ġthe Ġ[ Share ] Ġobject Ġand Ġset Ċ Ġ* Ġto Ġnon - null Ġwhen Ġan Ġactivity Ġis Ġavailable Ġusing Ġ[. set Activity ]. Ċ Ġ*/ Ċ internal Ġclass ĠShare ( private Ġval Ġcontext : ĠContext ?, Ġprivate Ġvar Ġactivity : ĠActivity ?) Ġ{ ĊĠ Ġprivate Ġval Ġprovider Authority : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠ ĠgetContext (). packageName Ġ+ Ġ". flutter . share _ provider " ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġshare Cache Folder : ĠFile ĊĠĠĠ Ġget () Ġ= ĠFile ( getContext (). cacheDir , Ġ" share _ plus ") ĊĊĠ Ġprivate Ġfun ĠgetContext (): ĠContext Ġ{ ĊĠĠĠ Ġif Ġ( activity Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġactivity !! ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( context Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠIllegalStateException (" Both Ġcontext Ġand Ġactivity Ġare Ġnull ") ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġthe Ġactivity Ġwhen Ġan Ġactivity Ġis Ġavailable . ĠWhen Ġthe Ġactivity Ġbecomes Ġunavailable , Ġuse ĊĠĠ Ġ* Ġthis Ġmethod Ġto Ġset Ġit Ġto Ġnull . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset Activity ( activity : ĠActivity ?) Ġ{ ĊĠĠĠ Ġthis . activity Ġ= Ġactivity ĊĠ Ġ} ĊĊĠ Ġfun Ġshare ( text : ĠString , Ġsubject : ĠString ?) Ġ{ ĊĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠ Ġtype Ġ= Ġ" text / plain " ĊĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ TEXT , Ġtext ) ĊĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ SUBJECT , Ġsubject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcho oser Intent Ġ= ĠIntent . create Chooser ( share Intent , Ġnull Ġ/* Ġdialog Ġtitle Ġoptional Ġ*/) ĊĠĠĠ ĠstartActivity ( cho oser Intent ) ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġfun Ġshare Files ( ĊĠĠĠ Ġpaths : ĠList < String >, ĊĠĠĠ Ġmime Types : ĠList < String > ?, ĊĠĠĠ Ġtext : ĠString ?, ĊĠĠĠ Ġsubject : ĠString ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġclear Share Cache Folder () ĊĠĠĠ Ġval Ġfile U ris Ġ= Ġget U ris For Paths ( paths ) ĊĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent () ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġ( file U ris . isEmpty () Ġ&& Ġ! text . isNull Or Blank ()) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġshare ( text , Ġsubject ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfile U ris . size Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠmimeType Ġ= Ġif Ġ(! mime Types . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmime Types . first () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ"* /* " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshare Intent . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġfile U ris . first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġshare Intent . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND _ MULTIPLE ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġreduce Mime Types ( mime Types ) ĊĠĠĠĠĠĠĠĠĠ Ġput Parcelable ArrayList Extra ( Intent . EXTRA _ STREAM , Ġfile U ris ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġshare Intent . putExtra ( Intent . EXTRA _ TEXT , Ġtext ) ĊĠĠĠ Ġif Ġ( subject Ġ!= Ġnull ) Ġshare Intent . putExtra ( Intent . EXTRA _ SUBJECT , Ġsubject ) ĊĠĠĠ Ġshare Intent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠ Ġval Ġcho oser Intent Ġ= ĠIntent . create Chooser ( share Intent , Ġnull Ġ/* Ġdialog Ġtitle Ġoptional Ġ*/) ĊĠĠĠ Ġval Ġres InfoList Ġ= ĠgetContext (). package Manager . query Intent Activities ( ĊĠĠĠĠĠ Ġcho oser Intent , ĠPackage Manager . MATCH _ DEFAULT _ ONLY ĊĠĠĠ Ġ) ĊĠĠĠ Ġres InfoList . forEach Ġ{ Ġresolve Info Ġ-> ĊĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġresolve Info . activity Info . packageName ĊĠĠĠĠĠ Ġfile U ris . forEach Ġ{ Ġfile Uri Ġ-> ĊĠĠĠĠĠĠĠ ĠgetContext (). grant Uri Permission ( ĊĠĠĠĠĠĠĠĠĠ ĠpackageName , ĊĠĠĠĠĠĠĠĠĠ Ġfile Uri , ĊĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION Ġor ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠstartActivity ( cho oser Intent ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠstartActivity ( intent : ĠIntent ) Ġ{ ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġactivity Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity !!. startActivity ( intent ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcontext Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Both Ġcontext Ġand Ġactivity Ġare Ġnull ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġget U ris For Paths ( paths : ĠList < String >): ĠArrayList < Uri > Ġ{ ĊĠĠĠ Ġval Ġur is Ġ= ĠArrayList < Uri >( paths . size ) ĊĠĠĠ Ġpaths . forEach Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠ Ġvar Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠ Ġif Ġ( file IsIn Share Cache ( file )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġfile Ġis Ġsaved Ġin Ġ' ... / cache s / share _ plus ' Ġit Ġwill Ġbe Ġer ased Ġby Ġ' clear Share Cache Folder ()' ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Shared Ġfile Ġcan Ġnot Ġbe Ġlocated Ġin Ġ'${ share Cache Folder . canonical Path }' ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfile Ġ= Ġcopy To Share Cache Folder ( file ) ĊĠĠĠĠĠ Ġur is . add ( File Provider . get Uri For File ( getContext (), Ġprovider Authority , Ġfile )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġur is ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRed uc es Ġprovided ĠMIME Ġtypes Ġto Ġa Ġcommon Ġone Ġto Ġprovide Ġ[ Intent ] Ġwith Ġa Ġcorrect Ġtype ĊĠĠ Ġ* Ġto Ġshare Ġmultiple Ġfiles ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġreduce Mime Types ( mime Types : ĠList < String >? ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġreduced MimeType Ġ= Ġ"* /* " ĊĊĠĠĠ Ġmime Types ?. let Ġ{ Ġtypes Ġ-> ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( types . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreduced MimeType Ġ= Ġtypes . first () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( types . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġcommon MimeType Ġ= Ġtypes . first () ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. types . last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( common MimeType Ġ!= Ġtypes [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get MimeType Base ( common MimeType ) Ġ== Ġget MimeType Base ( types [ i ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon MimeType Ġ= Ġget MimeType Base ( types [ i ]) Ġ+ Ġ" /* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommon MimeType Ġ= Ġ"* /* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreduced MimeType Ġ= Ġcommon MimeType ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġreduced MimeType ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġfirst Ġpart Ġof Ġprovided ĠMIME Ġtype , Ġwhich Ġcomes Ġbefore Ġ'/' Ġsymbol ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġget MimeType Base ( mime Type : ĠString ?): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( mime Type Ġ== Ġnull Ġ|| Ġ! mime Type . contains ("/ ")) Ġ{ ĊĠĠĠĠĠ Ġ"*" ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠmimeType . substring ( 0 , ĠmimeType . indexOf ("/ ")) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfile IsIn Share Cache ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġfile . canonical Path ĊĠĠĠĠĠ ĠfilePath . startsWith ( share Cache Folder . canonical Path ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear Share Cache Folder () Ġ{ ĊĠĠĠ Ġval Ġfolder Ġ= Ġshare Cache Folder ĊĠĠĠ Ġval Ġfiles Ġ= Ġfolder . list Files () ĊĠĠĠ Ġif Ġ( folder . exists () Ġ&& Ġ! files . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġfiles . forEach Ġ{ Ġit . delete () Ġ} ĊĠĠĠĠĠ Ġfolder . delete () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġprivate Ġfun Ġcopy To Share Cache Folder ( file : ĠFile ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġfolder Ġ= Ġshare Cache Folder ĊĠĠĠ Ġif Ġ(! folder . exists ()) Ġ{ ĊĠĠĠĠĠ Ġfolder . mkdir s () ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnew File Ġ= ĠFile ( folder , Ġfile . name ) ĊĠĠĠ Ġfile . copy To ( new File , Ġtrue ) ĊĠĠĠ Ġreturn Ġnew File ĊĠ Ġ} Ċ } Ċ