package Ġcom . ar ind am . cam er ax . ui . home . gallery Ċ Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Media Scanner Connection Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġandroid . widget . Image Button Ċ import Ġandroidx . annotation . Style Res Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment State Pager Adapter Ċ import Ġandroidx . navigation . Navigation Ċ import Ġandroidx . navigation . fragment . nav Args Ċ import Ġandroidx . view pager . widget . ViewPager Ċ import Ġcom . ar ind am . cam er ax . Build Config Ċ import Ġcom . ar ind am . cam er ax . R Ċ import Ġcom . ar ind am . cam er ax . ui . base . Base Fragment Ċ import Ġcom . ar ind am . cam er ax . ui . home . photo . Photo Fragment Ċ import Ġcom . ar ind am . cam er ax . util . commons . Constants . FILE . EXTENSION _ WHITE LIST Ċ import Ġcom . ar ind am . cam er ax . util . pad With Display Cut out Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠFragment Ġused Ġto Ġpresent Ġthe Ġuser Ġwith Ġa Ġgallery Ġof Ġphotos Ġtaken Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠAr ind am ĠK arm ak ar Ġon Ġ 9 / 5 / 1 9 . Ċ Ġ*/ Ċ Ċ class ĠGallery Fragment Ġinternal Ġconstructor () Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġ/** ĠAndroid X Ġnavigation Ġarguments Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġargs : ĠGallery Fragment Args Ġby Ġnav Args () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia List : ĠMutable List < File > ĊĊĠĠĠ Ġ/** ĠAdapter Ġclass Ġused Ġto Ġpresent Ġa Ġfragment Ġcontaining Ġone Ġphoto Ġor Ġvideo Ġas Ġa Ġpage Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠMedia Pager Adapter ( fm : ĠFragment Manager ) Ġ: ĠFragment State Pager Adapter ( fm , ĠBE HAV IOR _ RE SU ME _ ONLY _ CURRENT _ FRAGMENT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Count (): ĠInt Ġ= Ġmedia List . size ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ): ĠFragment Ġ= ĠPhoto Fragment . create ( media List [ position ]) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Position ( obj : ĠAny ): ĠInt Ġ= ĠPOSITION _ NONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMark Ġthis Ġas Ġa Ġretain Ġfragment , Ġso Ġthe Ġlifecycle Ġdoes Ġnot Ġget Ġrestarted Ġon Ġconfig Ġchange ĊĠĠĠĠĠĠĠ Ġretain Instance Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġroot Ġdirectory Ġof Ġmedia Ġfrom Ġnavigation Ġarguments ĊĠĠĠĠĠĠĠ Ġval Ġroot Directory Ġ= ĠFile ( args . root Directory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWalk Ġthrough Ġall Ġfiles Ġin Ġthe Ġroot Ġdirectory ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġreverse Ġthe Ġorder Ġof Ġthe Ġlist Ġto Ġpresent Ġthe Ġlast Ġphotos Ġfirst ĊĠĠĠĠĠĠĠ Ġmedia List Ġ= Ġroot Directory . list Files Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEXT ENSION _ WHITE LIST . contains ( file . extension . toUpperCase ( Locale . ROOT )) ĊĠĠĠĠĠĠĠ Ġ} ?. sorted Descending ()?. to Mutable List () Ġ?: Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprovide Layout (): ĠInt Ġ= ĠR . layout . fragment _ gallery ĊĊĠĠĠ Ġoverride Ġfun Ġsetup View ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠChecking Ġmedia Ġfiles Ġlist ĊĠĠĠĠĠĠĠ Ġif Ġ( media List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . delete _ button ). isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . share _ button ). isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠPopulate Ġthe ĠView Pager Ġand Ġimplement Ġa Ġcache Ġof Ġtwo Ġmedia Ġitems ĊĠĠĠĠĠĠĠ Ġval Ġmedia ViewPager Ġ= Ġview . findViewById < ViewPager >( R . id . photo _ view _ pager ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff screen Page Limit Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠMedia Pager Adapter ( child FragmentManager ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġthe Ġcut out Ġ" safe Ġarea " Ġavoids Ġthe Ġscreen Ġnot ch Ġif Ġany ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġextension Ġmethod Ġto Ġpad Ġ" inside " Ġview Ġcontaining ĠUI Ġusing Ġdisplay Ġcut out 's Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . findViewById < Constraint Layout >( R . id . cut out _ safe _ area ). pad With Display Cut out () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġback Ġbutton Ġpress ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . back _ button ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Back ( R . id . fragment _ container ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġshare Ġbutton Ġpress ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . share _ button ). setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġwe Ġhave Ġa Ġfile Ġto Ġshare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . get OrNull ( media ViewPager . currentItem )?. let Ġ{ Ġmedia File Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġsharing Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn fer Ġmedia Ġtype Ġfrom Ġfile Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Type Ġ= ĠMime TypeMap . get Singleton (). get MimeType From Extension ( media File . extension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet ĠURI Ġfrom Ġour ĠFile Provider Ġimplementation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( view . context , ĠBuild Config . APPLICATION _ ID Ġ+ Ġ". provider ", Ġmedia File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġappropriate Ġintent Ġextra , Ġtype , Ġaction Ġand Ġflags ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Intent . EXTRA _ STREAM , Ġuri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġmedia Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLaunch Ġthe Ġintent Ġletting Ġthe Ġuser Ġchoose Ġwhich Ġapp Ġto Ġshare Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent . create Chooser ( intent , ĠgetString ( R . string . share _ hint ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġdelete Ġbutton Ġpress ĊĠĠĠĠĠĠĠ Ġview . findViewById < Image Button >( R . id . delete _ button ). setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġwe Ġhave Ġa Ġfile Ġto Ġdelete ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . get OrNull ( media ViewPager . currentItem )?. let Ġ{ Ġmedia File Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( which Ġ== ĠDialog Interface . BUTTON _ POSITIVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġcurrent Ġphoto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia File . delete () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġrelevant Ġbroadcast Ġto Ġnotify Ġother Ġapps Ġof Ġdeletion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Scanner Connection . scan File ( view . context , ĠarrayOf ( media File . absolute Path ), Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNotify Ġour Ġview Ġpager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia List . remove At ( media ViewPager . currentItem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia ViewPager . adapter ?. notify DataSet Changed () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġphotos Ġhave Ġbeen Ġdeleted , Ġreturn Ġto Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media List . isEmpty ()) ĠNavigation . find Nav Controller ( require Activity (), ĠR . id . fragment _ container ). navigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( require Context (), Ġget AlertDialog ButtonStyle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . delete _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . delete _ subtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . delete _ button _ alt , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . delete _ button _ cancel , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Style Res ĊĠĠĠ Ġprivate Ġfun Ġget AlertDialog ButtonStyle (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR . style . Material AlertDialog Button _ Day Night ĊĠĠĠ Ġ} Ċ } Ċ