package Ġinfo . r ash ad tan j im . interactive phot og allery . ui . gallery Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . load . engine . Disk Cache Strategy Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . dynamic links . Dynamic Link .* Ċ import Ġcom . google . firebase . dynamic links . Firebase Dynamic Links Ċ import Ġcom . google . firebase . dynamic links . Short Dynamic Link Ċ import Ġdagger . h ilt . android . scopes . Fragment Scoped Ċ import Ġinfo . r ash ad tan j im . core . ut lis .* Ċ import Ġinfo . r ash ad tan j im . interactive phot og allery . R Ċ import Ġinfo . r ash ad tan j im . interactive phot og allery . databinding . Fragment Photo View Binding Ċ import Ġjava . io . ByteArray OutputStream Ċ Ċ @ Fragment Scoped Ċ class ĠPhoto View Fragment Ġ: ĠDialog Fragment () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Photo View Binding ĊĊĠĠĠ Ġprivate Ġvar Ġselected Photo : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġargs : ĠPhoto View Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Style ( STYLE _ NORMAL , Ġandroid . R . style . Theme _ Material _ Light _ Dialog When Large _ No ActionBar ) ĊĠĠĠĠĠĠĠ Ġdialog ?. window ?. navigation Bar Color Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResources Compat . getColor ( resources , ĠR . color . black , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Photo View Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġdialog ?. window ?. setBackground Drawable ( Color Drawable ( Color . TRANSP ARENT )) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġargs . selected Photo ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Photo Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . image Button Back . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). pop Back Stack () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCase Ġ 1 : Ġ[ G lide ] Ġwill Ġload Ġimages Ġfrom ĠPic sum ĠAPI Ġ- Ġmain Ġcase ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ### ĠException Ġon Ġsaving Ġphoto Ġ- ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 . ĠIf Ġdevice Ġhas Ġwrite Ġpermission Ġthen Ġsave Ġit Ġthrough Ġbitmap Ġotherwise Ġask Ġfor Ġ[ has Storage Permission ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 . ĠIf ĠG lide Ġtakes Ġtime Ġto Ġload Ġor Ġfailed Ġto Ġload Ġphoto Ġthen Ġthe Ġphoto Ġcan Ġnot Ġbe Ġsave , ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġphoto Ġis Ġconverting Ġto Ġbitmap Ġwhich Ġwill Ġthrough Ġnull Ġobject Ġexception . ĠTo Ġhandle Ġthis , ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ G lide Listener Impl ] ĠObject Ġclass Ġis Ġcreated Ġto Ġhandle ĠG lide Ġevent Ġlistener ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 3 . ĠThe Ġphoto Ġoffline Ġcaching Ġ[ Disk Cache Strategy ] Ġenable , Ġif Ġthe Ġphoto Ġis Ġnot Ġloaded Ġand ĊĠĠĠĠĠĠĠĠ Ġ* Ġdevice Ġhas Ġnot Ġconnected Ġthe Ġthe Ġimage Ġdownload Ġand Ġshare Ġoption Ġis Ġset Ġ[ isVisible ] Ġfalse . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ ĠG lide . with ( require Context ()). load ( selected Photo ). disk Cache Strategy ( Disk Cache Strategy . ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. listener ( G lide Listener Impl . On Completed Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( require Context (). isConnected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . image Button Save . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . image Button Share . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . progress Bar . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( getString ( R . string . zoom _ in _ out )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). into ( binding . zoom View Photo ) ĊĊĠĠĠĠĠĠĠ Ġbinding . image Button Save . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( require Context (). has Storage Permission ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). save ToS d Card ( binding . zoom View Photo . drawable . to Bitmap ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( getString ( R . string . photo _ save )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEvent : ĠThe Ġaction Ġlisten Ġwill Ġtrigger Ġdevices ' Ġdefault Ġsharing Ġoption Ġto Ġshare Ġphoto ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠTask Ġis Ġdone Ġusing Ġtwo Ġways : ĠI Ġam Ġusing Ġnormal Ġsharing Ġas ĠFirebase Ġdomain ĠTX T Ġaddition Ġis Ġtime Ġtaking ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 1 . ĠPhoto Ġnormal Ġsharing Ġthrough Ġ[ Intent ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 2 . Ġfirebase 's Ġ[ Firebase Dynamic Links ] ĊĠĠĠĠĠĠĠĠ Ġ* ĠBefore Ġsharing Ġ[ has Storage Permission ] Ġchecks Ġwrite Ġpermission ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġbinding . image Button Share . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Bitmap Ġ= Ġbinding . zoom View Photo . drawable . to Bitmap () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( require Context (). has Storage Permission ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Ġ= ĠIntent ( Intent . ACTION _ SEND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare . type Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare . putExtra ( Intent . EXTRA _ STREAM , ĠgetImage Uri ( require Context (), Ġm Bitmap )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( share , Ġ" Share Ġvia ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĠarrayOf ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetImage Uri ( context : ĠContext , Ġbitmap : ĠBitmap ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbyte Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , Ġbyte ) ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠMedia Store . Images . Media . insert Image ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). content Resolver , Ġbitmap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Pic sum ĠImage ĠDescription ", Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠUri . parse ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare Dynamic Link ( m Bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri ? Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (). save Image In Q ( m Bitmap ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠMedia Store . Images . Media . insert Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). content Resolver , Ġm Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Image ĠDescription ", Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse ( path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFirebase Dynamic Links . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Dynamic Link () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Link ( Uri . parse (" https :// r ash ad tan j im . info / pic sum /$ selected Photo ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Domain Uri Prefix (" https :// r ash ad tan j im . info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Android Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Parameters . Builder (" info . r ash ad tan j im . interactive phot og allery ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMinimum Version ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set I os Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI os Parameters . Builder (" info . r ash ad tan j im . interactive phot og allery ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set App Store Id (" 0 0 0 0 0 0 0 0 0 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMinimum Version (" 0 . 0 . 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Google Analytics Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Analytics Parameters . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Source (" pic sum ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Medium (" social ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Campaign (" pic sum - images ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Social Meta Tag Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSocial Meta Tag Parameters . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" r ash ad tan j im . info ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDescription ( getString ( R . string . about _ app )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( getString ( R . string . app _ name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build Short Dynamic Link () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask : ĠTask < Short Dynamic Link > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Link Ġ= Ġtask . result . short Link ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠIntent . ACTION _ SEND ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ TEXT , Ġ"& $ short Link ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ STREAM , Ġuri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . setData And Type ( uri , Ġ" image /* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent . create Chooser ( intent , Ġ" Share ĠPhoto !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( share Intent , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( getString ( R . string . something _ w ent _ wrong )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwrite Ġpermission Ġrequest ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPER MISSION _ REQUEST _ CODE Ġ= Ġ 1 0 0 1 ĊĠĠĠ Ġ} Ċ }