{"version":3,"sources":["Android.js"],"names":["async","args","await","Binaries","addToPathAsync","let","result","spawnAsync","stdout","e","errorMessage","_","trim","stderr","startsWith","BEGINNING_OF_ADB_ERROR_MESSAGE","substring","length","Error","_getAdbOutputAsync","devices","lines","split","_isDeviceAttachedAsync","shift","listOfDevicesWithoutFirstLine","join","includes","_isDeviceAuthorizedAsync","packages","i","line","_isExpoInstalledAsync","info","regex","regexMatch","exec","_expoVersionAsync","versions","Api","versionsAsync","installedVersion","semver","lt","androidVersion","Logger","notifications","warn","code","NotificationCode","OLD_ANDROID_APP_VERSION","_checkExpoUpToDateAsync","apkPath","path","_apkCacheDirectory","existsAsync","downloadAsync","androidUrl","_downloadApkAsync","global","START_LOADING","STOP_LOADING","_installExpoAsync","_uninstallExpoAsync","_assertDeviceReadyAsync","installResult","status","_lastUrl","error","message","upgradeExpoAsync","genymotionMessage","url","output","CANT_START_ACTIVITY_ERROR","indexOf","_openUrlAsync","isDetached","installedExpo","Analytics","logEvent","platform","openUrlAsync","projectRoot","startAdbReverseAsync","projectUrl","UrlUtils","constructManifestUrlAsync","exp","ProjectUtils","readConfigJsonAsync","success","openProjectAsync","packagerInfo","ProjectSettings","readPackagerInfoAsync","expRc","readExpRcAsync","userDefinedAdbReversePorts","extraAdbReversePorts","adbReversePorts","packagerPort","expoServerPort","port","adbReverse","adbReverseRemove","stopAdbReverseAsync","debug","isPlatformSupported","process","dotExpoHomeDirectory","UserSettings","dir","mkdirp","sync"],"mappings":";;;;;;;;+BA+BAA,WAAkCC,IAAlCD,EAAwC;AACtCE,UAAMC,gCAASC,cAATD,CAAwB,KAAxBA,CAAND;;AAEA,QAAI;AACFG,UAAIC,SAASJ,MAAMK,iDAAW,KAAXA,EAAkBN,IAAlBM,CAAnBF;AACA,aAAOC,OAAOE,MAAd;AACF,KAHA,CAGE,OAAOC,CAAP,EAAU;AACVJ,UAAIK,eAAeC,oCAAEC,IAAFD,CAAOF,EAAEI,MAATF,CAAnBN;AACA,UAAIK,aAAaI,UAAbJ,CAAwBK,8BAAxBL,CAAJ,EAA6D;AAC3DA,uBAAeA,aAAaM,SAAbN,CAAuBK,+BAA+BE,MAAtDP,CAAfA;AACF;AACA,YAAM,IAAIQ,KAAJ,CAAUR,YAAV,CAAN;AACF;AACF,G;;kBAbeS,kB;;;;;AAef;;;;gCACAnB,aAAwC;AACtCK,QAAIe,UAAUlB,MAAMiB,mBAAmB,CAAC,SAAD,CAAnBA,CAApBd;AACAA,QAAIgB,QAAQV,oCAAEC,IAAFD,CAAOS,OAAPT,EAAgBW,KAAhBX,CAAsB,OAAtBA,CAAZN;AACA;AACA,WAAOgB,MAAMJ,MAANI,GAAe,CAAtB;AACF,G;;kBALeE,sB;;;;;;gCAOfvB,aAA0C;AACxCK,QAAIe,UAAUlB,MAAMiB,mBAAmB,CAAC,SAAD,CAAnBA,CAApBd;AACAA,QAAIgB,QAAQV,oCAAEC,IAAFD,CAAOS,OAAPT,EAAgBW,KAAhBX,CAAsB,OAAtBA,CAAZN;AACAgB,UAAMG,KAANH;AACAhB,QAAIoB,gCAAgCJ,MAAMK,IAANL,CAAW,IAAXA,CAApChB;AACA;AACA;AACA,WAAOoB,8BAA8BE,QAA9BF,CAAuC,QAAvCA,CAAP;AACF,G;;kBAReG,wB;;;;;AAUf;;;;gCACA5B,aAAuC;AACrCK,QAAIwB,WAAW3B,MAAMiB,mBAAmB,CAAC,OAAD,EAAU,IAAV,EAAgB,MAAhB,EAAwB,UAAxB,EAAoC,IAApC,CAAnBA,CAArBd;AACAA,QAAIgB,QAAQQ,SAASP,KAATO,CAAe,OAAfA,CAAZxB;AACA,SAAKA,IAAIyB,IAAI,CAAb,EAAgBA,IAAIT,MAAMJ,MAA1B,EAAkCa,GAAlC,EAAuC;AACrCzB,UAAI0B,OAAOV,MAAMS,CAANT,CAAXhB;AACA,UAAI0B,KAAKJ,QAALI,CAAc,wBAAdA,CAAJ,EAA6C;AAC3C;AACF;;AAEA,UAAIA,KAAKJ,QAALI,CAAc,mBAAdA,CAAJ,EAAwC;AACtC,eAAO,IAAP;AACF;AACF;;AAEA,WAAO,KAAP;AACF,G;;kBAfeC,qB;;;;;;gCAiBfhC,aAAmC;AACjCK,QAAI4B,OAAO/B,MAAMiB,mBAAmB,CAAC,OAAD,EAAU,SAAV,EAAqB,SAArB,EAAgC,mBAAhC,CAAnBA,CAAjBd;;AAEAA,QAAI6B,QAAQ,yBAAZ7B;AACAA,QAAI8B,aAAaD,MAAME,IAANF,CAAWD,IAAXC,CAAjB7B;AACA,QAAI8B,WAAWlB,MAAXkB,GAAoB,CAAxB,EAA2B;AACzB,aAAO,IAAP;AACF;;AAEA,WAAOA,WAAW,CAAXA,CAAP;AACF,G;;kBAVeE,iB;;;;;;gCAYfrC,aAAyC;AACvCK,QAAIiC,WAAWpC,MAAMqC,8BAAIC,aAAJD,EAArBlC;AACAA,QAAIoC,mBAAmBvC,MAAMmC,mBAA7BhC;;AAEA,QAAI,CAACoC,gBAAD,IAAqBC,oCAAOC,EAAPD,CAAUD,gBAAVC,EAA4BJ,SAASM,cAArCF,CAAzB,EAA+E;AAC7EG,0CAAOC,aAAPD,CAAqBE,IAArBF,CACE,EAAEG,MAAMC,wDAAiBC,uBAAzB,EADFL,EAEE,0FAFFA;AAIF;AACF,G;;kBAVeM,uB;;;;;;gCAmBfnD,aAAmC;AACjCK,QAAIiC,WAAWpC,MAAMqC,8BAAIC,aAAJD,EAArBlC;AACAA,QAAI+C,UAAUC,cAAK3B,IAAL2B,CAAUC,oBAAVD,EAAiC,YAAWf,SAASM,cAAe,MAApES,CAAdhD;;AAEA,QAAIH,MAAMqD,mDAAYH,OAAZG,CAAV,EAAgC;AAC9B,aAAOH,OAAP;AACF;;AAEAlD,UAAMqC,8BAAIiB,aAAJjB,CACJD,SAASmB,UADLlB,EAEJc,cAAK3B,IAAL2B,CAAUC,oBAAVD,EAAiC,YAAWf,SAASM,cAAe,MAApES,CAFId,CAANrC;AAIA,WAAOkD,OAAP;AACF,G;;kBAbeM,iB;;;;;;gCAef1D,aAAmC;AACjC6C,wCAAOc,MAAPd,CAAcZ,IAAdY,CAAoB,oCAApBA;AACAA,wCAAOC,aAAPD,CAAqBZ,IAArBY,CAA0B,EAAEG,MAAMC,wDAAiBW,aAAzB,EAA1Bf;AACAxC,QAAIgD,OAAOnD,MAAMwD,mBAAjBrD;AACAwC,wCAAOC,aAAPD,CAAqBZ,IAArBY,CAA0B,EAAEG,MAAMC,wDAAiBY,YAAzB,EAA1BhB;AACAA,wCAAOc,MAAPd,CAAcZ,IAAdY,CAAoB,2BAApBA;AACAA,wCAAOC,aAAPD,CAAqBZ,IAArBY,CAA0B,EAAEG,MAAMC,wDAAiBW,aAAzB,EAA1Bf;AACAxC,QAAIC,SAASJ,MAAMiB,mBAAmB,CAAC,SAAD,EAAYkC,IAAZ,CAAnBlC,CAAnBd;AACAwC,wCAAOC,aAAPD,CAAqBZ,IAArBY,CAA0B,EAAEG,MAAMC,wDAAiBY,YAAzB,EAA1BhB;AACA,WAAOvC,MAAP;AACF,G;;kBAVewD,iB;;;;;;gCAYf9D,aAAqC;AACnC6C,wCAAOc,MAAPd,CAAcZ,IAAdY,CAAmB,wCAAnBA;AACA,WAAO3C,MAAMiB,mBAAmB,CAAC,WAAD,EAAc,mBAAd,CAAnBA,CAAb;AACF,G;;kBAHe4C,mB;;;;;;iCAKR/D,aAAoD;AACzD,QAAI;AACFE,YAAM8D,yBAAN9D;;AAEAA,YAAM6D,qBAAN7D;AACAG,UAAI4D,gBAAgB/D,MAAM4D,mBAA1BzD;AACA,UAAI4D,cAAcC,MAAdD,KAAyB,CAA7B,EAAgC;AAC9B,eAAO,KAAP;AACF;;AAEA,UAAIE,QAAJ,EAAc;AACZtB,4CAAOc,MAAPd,CAAcZ,IAAdY,CAAoB,WAAUsB,QAAS,WAAvCtB;AACA3C,cAAMiB,mBAAmB,CACvB,OADuB,EAEvB,IAFuB,EAGvB,OAHuB,EAIvB,IAJuB,EAKvB,4BALuB,EAMvB,IANuB,EAOvBgD,QAPuB,CAAnBhD,CAANjB;AASAiE,mBAAW,IAAXA;AACF;;AAEA,aAAO,IAAP;AACF,KAxBA,CAwBE,OAAO1D,CAAP,EAAU;AACVoC,0CAAOc,MAAPd,CAAcuB,KAAdvB,CAAoBpC,EAAE4D,OAAtBxB;AACA,aAAO,KAAP;AACF;AACF,G;;kBA7BsByB,gB;;;;;AA+BtB;;;;iCACAtE,aAAyC;AACvC,UAAMuE,oBAAqB,sNAA3B;;AAEA,QAAI,EAACrE,MAAMqB,wBAAP,CAAJ,EAAqC;AACnC,YAAM,IAAIL,KAAJ,CACH,+GAA8GqD,iBAAkB,EAD7H,CAAN;AAGF;;AAEA,QAAI,EAACrE,MAAM0B,0BAAP,CAAJ,EAAuC;AACrC,YAAM,IAAIV,KAAJ,CACH,sHAAqHqD,iBAAkB,EADpI,CAAN;AAGF;AACF,G;;kBAdeP,uB;;;;;;iCAgBfhE,WAA6BwE,GAA7BxE,EAA0C;AACxCK,QAAIoE,SAASvE,MAAMiB,mBAAmB,CACpC,OADoC,EAEpC,IAFoC,EAGpC,OAHoC,EAIpC,IAJoC,EAKpC,4BALoC,EAMpC,IANoC,EAOpCqD,GAPoC,CAAnBrD,CAAnBd;AASA,QAAIoE,OAAO9C,QAAP8C,CAAgBC,yBAAhBD,CAAJ,EAAgD;AAC9C,YAAM,IAAIvD,KAAJ,CAAUuD,OAAOzD,SAAPyD,CAAiBA,OAAOE,OAAPF,CAAe,SAAfA,CAAjBA,CAAV,CAAN;AACF;;AAEA,WAAOA,MAAP;AACF,G;;kBAfeG,a;;;;;;iCAiBf5E,WAA4BwE,GAA5BxE,EAAyC6E,aAAsB,KAA/D7E,EAAsE;AACpE,QAAI;AACFE,YAAM8D,yBAAN9D;;AAEAG,UAAIyE,gBAAgB,KAApBzE;AACA,UAAI,CAACwE,UAAD,IAAe,EAAC3E,MAAM8B,uBAAP,CAAnB,EAAmD;AACjD9B,cAAM4D,mBAAN5D;AACA4E,wBAAgB,IAAhBA;AACF;;AAEA,UAAI,CAACD,UAAL,EAAiB;AACfV,mBAAWK,GAAXL;AACAhB,kCAFe,CAEU;AAC3B;;AAEAN,0CAAOc,MAAPd,CAAcZ,IAAdY,CAAoB,2BAApBA;AACA,UAAI;AACF3C,cAAM0E,cAAcJ,GAAdI,CAAN1E;AACF,OAFA,CAEE,OAAOO,CAAP,EAAU;AACV,YAAIoE,UAAJ,EAAgB;AACdpE,YAAE4D,OAAF5D,GAAa,+HAA8HA,EAAE4D,OAAQ,EAArJ5D;AACF,SAFA,MAEO;AACLA,YAAE4D,OAAF5D,GAAa,sBAAqBA,EAAE4D,OAAQ,EAA5C5D;AACF;;AAEA,cAAMA,CAAN;AACF;;AAEAsE,wCAAUC,QAAVD,CAAmB,oBAAnBA,EAAyC;AACvCE,kBAAU,SAD6B;AAEvCH;AAFuC,OAAzCC;AAIF,KA/BA,CA+BE,OAAOtE,CAAP,EAAU;AACVA,QAAE4D,OAAF5D,GAAa,sBAAqBA,EAAE4D,OAAQ,EAA5C5D;AACA,YAAMA,CAAN;AACF;AACF,G;;kBApCeyE,Y;;;;;;iCAsCRlF,WAAgCmF,WAAhCnF,EAAqD;AAC1D,QAAI;AACFE,YAAMkF,qBAAqBD,WAArBC,CAANlF;;AAEAG,UAAIgF,aAAanF,MAAMoF,gCAASC,yBAATD,CAAmCH,WAAnCG,CAAvBjF;AACAA,UAAI,EAAEmF,GAAF,KAAUtF,MAAMuF,wCAAaC,mBAAbD,CAAiCN,WAAjCM,CAApBpF;;AAEAH,YAAMgF,aAAaG,UAAbH,EAAyB,CAAC,CAACM,IAAIX,UAA/BK,CAANhF;AACA,aAAO,EAAEyF,SAAS,IAAX,EAAiBvB,OAAO,IAAxB,EAAP;AACF,KARA,CAQE,OAAO3D,CAAP,EAAU;AACVoC,0CAAOc,MAAPd,CAAcuB,KAAdvB,CAAqB,sCAAqCpC,EAAE4D,OAAQ,EAApExB;AACA,aAAO,EAAE8C,SAAS,KAAX,EAAkBvB,OAAO3D,CAAzB,EAAP;AACF;AACF,G;;kBAbsBmF,gB;;;;;AAetB;;;;iCACO5F,WAAoCmF,WAApCnF,EAAyD;AAC9D,UAAM6F,eAAe3F,MAAM4F,8CAAgBC,qBAAhBD,CAAsCX,WAAtCW,CAA3B;AACA,UAAME,QAAQ9F,MAAMuF,wCAAaQ,cAAbR,CAA4BN,WAA5BM,CAApB;AACA,UAAMS,6BAA6BF,MAAMG,oBAANH,IAA8B,EAAjE;;AAEA3F,QAAI+F,kBAAkB,CACpBP,aAAaQ,YADO,EAEpBR,aAAaS,cAFO,EAGpB,GAAGJ,0BAHiB,CAAtB7F;;AAMA,SAAKA,IAAIkG,IAAT,IAAiBH,eAAjB,EAAkC;AAChC,UAAI,EAAClG,MAAMsG,WAAWD,IAAXC,CAAP,CAAJ,EAA6B;AAC3B,eAAO,KAAP;AACF;AACF;;AAEA,WAAO,IAAP;AACF,G;;kBAlBsBpB,oB;;;;;;iCAoBfpF,WAAmCmF,WAAnCnF,EAAwD;AAC7D,UAAM6F,eAAe3F,MAAM4F,8CAAgBC,qBAAhBD,CAAsCX,WAAtCW,CAA3B;AACA,UAAME,QAAQ9F,MAAMuF,wCAAaQ,cAAbR,CAA4BN,WAA5BM,CAApB;AACA,UAAMS,6BAA6BF,MAAMG,oBAANH,IAA8B,EAAjE;;AAEA3F,QAAI+F,kBAAkB,CACpBP,aAAaQ,YADO,EAEpBR,aAAaS,cAFO,EAGpB,GAAGJ,0BAHiB,CAAtB7F;;AAMA,SAAKA,IAAIkG,IAAT,IAAiBH,eAAjB,EAAkC;AAChClG,YAAMuG,iBAAiBF,IAAjBE,CAANvG;AACF;AACF,G;;kBAdsBwG,mB;;;;;;iCAgBtB1G,WAA0BuG,IAA1BvG,EAAwC;AACtC,QAAI,EAACE,MAAM0B,0BAAP,CAAJ,EAAuC;AACrC,aAAO,KAAP;AACF;;AAEA,QAAI;AACF1B,YAAMiB,mBAAmB,CAAC,SAAD,EAAa,OAAMoF,IAAK,EAAxB,EAA4B,OAAMA,IAAK,EAAvC,CAAnBpF,CAANjB;AACA,aAAO,IAAP;AACF,KAHA,CAGE,OAAOO,CAAP,EAAU;AACVoC,0CAAOc,MAAPd,CAAcE,IAAdF,CAAoB,yBAAwBpC,EAAE4D,OAAQ,EAAtDxB;AACA,aAAO,KAAP;AACF;AACF,G;;kBAZe2D,U;;;;;;iCAcfxG,WAAgCuG,IAAhCvG,EAA8C;AAC5C,QAAI,EAACE,MAAM0B,0BAAP,CAAJ,EAAuC;AACrC,aAAO,KAAP;AACF;;AAEA,QAAI;AACF1B,YAAMiB,mBAAmB,CAAC,SAAD,EAAY,UAAZ,EAAyB,OAAMoF,IAAK,EAApC,CAAnBpF,CAANjB;AACA,aAAO,IAAP;AACF,KAHA,CAGE,OAAOO,CAAP,EAAU;AACV;AACAoC,0CAAOc,MAAPd,CAAc8D,KAAd9D,CAAqB,gCAA+BpC,EAAE4D,OAAQ,EAA9DxB;AACA,aAAO,KAAP;AACF;AACF,G;;kBAbe4D,gB;;;;;QAjSCG,mB,GAAAA,mB;;;;AArBhB;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;AACA;;;;AACA;AAAA;AAAA;;;;AAEA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;AACA;AAAA;AAAA;;;;;;;;AAEAvG,IAAI8D,WAAW,IAAf9D;AACA,MAAMU,iCAAiC,SAAvC;AACA,MAAM2D,4BAA4B,gDAAlC;;AAEO,SAASkC,mBAAT,GAA+B;AACpC,SACEC,QAAQ5B,QAAR4B,KAAqB,QAArBA,IAAiCA,QAAQ5B,QAAR4B,KAAqB,OAAtDA,IAAiEA,QAAQ5B,QAAR4B,KAAqB,OADxF;AAGF;;AA6EA,SAASvD,kBAAT,GAA8B;AAC5BjD,MAAIyG,uBAAuBC,gDAAaD,oBAAbC,EAA3B1G;AACAA,MAAI2G,MAAM3D,cAAK3B,IAAL2B,CAAUyD,oBAAVzD,EAAgC,mBAAhCA,CAAVhD;AACA4G,sCAAOC,IAAPD,CAAYD,GAAZC;AACA,SAAOD,GAAP;AACF","file":"../Android.js","sourcesContent":["/**\n * @flow\n */\n\nimport _ from 'lodash';\nimport spawnAsync from '@expo/spawn-async';\nimport existsAsync from 'exists-async';\nimport mkdirp from 'mkdirp';\nimport path from 'path';\nimport semver from 'semver';\n\nimport * as Analytics from './Analytics';\nimport * as Binaries from './Binaries';\nimport Api from './Api';\nimport Logger from './Logger';\nimport NotificationCode from './NotificationCode';\nimport * as ProjectUtils from './project/ProjectUtils';\nimport * as ProjectSettings from './ProjectSettings';\nimport UserSettings from './UserSettings';\nimport * as UrlUtils from './UrlUtils';\n\nlet _lastUrl = null;\nconst BEGINNING_OF_ADB_ERROR_MESSAGE = 'error: ';\nconst CANT_START_ACTIVITY_ERROR = 'Activity not started, unable to resolve Intent';\n\nexport function isPlatformSupported() {\n return (\n process.platform === 'darwin' || process.platform === 'win32' || process.platform === 'linux'\n );\n}\n\nasync function _getAdbOutputAsync(args) {\n await Binaries.addToPathAsync('adb');\n\n try {\n let result = await spawnAsync('adb', args);\n return result.stdout;\n } catch (e) {\n let errorMessage = _.trim(e.stderr);\n if (errorMessage.startsWith(BEGINNING_OF_ADB_ERROR_MESSAGE)) {\n errorMessage = errorMessage.substring(BEGINNING_OF_ADB_ERROR_MESSAGE.length);\n }\n throw new Error(errorMessage);\n }\n}\n\n// Device attached\nasync function _isDeviceAttachedAsync() {\n let devices = await _getAdbOutputAsync(['devices']);\n let lines = _.trim(devices).split(/\\r?\\n/);\n // First line is \"List of devices\".\n return lines.length > 1;\n}\n\nasync function _isDeviceAuthorizedAsync() {\n let devices = await _getAdbOutputAsync(['devices']);\n let lines = _.trim(devices).split(/\\r?\\n/);\n lines.shift();\n let listOfDevicesWithoutFirstLine = lines.join('\\n');\n // result looks like \"072c4cf200e333c7\tdevice\" when authorized\n // and \"072c4cf200e333c7\tunauthorized\" when not.\n return listOfDevicesWithoutFirstLine.includes('device');\n}\n\n// Expo installed\nasync function _isExpoInstalledAsync() {\n let packages = await _getAdbOutputAsync(['shell', 'pm', 'list', 'packages', '-f']);\n let lines = packages.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n if (line.includes('host.exp.exponent.test')) {\n continue;\n }\n\n if (line.includes('host.exp.exponent')) {\n return true;\n }\n }\n\n return false;\n}\n\nasync function _expoVersionAsync() {\n let info = await _getAdbOutputAsync(['shell', 'dumpsys', 'package', 'host.exp.exponent']);\n\n let regex = /versionName\\=([0-9\\.]+)/;\n let regexMatch = regex.exec(info);\n if (regexMatch.length < 2) {\n return null;\n }\n\n return regexMatch[1];\n}\n\nasync function _checkExpoUpToDateAsync() {\n let versions = await Api.versionsAsync();\n let installedVersion = await _expoVersionAsync();\n\n if (!installedVersion || semver.lt(installedVersion, versions.androidVersion)) {\n Logger.notifications.warn(\n { code: NotificationCode.OLD_ANDROID_APP_VERSION },\n 'This version of the Expo app is out of date. Uninstall the app and run again to upgrade.'\n );\n }\n}\n\nfunction _apkCacheDirectory() {\n let dotExpoHomeDirectory = UserSettings.dotExpoHomeDirectory();\n let dir = path.join(dotExpoHomeDirectory, 'android-apk-cache');\n mkdirp.sync(dir);\n return dir;\n}\n\nasync function _downloadApkAsync() {\n let versions = await Api.versionsAsync();\n let apkPath = path.join(_apkCacheDirectory(), `Exponent-${versions.androidVersion}.apk`);\n\n if (await existsAsync(apkPath)) {\n return apkPath;\n }\n\n await Api.downloadAsync(\n versions.androidUrl,\n path.join(_apkCacheDirectory(), `Exponent-${versions.androidVersion}.apk`)\n );\n return apkPath;\n}\n\nasync function _installExpoAsync() {\n Logger.global.info(`Downloading latest version of Expo`);\n Logger.notifications.info({ code: NotificationCode.START_LOADING });\n let path = await _downloadApkAsync();\n Logger.notifications.info({ code: NotificationCode.STOP_LOADING });\n Logger.global.info(`Installing Expo on device`);\n Logger.notifications.info({ code: NotificationCode.START_LOADING });\n let result = await _getAdbOutputAsync(['install', path]);\n Logger.notifications.info({ code: NotificationCode.STOP_LOADING });\n return result;\n}\n\nasync function _uninstallExpoAsync() {\n Logger.global.info('Uninstalling Expo from Android device.');\n return await _getAdbOutputAsync(['uninstall', 'host.exp.exponent']);\n}\n\nexport async function upgradeExpoAsync(): Promise {\n try {\n await _assertDeviceReadyAsync();\n\n await _uninstallExpoAsync();\n let installResult = await _installExpoAsync();\n if (installResult.status !== 0) {\n return false;\n }\n\n if (_lastUrl) {\n Logger.global.info(`Opening ${_lastUrl} in Expo.`);\n await _getAdbOutputAsync([\n 'shell',\n 'am',\n 'start',\n '-a',\n 'android.intent.action.VIEW',\n '-d',\n _lastUrl,\n ]);\n _lastUrl = null;\n }\n\n return true;\n } catch (e) {\n Logger.global.error(e.message);\n return false;\n }\n}\n\n// Open Url\nasync function _assertDeviceReadyAsync() {\n const genymotionMessage = `https://developer.android.com/studio/run/device.html#developer-device-options. If you are using Genymotion go to Settings -> ADB, select \"Use custom Android SDK tools\", and point it at your Android SDK directory.`;\n\n if (!await _isDeviceAttachedAsync()) {\n throw new Error(\n `No Android device found. Please connect a device and follow the instructions here to enable USB debugging:\\n${genymotionMessage}`\n );\n }\n\n if (!await _isDeviceAuthorizedAsync()) {\n throw new Error(\n `This computer is not authorized to debug the device. Please follow the instructions here to enable USB debugging:\\n${genymotionMessage}`\n );\n }\n}\n\nasync function _openUrlAsync(url: string) {\n let output = await _getAdbOutputAsync([\n 'shell',\n 'am',\n 'start',\n '-a',\n 'android.intent.action.VIEW',\n '-d',\n url,\n ]);\n if (output.includes(CANT_START_ACTIVITY_ERROR)) {\n throw new Error(output.substring(output.indexOf('Error: ')));\n }\n\n return output;\n}\n\nasync function openUrlAsync(url: string, isDetached: boolean = false) {\n try {\n await _assertDeviceReadyAsync();\n\n let installedExpo = false;\n if (!isDetached && !await _isExpoInstalledAsync()) {\n await _installExpoAsync();\n installedExpo = true;\n }\n\n if (!isDetached) {\n _lastUrl = url;\n _checkExpoUpToDateAsync(); // let this run in background\n }\n\n Logger.global.info(`Opening on Android device`);\n try {\n await _openUrlAsync(url);\n } catch (e) {\n if (isDetached) {\n e.message = `Error running app. Have you installed the app already using Android Studio? Since you are detached you must build manually. ${e.message}`;\n } else {\n e.message = `Error running app. ${e.message}`;\n }\n\n throw e;\n }\n\n Analytics.logEvent('Open Url on Device', {\n platform: 'android',\n installedExpo,\n });\n } catch (e) {\n e.message = `Error running adb: ${e.message}`;\n throw e;\n }\n}\n\nexport async function openProjectAsync(projectRoot: string) {\n try {\n await startAdbReverseAsync(projectRoot);\n\n let projectUrl = await UrlUtils.constructManifestUrlAsync(projectRoot);\n let { exp } = await ProjectUtils.readConfigJsonAsync(projectRoot);\n\n await openUrlAsync(projectUrl, !!exp.isDetached);\n return { success: true, error: null };\n } catch (e) {\n Logger.global.error(`Couldn't start project on Android: ${e.message}`);\n return { success: false, error: e };\n }\n}\n\n// Adb reverse\nexport async function startAdbReverseAsync(projectRoot: string) {\n const packagerInfo = await ProjectSettings.readPackagerInfoAsync(projectRoot);\n const expRc = await ProjectUtils.readExpRcAsync(projectRoot);\n const userDefinedAdbReversePorts = expRc.extraAdbReversePorts || [];\n\n let adbReversePorts = [\n packagerInfo.packagerPort,\n packagerInfo.expoServerPort,\n ...userDefinedAdbReversePorts,\n ];\n\n for (let port of adbReversePorts) {\n if (!await adbReverse(port)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function stopAdbReverseAsync(projectRoot: string) {\n const packagerInfo = await ProjectSettings.readPackagerInfoAsync(projectRoot);\n const expRc = await ProjectUtils.readExpRcAsync(projectRoot);\n const userDefinedAdbReversePorts = expRc.extraAdbReversePorts || [];\n\n let adbReversePorts = [\n packagerInfo.packagerPort,\n packagerInfo.expoServerPort,\n ...userDefinedAdbReversePorts,\n ];\n\n for (let port of adbReversePorts) {\n await adbReverseRemove(port);\n }\n}\n\nasync function adbReverse(port: number) {\n if (!await _isDeviceAuthorizedAsync()) {\n return false;\n }\n\n try {\n await _getAdbOutputAsync(['reverse', `tcp:${port}`, `tcp:${port}`]);\n return true;\n } catch (e) {\n Logger.global.warn(`Couldn't adb reverse: ${e.message}`);\n return false;\n }\n}\n\nasync function adbReverseRemove(port: number) {\n if (!await _isDeviceAuthorizedAsync()) {\n return false;\n }\n\n try {\n await _getAdbOutputAsync(['reverse', '--remove', `tcp:${port}`]);\n return true;\n } catch (e) {\n // Don't send this to warn because we call this preemptively sometimes\n Logger.global.debug(`Couldn't adb reverse remove: ${e.message}`);\n return false;\n }\n}\n"],"sourceRoot":"/xdl/src"}