package Ġtk . zw ander . lock screen widgets . tiles . widget Ċ Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app widget . App Widget Host Ċ import Ġandroid . app widget . App Widget Host View Ċ import Ġandroid . app widget . App Widget Manager Ċ import Ġandroid . app widget . App Widget Provider Info Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Adaptive Icon Drawable Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Icon Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Service Manager Ċ import Ġandroid . service . quick settings . Tile Ċ import Ġandroid . service . quick settings . Tile Service Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġcom . android . internal . app widget . I App Widget Service Ċ import Ġtk . zw ander . lock screen widgets . App Ċ import Ġtk . zw ander . lock screen widgets . R Ċ import Ġtk . zw ander . lock screen widgets . activities . add . Add Tile Widget Activity Ċ import Ġtk . zw ander . lock screen widgets . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠRepresents Ġthe Ġbase Ġstructure Ġand Ġlogic Ġfor Ġa Ġwidget Ġtile Ġon ĠOne ĠUI . Ċ Ġ* ĠHandles Ġredirect ing Ġwidget ĠRemote Views Ġto ĠSamsung 's ĠSystem ĠUI . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġa Ġvery Ġlimited Ġimplementation . ĠSamsung Ġdoesn 't Ġuse Ġan ĠApp Widget Host Ġor Ċ Ġ* Ġanything Ġfancy Ġto Ġdisplay Ġthe ĠRemote Views . ĠThings Ġlike ĠListView Ġor Ġanything Ġthat Ġuses Ċ Ġ* ĠApp Widget - specific Ġfeatures Ġ( e . g ., Ġadapters ) Ġjust Ġwon 't Ġwork . ĠUpdates Ġalso Ġdon 't Ġhappen Ċ Ġ* Ġdynamically . ĠThe Ġdetail Ġview Ġhas Ġto Ġbe Ġexited Ġand Ġre - enter ed Ġto Ġsee Ġchanges . Ċ Ġ*/ Ċ @ Requires Api ( Build . VERSION _ CODES . N ) Ċ abstract Ġclass ĠBase Widget Tile Ġ: ĠTile Service (), ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĠĠĠ Ġprotected Ġval Ġmanager Ġby Ġlazy Ġ{ ĠApp Widget Manager . getInstance ( this ) Ġ} ĊĠĠĠ Ġprotected Ġval Ġi Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠI App Widget Service . Stub . as Interface ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Manager . getService ( Context . APP WIDGET _ SERVICE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġtile Id : ĠInt ĊĠĠĠ Ġprotected Ġval Ġwidget Id : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġpref Manager . custom Tiles [ tile Id ] Ġ?: Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . widget Id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġval Ġwidget Info : ĠApp Widget Provider Info ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidget Id Ġ= Ġwidget Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Id Ġ== Ġ- 1 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmanager . getApp Widget Info ( widget Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprotected Ġval Ġwidget Package : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwidget Info ?. provider Info ?. packageName ĊĠĠĠ Ġprotected Ġval Ġremote Resources : ĠResources ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġwidget Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . getResources For Application ( packageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġviews Ġby Ġlazy Ġ{ ĠAtomic Reference ( generate Views ()) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Listening () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart Listening () ĊĊĠĠĠĠĠĠĠ Ġviews . set ( generate Views ()) ĊĠĠĠĠĠĠĠ Ġupdate Tile () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Tile Removed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Tile Removed () ĊĊĠĠĠĠĠĠĠ Ġpref Manager . custom Tiles Ġ= Ġpref Manager . custom Tiles . apply Ġ{ Ġremove ( tile Id ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠCharSequence Ġreturned Ġhere Ġis Ġdisplayed Ġat Ġthe Ġtop ĊĠĠĠĠ Ġ* Ġof Ġthe Ġexpanded Ġdetail Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Get Detail View Title (): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġqs Tile ?. label ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠI Ġdon 't Ġreally Ġknow Ġwhat Ġthis Ġis Ġfor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Get Detail View Setting Button Name (): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Test " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġthere Ġshould Ġbe Ġan Ġon / off Ġswitch Ġpresent ĊĠĠĠĠ Ġ* Ġin Ġthe Ġexpanded Ġdetail Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Is ToggleButton Exists (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġswitch Ġis Ġpresent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Is ToggleButton Checked (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġthe Ġwidget 's ĠRemote Views Ġand Ġpass Ġit Ġonto ĊĠĠĠĠ Ġ* ĠSamsung 's ĠSystem ĠUI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Get Detail View (): ĠRemote Views ? Ġ{ ĊĠĠĠĠĠĠĠ Ġviews . set ( generate Views ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġviews . get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġis Ġlaunched Ġwhen Ġthe Ġlabel Ġof Ġthe ĠQ S Ġtile Ġis Ġlong - pressed . ĊĠĠĠĠ Ġ* ĠLaunch Ġthe Ġwidget Ġselector Ġfor Ġthis Ġtile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Get Settings Intent (): ĠIntent ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAdd Tile Widget Activity . create Intent ( this , Ġtile Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġswitch Ġin Ġthe Ġexpanded Ġdetail Ġview Ġis Ġpressed . ĊĠĠĠĠ Ġ* ĠBy Ġdefault , Ġused Ġto Ġlaunch Ġthe Ġwidget Ġselector Ġfor Ġthis Ġtile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsem Set ToggleButton Checked ( checked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( sem Get Settings Intent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences ?, Ġkey : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ== ĠPref Manager . KEY _ CUSTOM _ TI LES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġviews . set ( generate Views ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa ĠRemote Views Ġobject Ġfor Ġthis Ġtile . ĊĠĠĠĠ Ġ* ĠIf Ġno Ġwidget Ġis Ġselected , Ġthis Ġgenerates Ġan Ġ" add " Ġbutton Ġthat Ġla unches ĊĠĠĠĠ Ġ* Ġthe Ġwidget Ġselector Ġfor Ġthis Ġtile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Views (): ĠRemote Views Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġouter View Ġ= Ġgenerate Default Views () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Try Ġto Ġget Ġthe Ġwidget ĠRemote Views . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidget View Ġ= Ġi Manager . getApp Widget Views ( packageName , Ġwidget Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Custom Ġwidget Ġloaded Ġfor Ġtile ĠID Ġ$ tile Id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Success , Ġset Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter View Ġ= Ġwidget View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Custom Ġwidget Ġview Ġis Ġnull Ġfor Ġtile ĠID Ġ$ tile Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Error Ġretrieving Ġwidget , Ġor Ġwidget Ġnot Ġselected . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Utils . debug Log (" Exception Ġadding Ġwidget Ġfor Ġtile ĠID Ġ$ tile Id ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Error Ġretrieving Ġwidget . ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Return Ġeither Ġthe Ġdefault Ġview Ġor Ġthe Ġselected Ġwidget . ĊĠĠĠĠĠĠĠ Ġreturn Ġouter View ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa ĠRemote Views Ġfor Ġthe Ġadd Ġbutton . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Default Views (): ĠRemote Views Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġviews Ġ= ĠRemote Views ( packageName , ĠR . layout . default _ tile _ views ) ĊĠĠĠĠĠĠĠ Ġviews . setOn Click Pending Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . add , ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġ 1 0 0 , Ġsem Get Settings Intent (), Ġ 0 ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġreturn Ġviews ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġthe ĠQ S Ġtile Ġwith Ġinfo Ġfrom Ġthe Ġselected Ġwidget . ĠIf Ġthere Ġis ĊĠĠĠĠ Ġ* Ġno Ġwidget Ġselected , Ġuse Ġthe Ġdefault Ġicon Ġand Ġlabel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Tile () Ġ{ ĊĠĠĠĠĠĠĠ Ġwidget Info . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( remote Resources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Drawable Ġ= ĠResources Compat . get Drawable ( this , Ġicon , Ġthis . new Theme ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O Ġ&& Ġicon Drawable Ġis ĠAdapt ive Icon Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforeground Ġ= Ġicon Drawable . foreground ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. icon Ġ= ĠIcon . create With Bitmap ( foreground . to Bitmap ( 1 2 8 , Ġ 1 2 8 ). crop Bitmap Transparency ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( icon Drawable Ġis ĠBitmap Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. icon Ġ= ĠIcon . create With Bitmap ( qs Tile ?. label ?. first ()?. toString ()?. text As Bitmap ( 1 2 8 f , ĠColor . WHITE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. icon Ġ= ĠIcon . create With Resource ( widget Package , Ġicon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. icon Ġ= ĠIcon . create With Resource ( widget Package , Ġicon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. label Ġ= Ġthis . load Label ( package Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. icon Ġ= ĠIcon . create With Resource ( this @ Base Widget Tile . packageName , ĠR . drawable . ic _ baseline _ launch _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqs Tile ?. label Ġ= Ġresources . getString ( R . string . app _ name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġqs Tile ?. state Ġ= Ġif Ġ( widget Info Ġ!= Ġnull ) ĠTile . STATE _ ACTIVE Ġelse ĠTile . STATE _ IN ACTIVE ĊĠĠĠĠĠĠĠ Ġqs Tile ?. update Tile () ĊĠĠĠ Ġ} Ċ }