package Ġcom . kp stv . xc lip per . data . helper Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġcom . kp stv . core . Build Config Ċ import Ġcom . kp stv . core . R Ċ import Ġcom . kp stv . xc lip per . data . model . Clip Ċ import Ġcom . kp stv . xc lip per . data . repository . Main Repository Ċ import Ġcom . kp stv . xc lip per . di . notifications . Clipboard Notification Ċ import Ġcom . kp stv . xc lip per . extensions . launch In IO Ċ import Ġcom . kp stv . xc lip per . extensions . launch In Main Ċ import Ġcom . kp stv . xc lip per . extensions . toInt Ċ import Ġdagger . h ilt . android . qual ifiers . ApplicationContext Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ class ĠClip Repository Helper Impl Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ ApplicationContext Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġclipboard Notification : ĠClip board Notification , ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠMain Repository , Ċ ) Ġ: ĠClip Repository Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġpending Clip Data Ġ= ĠArray Deque < String >() ĊĊĠĠĠ Ġoverride Ġfun Ġinsert OrUpdate Clip ( clip : ĠClip , Ġto Notify : ĠBoolean , Ġto Firebase : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert OrUpdate Clip ( clip . data , Ġto Notify , Ġto Firebase ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinsert OrUpdate Clip ( data : ĠString , Ġto Notify : ĠBoolean , Ġto Firebase : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Insert OrUpdate Clip ( data , Ġto Notify , Ġto Firebase ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġconcurrent Ġway Ġto Ġinserting Ġcli ps Ġinto Ġdatabase . ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinternal Insert OrUpdate Clip ( data : ĠString ?, Ġto Notify : ĠBoolean Ġ= Ġtrue , Ġto Firebase : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull Ġ|| Ġdata . isBlank ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Clip Data . contains ( data )) Ġreturn ĊĠĠĠĠĠĠĠ Ġpending Clip Data . add Last ( data ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Clip Data . size Ġ> Ġ 1 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! repository . is Top Data ( data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add OrUpdate Data ( data , Ġto Firebase ) Ġ&& Ġto Notify ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Clip Notification ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpending Clip Data . remove First OrNull () ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Clip Data . isNotEmpty ()) Ġinternal Insert OrUpdate Clip ( pending Clip Data . first OrNull ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġnotify Offset ĠAn Ġoffset Ġvalue Ġto Ġshow Ġcombined Ġ( eg : Ġx Ġcli ps Ġadded ) Ġinstead Ġof Ġindividual ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotifications . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġinsert OrUpdate Clip ( cli ps : ĠList < Clip >, Ġto Firebase : ĠBoolean , Ġto Notify : ĠBoolean , Ġnotify Offset : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch In IO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsingle Notify Ġ= Ġcli ps . size Ġ<= Ġnotify Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadded Cli ps Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcli ps . forEach Ġ{ Ġclip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! repository . is Top Data ( clip . data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Added Or Updated Ġ= Ġadd OrUpdate Data ( clip . data , Ġto Firebase ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadded Cli ps Ġ+= Ġis Added Or Updated . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Added Or Updated Ġ&& Ġsingle Notify Ġ&& Ġto Notify ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Clip Notification ( clip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( added Cli ps Ġ> Ġ 0 Ġ&& Ġ! single Notify Ġ&& Ġto Notify ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Clip Notification ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġcontext . getString ( R . string . multi _ cli ps _ added , Ġadded Cli ps . toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Action Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Clip ( clip Data : ĠList < String > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch In IO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclip Data ?. forEach Ġ{ Ġrepository . delete Clip ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġadd OrUpdate Data ( data : ĠString , Ġto Firebase : ĠBoolean ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( repository . check For Duplicate ( data )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Clip By Data ( data )?. let Ġ{ Ġclip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . update Time ( clip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . update Repository ( data , Ġto Firebase ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Clip Notification ( clip : ĠClip ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Clip Notification ( clip . data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Clip Notification ( data : ĠString , Ġwith Action : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch In Main Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclipboard Notification . notify On Copy ( data , Ġwith Action ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }