/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 ĠFabric io ĠB at ista ĠN arc iz o Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ċ Ġ* Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ċ Ġ* Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ċ Ġ* Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ċ Ġ* Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT Ċ Ġ* ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND Ċ Ġ* ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , Ċ Ġ* ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġdk . itu . mo ap d . firebase storage Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . load . resource . drawable . Drawable Transition Options Ċ import Ġcom . firebase . ui . database . Firebase Recycler Adapter Ċ import Ġcom . firebase . ui . database . Firebase Recycler Options Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . google . firebase . storage . k tx . storage Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠA Ġclass Ġto Ġcustomize Ġan Ġadapter Ġwith Ġa Ġ` ViewHolder ` Ġto Ġpopulate Ġan ĠImage Ġdataset Ġinto Ġa Ċ Ġ* Ġ` RecyclerView `. Ċ Ġ*/ Ċ class ĠCustom Adapter ( private Ġval Ġitem ClickListener : ĠItem ClickListener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions : ĠFirebase Recycler Options < Image >) Ġ: ĊĠĠĠ ĠFirebase Recycler Adapter < Image , ĠCustom Adapter . ViewHolder >( options ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġattribute Ġcontrols Ġthe Ġimage Ġsubtitle Ġvisibility . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġdisplay Date Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġinternal Ġview Ġholder Ġclass Ġused Ġto Ġrepresent Ġthe Ġlayout Ġthat Ġshows Ġa Ġsingle Ġ` String ` ĊĠĠĠĠ Ġ* Ġinstance Ġin Ġthe Ġ` RecyclerView `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠViewHolder ( view : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠimageView : ĠImageView Ġ= Ġview . findViewById ( R . id . image _ view ) ĊĠĠĠĠĠĠĠ Ġval ĠtextView : ĠTextView Ġ= Ġview . findViewById ( R . id . text _ view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġ` RecyclerView ` Ġneeds Ġa Ġnew Ġ` ViewHolder ` Ġof Ġthe Ġgiven Ġtype Ġto Ġrepresent Ġan ĊĠĠĠĠ Ġ* Ġitem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġnew Ġ` ViewHolder ` Ġshould Ġbe Ġconstructed Ġwith Ġa Ġnew Ġ` View ` Ġthat Ġcan Ġrepresent Ġthe Ġitems Ġof ĊĠĠĠĠ Ġ* Ġthe Ġgiven Ġtype . ĠYou Ġcan Ġeither Ġcreate Ġa Ġnew Ġ` View ` Ġmanually Ġor Ġinf late Ġit Ġfrom Ġan ĠXML Ġlayout ĊĠĠĠĠ Ġ* Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġnew Ġ` ViewHolder ` Ġwill Ġbe Ġused Ġto Ġdisplay Ġitems Ġof Ġthe Ġadapter Ġusing ĊĠĠĠĠ Ġ* Ġ` on Bind ViewHolder ( ViewHolder , Ġint , ĠList )`. ĠSince Ġit Ġwill Ġbe Ġre - used Ġto Ġdisplay Ġdifferent ĊĠĠĠĠ Ġ* Ġitems Ġin Ġthe Ġdata Ġset , Ġit Ġis Ġa Ġgood Ġidea Ġto Ġcache Ġreferences Ġto Ġsub Ġviews Ġof Ġthe Ġ` View ` Ġto ĊĠĠĠĠ Ġ* Ġavoid Ġunnecessary Ġ` findViewById ( int )` Ġcalls . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparent ĠThe Ġ` ViewGroup ` Ġinto Ġwhich Ġthe Ġnew Ġ` View ` Ġwill Ġbe Ġadded Ġafter Ġit Ġis Ġbound Ġto Ġan ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġadapter Ġposition . ĊĠĠĠĠ Ġ* Ġ@ param Ġview Type ĠThe Ġview Ġtype Ġof Ġthe Ġnew Ġ` View `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew Ġ` ViewHolder ` Ġthat Ġholds Ġa ĠView Ġof Ġthe Ġgiven Ġview Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġview , Ġwhich Ġdefines Ġthe ĠUI Ġof Ġthe Ġlist Ġitem ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . list _ item , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe Ġ` RecyclerView ` Ġto Ġdisplay Ġthe Ġdata Ġat Ġthe Ġspecified Ġposition . ĠThis Ġmethod ĊĠĠĠĠ Ġ* Ġshould Ġupdate Ġthe Ġcontents Ġof Ġthe Ġ` item View ()` Ġto Ġreflect Ġthe Ġitem Ġat Ġthe Ġgiven Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġun like Ġ` ListView `, Ġ` RecyclerView ` Ġwill Ġnot Ġcall Ġthis Ġmethod Ġagain Ġif Ġthe Ġposition ĊĠĠĠĠ Ġ* Ġof Ġthe Ġitem Ġchanges Ġin Ġthe Ġdata Ġset Ġunless Ġthe Ġitem Ġitself Ġis Ġinvalid ated Ġor Ġthe Ġnew Ġposition ĊĠĠĠĠ Ġ* Ġcannot Ġbe Ġdetermined . ĠFor Ġthis Ġreason , Ġyou Ġshould Ġonly Ġuse Ġthe Ġ` position ` Ġparameter Ġwhile ĊĠĠĠĠ Ġ* Ġac qu iring Ġthe Ġrelated Ġdata Ġitem Ġinside Ġthis Ġmethod Ġand Ġshould Ġnot Ġkeep Ġa Ġcopy Ġof Ġit . ĠIf Ġyou ĊĠĠĠĠ Ġ* Ġneed Ġthe Ġposition Ġof Ġan Ġitem Ġlater Ġon Ġ( e . g ., Ġin Ġa Ġclick Ġlistener ), Ġuse ĊĠĠĠĠ Ġ* Ġ` get Binding Adapter Position ()` Ġwhich Ġwill Ġhave Ġthe Ġupdated Ġadapter Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOverride Ġ` on Bind ViewHolder ( ViewHolder , Ġint , ĠList )` Ġinstead Ġif ĠAdapter Ġcan Ġhandle Ġefficient ĊĠĠĠĠ Ġ* Ġpartial Ġbind . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġholder ĠThe Ġ` ViewHolder ` Ġwhich Ġshould Ġbe Ġupdated Ġto Ġrepresent Ġthe Ġcontents Ġof Ġthe Ġitem ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġat Ġthe Ġgiven Ġposition Ġin Ġthe Ġdata Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġposition ĠThe Ġposition Ġof Ġthe Ġitem Ġwithin Ġthe Ġadapter 's Ġdata Ġset . ĊĠĠĠĠ Ġ* Ġ@ param Ġimage ĠAn Ġinstance Ġof Ġ` image ` Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt , Ġimage : ĠImage ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġpublic Ġthumbnail ĠURL . ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠFirebase . storage ( BUCKET _ URL ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Ref Ġ= Ġstorage . reference . child ("${ image . path }_ thumbnail ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠDownload Ġand Ġset Ġan Ġimage Ġinto Ġthe ĠImageView . ĊĠĠĠĠĠĠĠ Ġimage Ref . download Url . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( holder . item View . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transition ( Drawable Transition Options . with Cross Fade ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( holder . imageView ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . i ( TAG (), Ġ" Populate Ġan Ġitem Ġat Ġposition : Ġ$ position ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠBind Ġthe Ġview Ġholder Ġwith Ġthe Ġselected Ġ` String ` Ġdata . ĊĠĠĠĠĠĠĠ Ġholder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠTextView Ġvisibility . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġimage . createdAt ?. toDate String () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . isVisible Ġ= Ġdisplay Date ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠListen Ġfor Ġshort Ġclicks Ġin Ġthe Ġcurrent Ġview Ġholder . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ClickListener . on ItemClickListener ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠListen Ġfor Ġlong Ġclicks Ġin Ġthe Ġcurrent Ġview Ġholder . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ClickListener . on Item Long ClickListener ( image , Ġholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġchanges Ġthe Ġstatus Ġof Ġimage Ġsubtitle Ġvisibility Ġand Ġupdates Ġthe Ġdata Ġshown Ġin Ġthe ĊĠĠĠĠ Ġ* Ġ` RecyclerView `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Notify DataSet Changed ") ĊĠĠĠ Ġfun Ġtoggle Display Date () Ġ{ ĊĠĠĠĠĠĠĠ Ġdisplay Date Ġ= Ġ! display Date ĊĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġtimestamp Ġas Ġa Ġ` String `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġtimestamp Ġformatted Ġas Ġa Ġ` String ` Ġusing Ġthe Ġdefault Ġlocale . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠLong . toDate String () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= ĠSimpleDateFormat (" dd / MM / yyyy ĠHH : mm ", ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġformat . format ( date ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ