UNPKG

appium-android-driver

Version:

Android UiAutomator and Chrome support for Appium

128 lines 4.65 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStrings = getStrings; exports.ensureDeviceLocale = ensureDeviceLocale; const lodash_1 = __importDefault(require("lodash")); const support_1 = require("@appium/support"); /** * @this {import('../driver').AndroidDriver} * @param {string?} [language=null] * @returns {Promise<import('@appium/types').StringRecord>}} */ async function getStrings(language = null) { if (!language) { language = await this.adb.getDeviceLanguage(); this.log.info(`No language specified, returning strings for: ${language}`); } // Clients require the resulting mapping to have both keys // and values of type string /** @param {import('@appium/types').StringRecord} mapping */ const preprocessStringsMap = (mapping) => { /** @type {import('@appium/types').StringRecord} */ const result = {}; for (const [key, value] of lodash_1.default.toPairs(mapping)) { result[key] = lodash_1.default.isString(value) ? value : JSON.stringify(value); } return result; }; return preprocessStringsMap(await extractStringsFromResources.bind(this)(language)); } /** * @this {import('../driver').AndroidDriver} * @param {string} language * @param {string} country * @param {string} [script] * @returns {Promise<void>}} */ async function ensureDeviceLocale(language, country, script) { try { await this.settingsApp.setDeviceLocale(language, country, script); if (!(await this.adb.ensureCurrentLocale(language, country, script))) { throw new Error('Locale verification has failed'); } } catch (e) { this.log.debug(e.stack); let errMsg = `Cannot set the device locale to '${toLocaleAbbr({ language, country, script })}'.`; /** @type {string[]} */ let suggestions = []; try { suggestions = (await fetchLocaleSuggestions.bind(this)(language, country)).map(toLocaleAbbr); } catch (e1) { this.log.debug(e1.stack); } if (!lodash_1.default.isEmpty(suggestions)) { errMsg += ` You may want to apply one of the following locales instead: ${suggestions}`; } throw new Error(errMsg); } } // #region Internal helpers /** * @this {import('../driver').AndroidDriver} * @param {string?} [language] * @param {import('../driver').AndroidDriverOpts?} [opts=null] * @returns {Promise<import('@appium/types').StringRecord>}; */ async function extractStringsFromResources(language, opts = null) { const caps = opts ?? this.opts; /** @type {string|undefined} */ let app = caps.app; let tmpRoot; try { if (!app && caps.appPackage) { tmpRoot = await support_1.tempDir.openDir(); try { app = await this.adb.pullApk(caps.appPackage, tmpRoot); } catch (e) { throw new Error(`Could not extract app strings, failed to pull an apk from '${caps.appPackage}'. Original error: ${e.message}`); } } if (!app || !(await support_1.fs.exists(app))) { throw new Error(`Could not extract app strings, no app or package specified`); } return (await this.adb.extractStringsFromApk(app, language ?? null)).apkStrings; } finally { if (tmpRoot) { await support_1.fs.rimraf(tmpRoot); } } } /** * @typedef {Object} Locale * @property {string} language * @property {string} country * @property {string} [script] */ /** * @this {import('../driver').AndroidDriver} * @param {string} [language] * @param {string} [country] * @returns {Promise<Locale[]>} */ async function fetchLocaleSuggestions(language, country) { const supportedLocales = await this.settingsApp.listSupportedLocales(); const suggestedLocales = supportedLocales .filter((locale) => lodash_1.default.toLower(language) === lodash_1.default.toLower(locale.language) || lodash_1.default.toLower(country) === lodash_1.default.toLower(locale.country)); return lodash_1.default.isEmpty(suggestedLocales) ? supportedLocales : suggestedLocales; } /** * * @param {Locale} locale * @returns {string} */ function toLocaleAbbr({ language, country, script }) { return `${language}_${country}${script ? ('-' + script) : ''}`; } // #endregion /** * @typedef {import('appium-adb').ADB} ADB */ //# sourceMappingURL=resources.js.map