/** Ċ Ġ* Ġ***************************************************************** **************** * Ċ Ġ* Ċ Ġ* ĠFilename Ġ: ĠQu ill Player Vr Activity . java ĠContent Ġ: ĠCreated Ġ: ĠAuthors Ġ: Ċ Ġ* Ċ Ġ* ĠCopyright Ġ: ĠCopyright Ġ 2 0 1 4 ĠO cul us ĠVR , ĠLLC . ĠAll ĠRights Ġreserved . Ċ Ġ*/ Ċ package Ġorg . linux foundation . imm . player Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Native Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics .* Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Keep Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġjava . io . File Ċ import Ġkotlinx . coroutines .* Ċ Ċ @ Keep Ċ class ĠMainActivity Ġ: ĠNative Activity (), ĠCor outine Scope Ġby ĠCor outine Scope ( Dispatch ers . IO ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval ĠTAG Ġ= ĠMainActivity :: class . java . simple Name ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ PATH Ġ= Ġ" QU ILL _ PATH " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ NAME Ġ= Ġ" QU ILL _ NAME " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ AR TI ST _ NAME Ġ= Ġ" QU ILL _ AR TI ST _ NAME " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ CRE ATION _ TIME Ġ= Ġ" QU ILL _ CRE ATION _ TIME " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ TRACK ING _ LEVEL Ġ= Ġ" QU ILL _ TRACK ING _ LEVEL " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ PLAYER _ SPA WN _ LOCATION Ġ= ĊĠĠĠĠĠĠĠ Ġ" QU ILL _ PLAYER _ SPA WN _ LOCATION " Ġ// ĠDefault , ĠSp aces _ Player 1 , ĠSp aces _ Player 2 , ĠSp aces _ Player 3 , ĊĠĠĠ Ġ// ĠSp aces _ Player 4 ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ EY E _ BUFFER _ SCALE Ġ= Ġ" QU ILL _ EY E _ BUFFER _ SCALE " ĊĠĠĠ Ġconst Ġval ĠEX TRA _ QU ILL _ RENDER ING _ TE CH NI QUE Ġ= Ġ" QU ILL _ RENDER ING _ TE CH NI QUE " ĊĠĠĠ Ġconst Ġval ĠPER MISSION S _ REQUEST _ READ _ EXTERNAL _ STORAGE Ġ= Ġ 0 x 1 ĊĊĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative Set Asset Directory ( assets Dir : ĠString ?) ĊĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative SendMessage ( message : ĠString ?, Ġmessage Type : ĠInt ) ĊĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative Set Qu ill Rendering Tech nique ( rendering Tech nique : ĠInt ) ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġexternal Ġfun Ġnative Set Eye Buffer Scale ( ĊĠĠĠĠĠĠĠ Ġscale Factor : ĠFloat ĊĠĠĠ Ġ) Ġ// Ġscale Ġfactor Ġto Ġbe Ġapplied Ġto Ġdefault Ġeye Ġbuffers ĊĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative Set Player Spawn Location ( spawn Location : ĠString ?) ĊĠĠĠ Ġ@ Jvm Static Ġexternal Ġfun Ġnative Set Tracking Transform Level ( tracking Transform Level : ĠString ?) ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġlog Intent Extras ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent . extras ĊĠĠĠĠĠ Ġif Ġ( extras Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" found Ġextras !") ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġextras . keySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġextras [ key ] ĊĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , ĠString . format (" Ġ Ġ% s Ġ% s Ġ(% s )", Ġkey , Ġvalue . toString (), Ġvalue ?. java Class ?. name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhuman Readable Byte Count ( bytes : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġunit Ġ= Ġ 1 0 2 4 ĊĠĠĠĠĠ Ġif Ġ( bytes Ġ< Ġunit ) Ġreturn Ġ"$ bytes ĠB " ĊĠĠĠĠĠ Ġval Ġexp Ġ= Ġ( Math . log ( bytes . toDouble ()) Ġ/ ĠMath . log ( unit . toDouble ())). toInt () ĊĠĠĠĠĠ Ġval Ġpre Ġ= Ġ" k M GT PE "[ exp Ġ- Ġ 1 ]. toString () Ġ+ Ġ"" ĊĠĠĠĠĠ Ġreturn ĠString . format ("% . 1 f Ġ% s B ", Ġbytes Ġ/ ĠMath . pow ( unit . toDouble (), Ġexp . toDouble ()), Ġpre ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Loading Ġlibrary Ġlib app Imm Player . so ") ĊĠĠĠĠĠ ĠSystem . load Library (" app Imm Player ") ĊĠĠĠĠĠ ĠSystem . setProperty (" kotlin x . coroutines . debug ", Ġif Ġ( Build Config . DEBUG ) Ġ" on " Ġelse Ġ" off ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate Ġintent Ġcategory : Ġ" Ġ+ Ġintent . categories Ġ+ Ġ" Ġaction : Ġ" Ġ+ Ġintent . action ) ĊĠĠĠ Ġelse ĠLog . d ( TAG , Ġ" onCreate Ġnull Ġintent ") ĊĊĠĠĠ Ġif Ġ(! request External Storage Permission ()) ĊĠĠĠ Ġ// Ġfinish Init () Ġwill Ġbe Ġcalled Ġin Ġon Request Permissions Result ĊĠĠĠ Ġreturn ĊĊĠĠĠ Ġfinish Init () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfinish Init () Ġ{ ĊĠĠĠ ĠUtils . assets Directory Ġ= Ġapplication Context . files Dir . path Ġ+ Ġ"/" ĊĠĠĠ ĠUtils . cache Directory Ġ= Ġfiles Dir . path Ġ+ Ġ"/ cache /" ĊĠĠĠ Ġval Ġcache Dir Ġ= ĠFile ( Utils . cache Directory ) ĊĠĠĠ Ġif Ġ(! cacheDir . exists ()) Ġ{ ĊĠĠĠĠĠ Ġcache Dir . mkdir () ĊĠĠĠ Ġ} ĊĠĠĠ Ġnative Set Asset Directory ( Utils . assets Directory ) ĊĠĠĠ Ġunpack Qu ill Assets () ĊĊĠĠĠ Ġif Ġ(! handle New Intent ( intent )) Ġ{ ĊĠĠĠĠĠ Ġload Imm ("${ application Context . files Dir . path }/${ Utils . qu ill Demo Path }") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon New Intent ( intent : ĠIntent ) Ġ{ ĊĠĠĠ Ġsuper . on New Intent ( intent ) ĊĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠ Ġ" on New Intent Ġintent Ġpackage : Ġ${ intent .` package `} Ġscheme : Ġ${ intent . scheme } Ġtype : Ġ${ intent . type } Ġcategory : Ġ${ intent . categories } Ġaction : Ġ${ intent . action } Ġdata : Ġ${ intent . data String } Ġflags : Ġ${ intent . flags }") ĊĠĠĠ Ġhandle New Intent ( intent ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" on Resume Ġintent Ġ Ġpackage : Ġ${ intent .` package `} Ġscheme : Ġ${ intent . scheme } Ġtype : Ġ${ intent . type } Ġcategory : Ġ${ intent . categories } Ġaction : Ġ${ intent . action } Ġdata : Ġ${ intent . data String } Ġflags : Ġ${ intent . flags }") ĊĠĠĠ Ġelse ĠLog . d ( TAG , Ġ" on Resume Ġnull Ġintent ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ Ġcancel () ĊĊĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠ ĠLog . d ( TAG , Ġ" on Pause ") ĊĠĠĠ Ġsuper . on Pause () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle New Intent ( intent : ĠIntent ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġlog Intent Extras ( intent ) ĊĊĠĠĠ Ġ// ĠDev ĠGallery Ġuses Ġintent Ġextras Ġto Ġlaunch ĠQu ill ustr ations ĊĠĠĠ Ġif Ġ( handle Intent Extras ( intent )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Intent Extras ( intent : ĠIntent ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠCheck Ġif Ġintent Ġwas Ġlaunched Ġwith Ġthe ĠQu ill Ġdisk Ġpath ĊĠĠĠ Ġval Ġextras Ġ= Ġintent . extras ĊĠĠĠ Ġif Ġ( extras Ġ!= Ġnull ) Ġ{ Ġ// ĠShould Ġbe Ġeither Ġeye Ġor Ġfloor ĊĠĠĠĠĠ Ġif Ġ( extras . containsKey ( EXTRA _ QU ILL _ TRACK ING _ LEVEL )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġextras . getString ( EXTRA _ QU ILL _ TRACK ING _ LEVEL , Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ(! level . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" found Ġtracking Ġlevel Ġextra Ġ$ level ") ĊĠĠĠĠĠĠĠĠĠ Ġnative Set Tracking Transform Level ( level ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( extras . containsKey ( EXTRA _ QU ILL _ EY E _ BUFFER _ SCALE )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscale Factor Ġ= Ġextras . get Float ( EXTRA _ QU ILL _ EY E _ BUFFER _ SCALE ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" found Ġeye Ġbuffer Ġscale Ġextra Ġ$ scale Factor ") ĊĠĠĠĠĠĠĠ Ġif Ġ( scale Factor Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" invalid Ġeye Ġbuffer Ġscale : Ġ$ scale Factor ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnative Set Eye Buffer Scale ( scale Factor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( extras . containsKey ( EXTRA _ QU ILL _ RENDER ING _ TE CH NI QUE )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrendering Tech nique Ġ= Ġextras . getInt ( EXTRA _ QU ILL _ RENDER ING _ TE CH NI QUE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( rendering Tech nique Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" found Ġrendering Tech nique Ġextra Ġ$ rendering Tech nique ") ĊĠĠĠĠĠĠĠĠĠ Ġnative Set Qu ill Rendering Tech nique ( rendering Tech nique ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( extras . containsKey ( EXTRA _ QU ILL _ PLAYER _ SPA WN _ LOCATION )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspawn Location Ġ= Ġextras . getString ( EXTRA _ QU ILL _ PLAYER _ SPA WN _ LOCATION ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" found Ġplayer Ġspawn Ġlocation Ġextra Ġ$ spawn Location ") ĊĠĠĠĠĠĠĠ Ġnative Set Player Spawn Location ( spawn Location ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// Ġget Int Ġfailed , Ġso Ġparsing Ġinteger Ġfrom Ġstring Ġhere ĊĠĠĠĠĠ Ġif Ġ( extras . containsKey ( EXTRA _ QU ILL _ PATH )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġextras . getString ( EXTRA _ QU ILL _ PATH ) ĊĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġload Imm Path ( it ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġload Imm Path ( path : ĠString ) Ġ{ ĊĠĠĠ ĠLog . d ( TAG , Ġ" Loading ĠI MM : Ġ$ path ") ĊĠĠĠ Ġload Imm ( path ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġload Imm ( path : ĠString ) Ġ{ ĊĠĠĠ Ġnative SendMessage ( path , ĠMessage . Load Imm Path . value ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġload Error Imm ( message : ĠMessage ) Ġ{ ĊĠĠĠ Ġnative Set Tracking Transform Level (" floor ") ĊĠĠĠ Ġnative Set Player Spawn Location (" Default ") ĊĠĠĠ Ġnative Set Qu ill Rendering Tech nique ( Paint Rendering Tech nique . Static . value ) ĊĊĠĠĠ Ġif Ġ( message Ġ== ĠMessage . Disconnected ) Ġ{ ĊĠĠĠĠĠ Ġnative SendMessage ( Imm . Error . value , Ġmessage . value ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġnative SendMessage ( Imm . Error . value , Ġmessage . value ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġunpack Qu ill Assets () Ġ{ ĊĠĠĠ Ġval Ġshould Reload Ġ= ĠUtils . should Reload Assets () ĊĊĠĠĠ ĠUtils . Extract Assets Task ( this , ĠUtils . qu ill Error Path , Ġnull , Ġshould Reload ) ĊĠĠĠĠĠĠĠ Ġ. execute On Executor ( AsyncTask . THREAD _ POOL _ EXECUT OR ) ĊĊĠĠĠ ĠUtils . Extract Assets Task ( this , ĠUtils . qu ill Demo Path , Ġnull , Ġshould Reload ) ĊĠĠĠĠĠĠĠ Ġ. execute On Executor ( AsyncTask . THREAD _ POOL _ EXECUT OR ) ĊĊĠĠĠ Ġ// ĠExtract Ġui Lib Ġdata . ĊĠĠĠ Ġ/* val Ġcontrollers Load Timer Ġ= ĠUtils . Asset Load Timer ( ĊĠĠĠĠĠĠĠ ĠT iming Logger ( TAG , Ġ" controller Ġasset Ġextraction "), ĊĠĠĠĠĠĠĠ ĠUtils . controller Assets . size ĊĠĠĠ Ġ) ĊĠĠĠ Ġfor Ġ( controller Asset Ġin ĠUtils . controller Assets ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUtils . Extract Assets Task ( this , Ġcontroller Asset , Ġcontrollers Load Timer , Ġshould Reload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute On Executor ( AsyncTask . THREAD _ POOL _ EXECUT OR ) ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ// ĠWe Ġshould Ġonly Ġov ew rite Ġthe Ġasset Ġversion Ġfile Ġhere Ġafter Ġall Ġassets Ġfrom ĠGallery Ġand Ġfor ĊĠĠĠ Ġ// Ġplayer Ġhave Ġbeen Ġloaded . ĊĠĠĠ Ġval Ġforce Extract Ġ= Ġtrue ĊĠĠĠ ĠUtils . Extract Assets Task ( this , ĠUtils . asset Version File , Ġnull , Ġforce Extract ) ĊĠĠĠĠĠĠĠ Ġ. execute On Executor ( AsyncTask . THREAD _ POOL _ EXECUT OR ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrequest External Storage Permission (): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( this , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ!= ĊĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED Ġ|| ĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĊĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠ ĠPER MISSION S _ REQUEST _ READ _ EXTERNAL _ STORAGE ) ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ( request Code Ġ!= ĠPER MISSION S _ REQUEST _ READ _ EXTERNAL _ STORAGE ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( grant Results . size Ġ<= Ġ 0 Ġ|| Ġgrant Results [ 0 ] Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Access Ġnot Ġgranted Ġfor Ġreading Ġlocal ĠQu ill Ġmedia Ġin Ġexternal Ġstorage ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġfinish Init () ĊĠ Ġ} Ċ } Ċ