diff --git a/app.js b/app.js index 8fa6c87..7905d05 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,4 @@ const pages = require('./pages/pages') + pages.connectWatch(); diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 0000000..f10a566 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,31 @@ +{ + "main_menu_question": "What do you want to do?", + "main_menu_item_1": "1-Click Karl0ss Klean", + "main_menu_item_2": "Remove Xiaomi Apps", + "main_menu_item_3": "Restore Xiaomi Apps", + "main_menu_item_4": "Install Compatible Apps", + "main_menu_item_5": "Restore ANY app", + "main_menu_item_6": "Batch Install APKs", + "main_menu_item_7": "Batch Remove Installed Apps", + "main_menu_item_8": "Quit", + "connection_type_message": "How do you want to connect?", + "connect_wifi_message":"What is your MiWatch IpAdress?", + "restore_app_message": "What apps do you want to restore?", + "install_compatible_apps_message": "What apps do you want to Install?", + "remove_installed_apps_message": "What Installed apps do you want to remove?", + "restore_any_app_message": "What App do you want to restore?", + "remove_installed_apps_header": "Remove Installed Apps", + "packages_recieved_from_watch": "Packages recieved from watch", + "device_not_authorised": "Device not authorised", + "restarting_adb": "Restarting ADB", + "please_reconnect_to_watch": "Please reconnect to watch", + "remove_installed_apps_failed": "Remove Installed Apps Failed", + "removing": "Removing", + "installing": "Installing", + "remove_selected_user_apps": "Removed Selected User Apps", + "install_compatible_apps_header": "Install Compatible Apps", + "simple_weather_activated_on_watch": "simpleWeather Activated On Watch", + "morelocale_activated_on_watch": "moreLocale Activated On Watch", + "alberto_locale_activated_on_watch": "Alberto Locale Activated On Watch", + "compatible_apps_installed": "Compatible Apps Installed" +} \ No newline at end of file diff --git a/lib/adb.js b/lib/adb.js index e2d6e10..a325b89 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -1,24 +1,85 @@ const gfin = require('get-files-in') +const logger = require('perfect-logger'); const shellExec = require('shell-exec') +const Language = require("@shypes/language-translator"); +const inquirer = require('../lib/inquirer'); +const common = require('./common') + + +if (process.platform === 'win32' || process.platform === 'win64') { + adbRun = 'adb' +} else { + adbRun = './adb' +} module.exports = { getListOfAPk: () => { - this.apkListToInstall = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false) + const result = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false) + return result }, - installApk: async () => { - await module.exports.getListOfAPk() - for (let element of this.apkListToInstall) { - if (process.platform === 'win32' || process.platform === 'win64') { - await shellExec('adb install -r ' + element).then(function (result) { - console.log('Installing ' + element + ' - ' + result.stdout); - }); - } else { - await shellExec('./adb install -r ' + element).then(function (result) { - console.log('Installing ' + element + ' - ' + result.stdout); + installApk: async (element) => { + result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) { + if (result.stderr != '') { + logger.info(await Language.get('device_not_authorised')); + console.log(chalk.redBright(await Language.get('device_not_authorised'))); + } + console.log(element + ' - ' + result.stdout); + logger.info(element + ' - ' + result.stdout); + + if (element === "data\\apps\\simpleweather_base.apk") { + await common.downloadFile('http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/Others/simpleweather_split_config.armeabi_v7a.apk', './data/apps/simpleweather_split_config.armeabi_v7a.apk') + await common.downloadFile('http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/Others/simpleweather_split_config.xhdpi.apk', './data/apps/simpleweather_split_config.xhdpi.apk') + await shellExec(adbRun + ' install-multiple "data\\apps\\simpleweather_base.apk" "data\\apps\\simpleweather_split_config.armeabi_v7a.apk" "data\\apps\\simpleweather_split_config.xhdpi.apk"').then(async function (result) { + console.log(result) + console.log(await Language.get('simple_weather_activated_on_watch')); + logger.info(await Language.get('simple_weather_activated_on_watch')); + }) + } + if (element === "data\\apps\\MoreLocale.apk") { + await shellExec(adbRun + ' shell pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION').then(async function (result) { + console.log(await Language.get('morelocale_activated_on_watch')); + logger.info(await Language.get('morelocale_activated_on_watch')); + }) + } + if (element === "data\\apps\\com.alberto.locale.apk") { + await shellExec(adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION && ' + adbRun + ' shell am start -n com.alberto.locale/com.alberto.locale.MainActivity && ' + adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION').then(async function (result) { + console.log(result) + console.log(await Language.get('alberto_locale_activated_on_watch')); + logger.info(await Language.get('alberto_locale_activated_on_watch')); }); } - } - // console.log(chalk.green('Removal Complete')) + }); + }, + removeApk: async (package) => { + result = await shellExec(adbRun + ' uninstall ' + package) + console.log(package + ' - ' + result.stdout); + logger.info(package + ' - ' + result.stdout); + }, + getInstalledPacakges: async () => { + result = await shellExec(adbRun + ' shell pm list packages -3') + logger.info(await Language.get('packages_recieved_from_watch')) + if (result.stderr.includes('error')) { + logger.info(result.stderr) + console.log(chalk.red(await Language.get('device_not_authorised'))) + common.pause(3000) + await shellExec(adbRun + ' kill-server').then(async function (result) { + logger.info(await Language.get('restarting_adb')) + logger.info(result.stdout) + console.log(await Language.get('please_reconnect_to_watch')) + common.pause(3000) + logger.info(await Language.get('remove_installed_apps_failed')) + module.exports.mainMenu() + }) + } else { + if (process.platform === 'win32' || process.platform === 'win64') { + installedAppList = result.stdout.split('\r\n'); // split string on comma space + installedAppList.splice(-1, 1) + } else { + installedAppList = result.stdout.split('\n'); // split string on comma space + installedAppList.splice(-1, 1) + } + const value = await inquirer.installedApps(installedAppList); + return value + } }, - }; \ No newline at end of file diff --git a/lib/inquirer.js b/lib/inquirer.js index 8fa8aca..e96e8fa 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -2,36 +2,42 @@ const inquirer = require("inquirer"); const files = require("./files"); const common = require("./common"); -// let compatibleApps +const Language = require("@shypes/language-translator"); + +Language._({ + default_lang: "en", + ext: ".json", + __basedir: "./", + langFolder: 'lang' +}) module.exports = { - mainMenu: () => { + mainMenu: async () => { const questions = [{ type: "list", name: "mainMenu", - message: "What do you want to do?", + message: await Language.get('main_menu_question'), choices: [ - // "Connect to MiWatch", - "1-Click Karl0ss Klean", - "Remove Xiaomi Apps", - "Restore Xiaomi Apps", - "Install Compatible Apps", - "Restore ANY app", - "Batch Install APKs", - "Batch Remove Installed Apps", - "Quit" + await Language.get('main_menu_item_1'), + await Language.get('main_menu_item_2'), + await Language.get('main_menu_item_3'), + await Language.get('main_menu_item_4'), + await Language.get('main_menu_item_5'), + await Language.get('main_menu_item_6'), + await Language.get('main_menu_item_7'), + await Language.get('main_menu_item_8'), ], filter: function (val) { return val.toLowerCase(); }, - }, ]; + },]; return inquirer.prompt(questions); }, - connectionType: () => { + connectionType: async () => { const questions = [{ type: "list", name: "connection", - message: "How do you want to connect?", + message: await Language.get('connection_type_message'), choices: [ "USB", "Wifi" @@ -39,15 +45,15 @@ module.exports = { filter: function (val) { return val.toLowerCase(); }, - }, ]; + },]; return inquirer.prompt(questions); }, - connectWifi: () => { + connectWifi: async () => { const questions = [{ type: "input", name: "connectWifi", - message: "What is your MiWatch IpAdress?", - }, ]; + message: await Language.get('connect_wifi_message'), + },]; return inquirer.prompt(questions); }, removeAppsList: async () => { @@ -56,9 +62,9 @@ module.exports = { const questions = [{ type: "checkbox", name: "removeAppsList", - message: "What apps do you want to restore?", + message: await Language.get('restore_app_message'), choices: packages.apps, - }, ]; + },]; return inquirer.prompt(questions); }, compatibleApps: async () => { @@ -70,26 +76,26 @@ module.exports = { const questions = [{ type: "checkbox", name: "removeAppsList", - message: "What apps do you want to Install?", + message: await Language.get('install_compatible_apps_message'), choices: appList, - }, ]; + },]; return inquirer.prompt(questions); }, installedApps: async (installedApps) => { const questions = [{ type: "checkbox", name: "removeAppsList", - message: "What Installed apps do you want to remove?", + message: await Language.get('remove_installed_apps_message'), choices: installedApps, - }, ]; + },]; return inquirer.prompt(questions); }, restoreAnyApp: async () => { const questions = [{ type: "input", name: "restoreAnyApp", - message: "What App do you want to restore?", - }, ]; + message: await Language.get('restore_any_app_message'), + },]; return inquirer.prompt(questions); }, }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dcc7e45..d1f411f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,11 @@ "resolved": "https://registry.npmjs.org/@peterpanhihi/tiny/-/tiny-2.0.0.tgz", "integrity": "sha512-usAoksj49559JLAsQXmrE5wOV6A055icErp8jpJDCicfojwEVPaSLk5EZ1EXhcgIuqjSNkzCOXu0gSdm3Std+w==" }, + "@shypes/language-translator": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@shypes/language-translator/-/language-translator-2.0.15.tgz", + "integrity": "sha512-et4HsjzPQUH29nPKlRg3E/2Dr84lO8POJsfWezK9DnLK8nGO42b59Ug7RtwsRy28gxHWr+m1lgzY8JKsVlTlSQ==" + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -254,14 +259,6 @@ "assert-plus": "^1.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -880,11 +877,6 @@ "minimist": "^1.2.5" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "multistream": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", @@ -1100,14 +1092,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "rename": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rename/-/rename-1.0.4.tgz", - "integrity": "sha1-oPJQePpBleZQ9zBQx8Esz2ifQws=", - "requires": { - "debug": "^2.5.2" - } - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", diff --git a/package.json b/package.json index 7d09ed4..82c7a2b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "license": "ISC", "dependencies": { "@peterpanhihi/tiny": "^2.0.0", + "@shypes/language-translator": "^2.0.15", "chalk": "^4.0.0", "clear": "^0.1.0", "clui": "^0.3.6", diff --git a/pages/pages.js b/pages/pages.js index 9d029e5..201364b 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -6,7 +6,8 @@ const files = require('../lib/files') const getFilesIn = require('get-files-in') let logger = require('perfect-logger'); const globalVariables = require('../lib/globalVars'); - +const Language = require("@shypes/language-translator"); +const adb = require('../lib/adb'); logger.info(process.platform + " detected") if (process.platform === 'win32' || process.platform === 'win64') { @@ -23,52 +24,26 @@ logger.initialize('RunTIme', { module.exports = { removeCompatibleApps: async () => { - let installedAppList - common.header('Remove Installed Apps') - logger.info('Remove Installed Apps') - await shellExec(adbRun + ' shell pm list packages -3').then(async function (result) { - logger.info('Packages recieved from watch') - if (result.stderr.includes('error')) { - logger.info(result.stderr) - console.log(chalk.red('Device not authorised')) - common.pause(3000) - await shellExec(adbRun + ' kill-server').then(async function (result) { - logger.info('Restarting ADB') - logger.info(result.stdout) - console.log('Please reconnect to watch') - common.pause(3000) - logger.info('Remove Installed Apps Failed') - module.exports.mainMenu() - }) - } else { - if (process.platform === 'win32' || process.platform === 'win64') { - installedAppList = result.stdout.split('\r\n'); // split string on comma space - installedAppList.splice(-1, 1) - } else { - installedAppList = result.stdout.split('\n'); // split string on comma space - installedAppList.splice(-1, 1) - } - const value = await inquirer.installedApps(installedAppList); + common.header(await Language.get('remove_installed_apps_header')) + logger.info(await Language.get('remove_installed_apps_header')) - for (let element of value.removeAppsList) { - console.log('Removing ' + element) - logger.info('Removing ' + element) - const package = element.substring(8) - await shellExec(adbRun + ' uninstall ' + package).then(async function (result) { - console.log(element + ' - ' + result.stdout); - logger.info(element + ' - ' + result.stdout); - }); - } - console.log(chalk.green('Removed Selected User Apps')) - logger.info('Removed Selected User Apps') - await common.pause(2000) - module.exports.mainMenu() - } - }) + value = await adb.getInstalledPacakges() + + for (let element of value.removeAppsList) { + console.log(await Language.get('removing') + ' ' + element) + logger.info(await Language.get('removing') + ' ' + element) + const package = element.substring(8) + await adb.removeApk(package) + } + console.log(chalk.green(await Language.get('remove_selected_user_apps'))) + logger.info(await Language.get('remove_selected_user_apps')) + await common.pause(2000) + module.exports.mainMenu() + }, compatibleApps: async () => { - logger.info("Compatible Apps") - common.header('Install Compatible Apps') + logger.info(await Language.get('install_compatible_apps_header')) + common.header(await Language.get('install_compatible_apps_header')) const compatibleApps = await common.getCompatibleAppsList() const value = await inquirer.compatibleApps(); @@ -84,45 +59,15 @@ module.exports = { } } - const apkList = await getFilesIn('./data/apps', matchFiletypes = ['apk'], checkSubDirectories = false) + const apkList = await adb.getListOfAPk() for (let element of apkList) { - console.log('Installing ' + element) - logger.info('Installing ' + element) - await shellExec(adbRun + ' install -r ' + element).then(async function (result) { - if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); - } - console.log(element + ' - ' + result.stdout); - logger.info(element + ' - ' + result.stdout); - - if (element === "data\\apps\\simpleweather_base.apk") { - await common.downloadFile('http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/Others/simpleweather_split_config.armeabi_v7a.apk', './data/apps/simpleweather_split_config.armeabi_v7a.apk') - await common.downloadFile('http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/Others/simpleweather_split_config.xhdpi.apk', './data/apps/simpleweather_split_config.xhdpi.apk') - await shellExec(adbRun + ' install-multiple "data\\apps\\simpleweather_base.apk" "data\\apps\\simpleweather_split_config.armeabi_v7a.apk" "data\\apps\\simpleweather_split_config.xhdpi.apk"').then(function (result) { - console.log(result) - console.log('simpleWeather Activated On Watch'); - logger.info('simpleWeather Activated On Watch'); - }) - } - if (element === "data\\apps\\MoreLocale.apk") { - await shellExec(adbRun + ' shell pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION').then(function (result) { - console.log('moreLocale Activated On Watch'); - logger.info('moreLocale Activated On Watch'); - }) - } - if (element === "data\\apps\\com.alberto.locale.apk") { - await shellExec(adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION && ' + adbRun + ' shell am start -n com.alberto.locale/com.alberto.locale.MainActivity && ' + adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION').then(function (result) { - console.log(result) - console.log('Alberto Locale Activated On Watch'); - logger.info('Alberto Locale Activated On Watch'); - }); - } - }); + console.log(await Language.get('installing') + ' ' + element) + logger.info(await Language.get('installing') + ' ' + element) + await adb.installApk(element) } - console.log(chalk.green('Compatible Apps Installed')) - logger.info('Compatible Apps Installed') + console.log(chalk.green(await Language.get('compatible_apps_installed'))) + logger.info(await Language.get('compatible_apps_installed')) await common.pause(2000) module.exports.mainMenu() },