/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . android . tools . idea . rendering . actions Ċ Ċ import Ġcom . android . tools . idea . rendering . Render Service Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Toggle Action Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . ui . Dialog Builder Ċ import Ġcom . intellij . openapi . ui . Dialog Wrapper Ċ import Ġcom . intellij . ui . layout . panel Ċ import Ġcom . intellij . util . concurrency . App Executor Util Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġkotlin . random . Random Ċ Ċ /** Ċ Ġ* ĠAn Ġinternal Ġaction Ġto Ġput Ġthe Ġrendering Ġpipeline Ġinto Ġa Ġ" lag ging Ġmode ". ĠThis Ġwill Ġcreate Ġslow Ġrendering Ġrequests Ċ Ġ* Ġto Ġslow Ġdown Ġthe Ġrendering Ġpipeline . Ċ Ġ* ĠThis Ġcan Ġbe Ġused Ġto Ġtest Ġhow Ġother Ġcomponents Ġof Ġthe Ġrendering Ġ( Layout ĠEditor , ĠCompose ĠPreview , ĠResource ĠManager , ĠRender Task ) Ċ Ġ* Ġreact Ġto Ġa Ġheavy Ġloaded Ġqueue . ĠThis Ġcan Ġbe Ġused Ġto Ġverify Ġthat Ġthe Ġcode Ġfrom Ġthose Ġcomponents Ġcan Ġgrace fully Ġhandle Ġtimeouts Ġor Ċ Ġ* Ġslow Ġrender ings Ġcorrectly . Ċ Ġ*/ Ċ class ĠRender Lag ging Mode Ġ: ĠToggle Action (" Enable ĠLayout ĠPreview ĠL ag ging ĠMode ") Ġ{ ĊĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance ( Render Lag ging Mode :: class . java ) ĊĊĠ Ġprivate Ġvar Ġenabled Ġ= Ġfalse ĊĊĠ Ġ/** ĠMinimum Ġtime Ġfor Ġa Ġrequest Ġto Ġexecute Ġin Ġthe Ġrendering Ġthread . Ġ*/ ĊĠ Ġprivate Ġvar Ġmin Wait Time Ms Ġ= ĠTimeUnit . SECONDS . to Millis ( 2 ). toInt () ĊĠĠĠ Ġset ( value ) Ġ{ Ġfield Ġ= Ġvalue . coerce At Most ( max Wait Time Ms ) Ġ} ĊĊĠ Ġ/** ĠMaximum Ġtime Ġfor Ġa Ġrequest Ġto Ġexecute Ġin Ġthe Ġrendering Ġthread . Ġ*/ ĊĠ Ġprivate Ġvar Ġmax Wait Time Ms Ġ= ĠTimeUnit . SECONDS . to Millis ( 4 ). toInt () ĊĠĠĠ Ġset ( value ) Ġ{ Ġfield Ġ= Ġvalue . coerce At Least ( min Wait Time Ms )} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMinimum Ġtime Ġto Ġspace Ġrequests Ġcreation . ĠIf Ġthis Ġis Ġsmaller Ġthan Ġ[ min Wait Time Ms ], Ġrequests Ġwill Ġaccum ulate Ġin Ġthe Ġqueue Ġand Ġwill ĊĠĠ Ġ* Ġeventually Ġcause Ġthe Ġqueue Ġto Ġbecome Ġfull . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġmin Space Time Ms Ġ= Ġ 5 0 0 ĊĠĠĠ Ġset ( value ) Ġ{ Ġfield Ġ= Ġvalue . coerce At Most ( max Space Time Ms ) Ġ} ĊĊĠ Ġ/** ĠMax Ġtime Ġbetween Ġtwo Ġwait Ġrequests . Ġ*/ ĊĠ Ġprivate Ġvar Ġmax Space Time Ms Ġ= ĠTimeUnit . SECONDS . to Millis ( 5 ). toInt () ĊĠĠĠ Ġset ( value ) Ġ{ Ġfield Ġ= Ġvalue . coerce At Least ( min Space Time Ms )} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġ[ l agger ] Ġmethod Ġwill Ġwait Ġon Ġthis Ġlock Ġto Ġdo Ġits Ġsleep Ġcycles . ĠWhen Ġthe Ġaction Ġis Ġdisabled , Ġthe Ġlock Ġwill Ġbe Ġreleased ĊĠĠ Ġ* Ġso Ġall Ġthe Ġwaits Ġwill Ġimmediately Ġbe Ġcancelled . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġsleep Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĠ Ġprivate Ġval Ġl agger Ġ= Ġ{ ĊĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠ ĠRender Service . get Render Async Action Executor (). run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Time Ms Ġ= ĠRandom . next Long ( min Wait Time Ms . to Long (), Ġmax Wait Time Ms . to Long ()) ĊĠĠĠĠĠĠĠ ĠLOG . info (" Waiting Ġ${ wait Time Ms } ms ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! sleep Lock . read Lock (). try Lock ( wait Time Ms , ĠTimeUnit . MILLISECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Wait ed Ġ${ wait Time Ms } ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġre schedule () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġre schedule () Ġ{ ĊĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠ Ġval Ġspace Time Ms Ġ= ĠRandom . next Long ( min Space Time Ms . to Long (), Ġmax Space Time Ms . to Long ()) ĊĠĠĠĠĠ ĠLOG . info (" Request Ġscheduled Ġin Ġ${ space Time Ms } ms ") ĊĠĠĠĠĠ ĠApp Executor Util . getApp Scheduled ExecutorService (). schedule ( l agger , Ġspace Time Ms , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġis Selected ( e : ĠAn ActionEvent ): ĠBoolean Ġ= Ġenabled ĊĠ Ġoverride Ġfun ĠsetSelected ( e : ĠAn ActionEvent , Ġstate : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠ Ġenabled Ġ= Ġfalse ĊĠĠĠĠĠ Ġsleep Lock . write Lock (). unlock () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠDialog Builder () ĊĠĠĠĠĠ Ġbuilder . set Center Panel ( panel Ġ{ ĊĠĠĠĠĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" Min Ġwait Ġtime ") ĊĠĠĠĠĠĠĠĠĠ Ġspinner ( this @ Render Lag ging Mode :: min Wait Time Ms , Ġ 0 , Ġ 9 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" Max Ġwait Ġtime ") ĊĠĠĠĠĠĠĠĠĠ Ġspinner ( this @ Render Lag ging Mode :: max Wait Time Ms , Ġ 0 , Ġ 9 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" Min Ġaction Ġspace Ġtime ") ĊĠĠĠĠĠĠĠĠĠ Ġspinner ( this @ Render Lag ging Mode :: min Space Time Ms , Ġ 0 , Ġ 9 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrow Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" Max Ġaction Ġspace Ġtime ") ĊĠĠĠĠĠĠĠĠĠ Ġspinner ( this @ Render Lag ging Mode :: max Space Time Ms , Ġ 0 , Ġ 9 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠ Ġlabel (" ms ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġbuilder . set Ok Operation Ġ{ ĊĠĠĠĠĠĠĠ Ġenabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsleep Lock . write Lock (). lock () ĊĠĠĠĠĠĠĠ Ġre schedule () ĊĠĠĠĠĠĠĠ Ġbuilder . dialog Wrapper . close ( Dialog Wrapper . OK _ EXIT _ CODE ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbuilder . show () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ }