package Ġcom . my mik em iller . game gr ump sp layer . util Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġandroid . database . sqlite . SQLite Open Helper Ċ import Ġandroid . util . Log Ċ import Ġcom . google . api . client . util . DateTime Ċ import Ġcom . my mik em iller . game gr ump sp layer . Detail Ċ import Ġcom . my mik em iller . game gr ump sp layer . yt . YouTube API Ċ import Ġjava . sql . SQLException Ċ Ċ /** Ċ Ġ* ĠWatch History Ġstores Ġthe Ġw atched Ġvideo ĠDetails Ġin Ġa Ġlocal ĠSQL Ġdatabase Ċ Ġ*/ Ċ class ĠWatch History Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIncrement Ġthis Ġwhen Ġthe Ġtable Ġdefinition Ġchanges ĊĠĠĠĠĠĠĠ Ġval ĠDATABASE _ VERSION : ĠInt Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval ĠDATABASE _ NAME : ĠString Ġ= Ġ" Watch History " ĊĠĠĠĠĠĠĠ Ġval ĠDET AIL S _ TABLE _ NAME : ĠString Ġ= Ġ" Watch History Table " ĊĊĠĠĠĠĠĠĠ Ġ// ĠVideo List Ġcolumns ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ VIDEO ID : ĠString Ġ= Ġ" Video _ Id " ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ TITLE : ĠString Ġ= Ġ" Title " ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ DESCRIPTION : ĠString Ġ= Ġ" Description " ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ TH UMB NA IL : ĠString Ġ= Ġ" Thumbnail " ĊĠĠĠĠĠĠĠ Ġval ĠKEY _ DATE _ UP LOADED : ĠString Ġ= Ġ" Date _ Uploaded " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDET AIL S _ TABLE _ CREATE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CREATE ĠTABLE Ġ" Ġ+ ĠDET AIL S _ TABLE _ NAME Ġ+ Ġ" Ġ(" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ VIDEO ID Ġ+ Ġ" ĠTEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ TITLE Ġ+ Ġ" ĠTEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ DESCRIPTION Ġ+ Ġ" ĠTEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ TH UMB NA IL Ġ+ Ġ" ĠTEXT , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ DATE _ UP LOADED Ġ+ Ġ" ĠTEXT );" ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġreturn Ġall Ġthe ĠDetails Ġcurrently Ġin Ġthe Ġdatabase . ĠThe Ġreturned Ġdetails Ġare ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġan Ġoldest Ġto Ġnewest Ġorder . ĊĠĠĠĠĠĠĠ Ġfun Ġget Watch History ( context : ĠContext ): ĠList < Detail > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Helper Ġ= ĠDetails Open Helper ( context . application Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdb Helper . getAll Details From Db () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Detail ( context : ĠContext , Ġdetail : ĠDetail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Helper Ġ= ĠDetails Open Helper ( context . application Context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdb Helper . add Detail ( detail ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠDetails Open Helper Ġinternal Ġconstructor ( context : ĠContext ) Ġ: ĠSQLite Open Helper ( context , ĠDATABASE _ NAME , Ġnull , ĠDATABASE _ VERSION ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Upgrade ( db : ĠSQLite Database , Ġold Version : ĠInt , Ġnew Version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Version Ġ!= Ġnew Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSimple st Ġimplementation Ġis Ġto Ġdrop Ġall Ġold Ġtables Ġand Ġrecreate Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . exec SQL (" DROP ĠTABLE ĠIF ĠEXISTS Ġ" Ġ+ ĠDET AIL S _ TABLE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonCreate ( db ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ( db : ĠSQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . exec SQL ( DETAILS _ TABLE _ CREATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġa ĠDetail Ġinto Ġthe Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġadd Detail ( detail : ĠDetail ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġadd Ġthe Ġdetail Ġif Ġit 's Ġnot Ġthe Ġmost Ġrecent Ġvideo Ġin Ġthe Ġdatabase ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Det ial s Ġ= ĠgetAll Details From Db () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Det ial s . size Ġ> Ġ 0 Ġ&& Ġdetail Ġ== Ġexisting Det ial s [ existing Det ial s . size Ġ- Ġ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġand / or Ġopen Ġthe Ġdatabase Ġfor Ġwriting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Ġ= Ġwritable Database ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġa Ġgood Ġidea Ġto Ġwrap Ġour Ġinsert Ġin Ġa Ġtransaction . ĠThis Ġhelps Ġwith Ġperformance Ġand Ġensures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconsistency Ġof Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . beginTransaction () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( KEY _ VIDEO ID , Ġdetail . video Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( KEY _ TITLE , Ġdetail . full Video Title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( KEY _ DESCRIPTION , Ġdetail . full Video Description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( KEY _ TH UMB NA IL , Ġdetail . thumbnail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( KEY _ DATE _ UP LOADED , Ġdetail . date Uploaded . toString R fc 3 3 3 9 ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNotice Ġhow Ġwe Ġhaven 't Ġspecified Ġthe Ġprimary Ġkey . ĠSQLite Ġauto Ġincre ments Ġthe Ġprimary Ġkey Ġcolumn . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . insert OrThrow ( DETAILS _ TABLE _ NAME , Ġnull , Ġvalues ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . set Transaction Successful () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Content Values . TAG , Ġ" Error Ġwhile Ġtrying Ġto Ġadd ĠDetail Ġto Ġdatabase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . end Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠgetAll Details From Db (): ĠList < Detail > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Details Ġ= Ġmutable ListOf < Detail >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSELECT Ġ* ĠFROM ĠDET AIL S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠDET AIL S _ SELECT _ QUERY Ġ= Ġ" SELECT Ġ* ĠFROM Ġ$ DETAILS _ TABLE _ NAME " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb : ĠSQLite Database ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġthis . readable Database ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( s : ĠSQLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġsometimes Ġget Ġan Ġerror Ġopening Ġthe Ġdatabase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġsave Ġthe Ġw atched Ġtime . Ġ' s Ġok . ĠMaybe Ġnext Ġtime . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġdb . raw Query ( DETAILS _ SELECT _ QUERY , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Id Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ VIDEO ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ TITLE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ DESCRIPTION )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthumbnail Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ TH UMB NA IL )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Uploaded Ġ= Ġcursor . getString ( cursor . getColumnIndex ( KEY _ DATE _ UP LOADED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate R fc 3 3 3 9 Ġ= ĠDateTime . parse R fc 3 3 3 9 ( date Uploaded ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Detail Ġ= ĠDetail ( video Id , Ġtitle , Ġdescription , Ġthumbnail , Ġdate R fc 3 3 3 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Details . add ( new Detail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( cursor . moveTo Next ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( Content Values . TAG , Ġ" Error Ġwhile Ġtrying Ġto Ġget Ġdetails Ġfrom Ġdatabase ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ!= Ġnull Ġ&& Ġ! cursor . is Closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġall Details ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }