From 73ee55d91389ae8b1395a28b2b8a6fa5a4d37be1 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 13:03:24 +0100 Subject: [PATCH 01/14] making progress --- app.js | 1 + lang/en.json | 31 ++++++++++++++ lib/adb.js | 89 ++++++++++++++++++++++++++++++++------- lib/inquirer.js | 60 ++++++++++++++------------ package-lock.json | 26 +++--------- package.json | 1 + pages/pages.js | 105 +++++++++++----------------------------------- 7 files changed, 171 insertions(+), 142 deletions(-) create mode 100644 lang/en.json 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() }, From 1c47cbcd023de915afb7ab8b4f4e06ee89ef2620 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 15:29:38 +0100 Subject: [PATCH 02/14] lost of deduplication and code cleanup --- data/xiaomiPackageRemovalList.json | 2 - lang/en.json | 1 + lib/adb.js | 103 +++++++++++++++-- lib/files.js | 9 +- pages/pages.js | 179 +++++++---------------------- 5 files changed, 143 insertions(+), 151 deletions(-) diff --git a/data/xiaomiPackageRemovalList.json b/data/xiaomiPackageRemovalList.json index fa90384..57be1cf 100644 --- a/data/xiaomiPackageRemovalList.json +++ b/data/xiaomiPackageRemovalList.json @@ -1,7 +1,6 @@ { "apps": [ "com.android.messaging", - "com.eg.android.AlipayGphone", "com.google.android.clockwork.flashlight", "com.google.android.clockwork.gestures.tutorial", "com.google.android.clockwork.lesetup", @@ -12,7 +11,6 @@ "com.google.android.wearable.overlay.common.baiji", "com.google.android.wearable.overlay.helium.baiji", "com.google.android.wearable.overlay.home.baiji", - "com.google.android.wearable.overlay.home.baiji", "com.google.android.wearable.overlay.home.baiji.tiles", "com.gotokeep.keep", "com.onetrack.watch", diff --git a/lang/en.json b/lang/en.json index f10a566..3c914d4 100644 --- a/lang/en.json +++ b/lang/en.json @@ -22,6 +22,7 @@ "remove_installed_apps_failed": "Remove Installed Apps Failed", "removing": "Removing", "installing": "Installing", + "restoring": "Restoring", "remove_selected_user_apps": "Removed Selected User Apps", "install_compatible_apps_header": "Install Compatible Apps", "simple_weather_activated_on_watch": "simpleWeather Activated On Watch", diff --git a/lib/adb.js b/lib/adb.js index a325b89..66eda04 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -4,7 +4,9 @@ const shellExec = require('shell-exec') const Language = require("@shypes/language-translator"); const inquirer = require('../lib/inquirer'); const common = require('./common') - +const chalk = require('chalk'); +const globalVariables = require('../lib/globalVars'); +const { removeAppsList } = require('../lib/inquirer'); if (process.platform === 'win32' || process.platform === 'win64') { adbRun = 'adb' @@ -13,10 +15,6 @@ if (process.platform === 'win32' || process.platform === 'win64') { } module.exports = { - getListOfAPk: () => { - const result = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false) - return result - }, installApk: async (element) => { result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) { if (result.stderr != '') { @@ -52,8 +50,46 @@ module.exports = { }, removeApk: async (package) => { result = await shellExec(adbRun + ' uninstall ' + package) - console.log(package + ' - ' + result.stdout); - logger.info(package + ' - ' + result.stdout); + if (result.stderr != '') { + logger.info('Error ' + result.stderr); + console.log(chalk.redBright('Error - Device not authorised')); + } else { + logger.info('Removing ' + package + ' - ' + result.stdout); + console.log('Removing ' + package + ' - ' + result.stdout); + } + }, + removeXiaomiApk: async (package) => { + result = await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + package) + if (result.stderr != '') { + logger.info('Error ' + result.stderr); + console.log(chalk.redBright('Error - Device not authorised')); + } else { + logger.info('Removing ' + package + ' - ' + result.stdout); + console.log('Removing ' + package + ' - ' + result.stdout); + } + }, + restoreXiaomiApk: async (package) => { + result = await shellExec(adbRun + ' shell cmd package install-existing ' + package) + if (result.stderr != '') { + logger.info('Error ' + result.stderr); + console.log(chalk.redBright('Error - Device not authorised')); + } else { + logger.info('Removing ' + package + ' - ' + result.stdout); + console.log('Removing ' + package + ' - ' + result.stdout); + } + }, + restoreAnyApk: async (package) => { + result = await shellExec(adbRun + ' shell cmd package install-existing ' + package.restoreAnyApp) + if (result.stderr != '') { + logger.info('Error ' + result.stderr); + console.log(chalk.redBright('Error - Device not authorised')); + } else if (result.stdout.includes('doesn\'t exist')) { + logger.info(result.stdout); + console.log(chalk.redBright(result.stdout)); + } else { + logger.info('Restoring ' + package.restoreAnyApp + ' - ' + result.stdout); + console.log('Restoring ' + package.restoreAnyApp + ' - ' + result.stdout); + } }, getInstalledPacakges: async () => { result = await shellExec(adbRun + ' shell pm list packages -3') @@ -82,4 +118,57 @@ module.exports = { return value } }, + killAdbServer: async () => { + let result = await shellExec(adbRun + ' kill-server') + logger.info('Restarting ADB') + logger.info(result.stdout) + }, + watchConnection: async (value) => { + if (value.connection === "usb") { + await module.exports.killAdbServer() + result = await shellExec(adbRun + ' devices') + console.log(result.stdout) + if (result.stdout.includes('device', 15)) { + console.log(chalk.green('MiWatch Connected via USB')) + await common.pause(3000) + logger.info("MiWatch connected") + globalVariables.localUSB = "X" + return true + } else { + console.log(chalk.red('MiWatch not found')) + logger.info("MiWatch not found") + await common.pause(2000) + console.log(chalk.white('Try Again')) + await common.pause(1000) + return false + } + } + if (value.connection === "wifi") { + const value = await inquirer.connectWifi(); + await module.exports.killAdbServer() + result = await shellExec(adbRun + ' connect ' + value.connectWifi) + logger.info("Connect Wifi Result " + result.stdout) + if (result.stdout.includes('already connected') || result.stdout.includes('connected to ')) { + console.log(chalk.green('MiWatch Connected')) + globalVariables.localUSB = "" + globalVariables.miWatchIpaddress = value.connectWifi + await common.pause(3000) + logger.info("Connect Wifi Complete") + return true + } else { + if (result.stdout.includes('failed to authenticate')) { + console.log(chalk.redBright('MiWatch not authenticated')) + logger.info('MiWatch not authenticated') + return false + } else { + console.log(chalk.red(result.stdout)) + logger.info(result.stdout) + } + await common.pause(2000) + console.log(chalk.white('Try Again')) + await common.pause(1000) + return false + } + } + } }; \ No newline at end of file diff --git a/lib/files.js b/lib/files.js index dd10bd6..fe73b90 100644 --- a/lib/files.js +++ b/lib/files.js @@ -1,7 +1,8 @@ const fs = require('fs'); const path = require('path'); const tiny = require("@peterpanhihi/tiny"); -const { resolve } = require('path'); +const getFilesIn = require('get-files-in') + module.exports = { getCurrentDirectoryBase: () => { @@ -39,5 +40,9 @@ module.exports = { } resolve(x / y); }).catch(err => NaN) - } + }, + getListOfAPk: (path) => { + const result = getFilesIn(path, matchFiletypes = ["apk"], checkSubDirectories = false) + return result + }, } \ No newline at end of file diff --git a/pages/pages.js b/pages/pages.js index 201364b..a55cb5a 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -1,11 +1,8 @@ const chalk = require('chalk'); const common = require('../lib/common'); const inquirer = require('../lib/inquirer'); -const shellExec = require('shell-exec') const files = require('../lib/files') -const getFilesIn = require('get-files-in') -let logger = require('perfect-logger'); -const globalVariables = require('../lib/globalVars'); +const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); const adb = require('../lib/adb'); @@ -30,18 +27,18 @@ module.exports = { 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(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 () => { + installCompatibleApps: async () => { logger.info(await Language.get('install_compatible_apps_header')) common.header(await Language.get('install_compatible_apps_header')) @@ -59,12 +56,12 @@ module.exports = { } } - const apkList = await adb.getListOfAPk() + const apkList = await files.getListOfAPk('./data/apps') - for (let element of apkList) { - console.log(await Language.get('installing') + ' ' + element) - logger.info(await Language.get('installing') + ' ' + element) - await adb.installApk(element) + for (let package of apkList) { + console.log(await Language.get('installing') + ' ' + package) + logger.info(await Language.get('installing') + ' ' + package) + await adb.installApk(package) } console.log(chalk.green(await Language.get('compatible_apps_installed'))) logger.info(await Language.get('compatible_apps_installed')) @@ -75,17 +72,8 @@ module.exports = { logger.info("Remove Apps") common.header('Remove Apps') const value = await inquirer.removeAppsList(); - for (let element of value.removeAppsList) { - // await shellExec(adbRun + ' shell pm disable-user --0 ' + element).then(function (result) { - await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + element).then(function (result) { - if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); - } else { - logger.info('Removing ' + element + ' - ' + result.stdout); - console.log('Removing ' + element + ' - ' + result.stdout); - } - }); + for (let package of value.removeAppsList) { + await adb.removeXiaomiApk(package) } console.log(chalk.green('Removal Complete')) await common.pause(2000) @@ -96,16 +84,8 @@ module.exports = { logger.info("Restore Apps") common.header('Restore Apps') const value = await inquirer.removeAppsList(); - for (let element of value.removeAppsList) { - await shellExec(adbRun + ' shell cmd package install-existing ' + element).then(function (result) { - if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); - } else { - logger.info('Restoring ' + element + ' - ' + result.stdout); - console.log('Restoring ' + element + ' - ' + result.stdout); - } - }); + for (let package of value.removeAppsList) { + await adb.restoreXiaomiApk(package) } console.log(chalk.green('Restore Complete')) await common.pause(2000) @@ -116,74 +96,19 @@ module.exports = { logger.info("Connect to watch") common.header('Connect to watch') const value = await inquirer.connectionType() - if (value.connection === "usb") { - await shellExec(adbRun + ' kill-server').then(async function (result) { - logger.info('Restarting ADB') - logger.info(result.stdout) - }) - await shellExec(adbRun + ' devices').then(async function (result) { - console.log(result.stdout) - if (result.stdout.includes('device', 15)) { - console.log(chalk.green('MiWatch Connected via USB')) - await common.pause(3000) - logger.info("MiWatch connected") - globalVariables.localUSB = "X" - module.exports.mainMenu() - } else { - console.log(chalk.red('MiWatch not found')) - logger.info("MiWatch not found") - await common.pause(2000) - console.log(chalk.white('Try Again')) - await common.pause(1000) - module.exports.connectWatch() - } - }) - } - if (value.connection === "wifi") { - const value = await inquirer.connectWifi(); - await shellExec(adbRun + ' kill-server').then(async function (result) { - logger.info('Restarting ADB') - logger.info(result.stdout) - }) - await shellExec(adbRun + ' connect ' + value.connectWifi).then(async function (result) { - logger.info("Connect Wifi Result " + result.stdout) - if (result.stdout.includes('already connected') || result.stdout.includes('connected to ')) { - console.log(chalk.green('MiWatch Connected')) - globalVariables.localUSB = "" - globalVariables.miWatchIpaddress = value.connectWifi - await common.pause(3000) - logger.info("Connect Wifi Complete") - module.exports.mainMenu() - } else { - if (result.stdout.includes('failed to authenticate')) { - console.log(chalk.redBright('MiWatch not authenticated')) - logger.info('MiWatch not authenticated') - } else { - console.log(chalk.red(result.stdout)) - logger.info(result.stdout) - } - await common.pause(2000) - console.log(chalk.white('Try Again')) - await common.pause(1000) - module.exports.connectWatch() - } - }).catch() + connected = await adb.watchConnection(value) + if (connected != true) { + module.exports.connectWatch() + } else { + module.exports.mainMenu() } }, oneClick: async () => { logger.info("1-Click Karl0ss Klean") common.header('1-Click Karl0ss Klean') const removalPackagesList = files.loadPackageList() - for (let element of removalPackagesList.apps) { - await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + element).then(function (result) { - if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); - } else { - logger.info('Removing ' + element + ' - ' + result.stdout); - console.log('Removing ' + element + ' - ' + result.stdout); - } - }); + for (let package of removalPackagesList.apps) { + await adb.removeXiaomiApk(package) } console.log(chalk.green('Removal Complete')) await common.pause(2000) @@ -193,33 +118,24 @@ module.exports = { await common.clearApkFolder() const compatibleApps = await common.getCompatibleAppsList() + console.log(chalk.green('Download Compatible APKS')) - for (const element of compatibleApps) { - if (element.Klean === "X") { + for (const package of compatibleApps) { + if (package.Klean === "X") { try { - logger.info('Downloading Latest ' + element.name + ' Complete') - newName = element.name.replace(/\s/g, ''); - await common.downloadFile(element.url, './data/apps/' + newName + '.apk') - logger.info('Downloading Latest ' + element.name + ' Complete') + newPacakgeName = package.name.replace(/\s/g, ''); + await common.downloadFile(package.url, './data/apps/' + newPacakgeName + '.apk') + logger.info('Downloading Latest ' + package.name + ' Complete') + console.log('Downloading Latest ' + package.name + ' Complete') } catch (error) { - logger.info('Downloading Latest ' + element.name + ' FAILED') + logger.info('Downloading Latest ' + package.name + ' FAILED') } } } - const apkList = await getFilesIn('./data/apps', matchFiletypes = ['apk'], checkSubDirectories = false) - + const apkList = await files.getListOfAPk('./data/apps') + console.log(chalk.green('Install Apks')) 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); - - }); + await adb.installApk(element) } console.log(chalk.green('Compatible Apps Installed')) logger.info('Compatible Apps Installed') @@ -230,15 +146,7 @@ module.exports = { logger.info("Restore Any App") common.header('Restore Any App') const value = await inquirer.restoreAnyApp(); - await shellExec(adbRun + ' shell cmd package install-existing ' + value.restoreAnyApp).then(function (result) { - if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); - } else { - logger.info('Restoring ' + value.restoreAnyApp + ' - ' + result.stdout); - console.log('Restoring ' + value.restoreAnyApp + ' - ' + result.stdout); - } - }); + await adb.restoreAnyApk(value) console.log(chalk.green('Restore Complete')) await common.pause(2000) logger.info("App Restore Complete") @@ -247,24 +155,15 @@ module.exports = { batchInstallApks: async () => { logger.info("Batch Install Apks") common.header('Batch Install Apks') - - let apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false) + let apkList = await files.getListOfAPk('./my_apk/') await files.renameLocalApk(apkList) - - apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false) + apkList = await files.getListOfAPk('./my_apk/') 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(result.stderr)); - } - console.log(element + ' - ' + result.stdout); - logger.info(element + ' - ' + result.stdout); - }); + await adb.installApk(element) } console.log(chalk.green('Batch Install Apks Completed')) logger.info('Batch Install Apks Completed') @@ -288,7 +187,7 @@ module.exports = { module.exports.restoreApps() break; case 'install compatible apps': - module.exports.compatibleApps() + module.exports.installCompatibleApps() break; case 'batch remove installed apps': module.exports.removeCompatibleApps() From a5b71281b3cd05d44410fc77cd31e9021063057a Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 15:30:27 +0100 Subject: [PATCH 03/14] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 157495e..a09e2b1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ data/*.log logger.lock null.log .gitignore +my_apk/*.apk \ No newline at end of file From 688167f88e159bf6a7cd1cf6dcf807a7a7344a76 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 16:59:05 +0100 Subject: [PATCH 04/14] reworking for multilingual --- app.js | 1 - lang/en.json | 62 ++++++++------ lib/adb.js | 26 +++--- lib/common.js | 29 ++++++- lib/inquirer.js | 30 +++---- pages/pages.js | 215 +++++++++++++++++++++++++----------------------- 6 files changed, 203 insertions(+), 160 deletions(-) diff --git a/app.js b/app.js index 7905d05..8fa6c87 100644 --- a/app.js +++ b/app.js @@ -1,4 +1,3 @@ const pages = require('./pages/pages') - pages.connectWatch(); diff --git a/lang/en.json b/lang/en.json index 3c914d4..a865a8e 100644 --- a/lang/en.json +++ b/lang/en.json @@ -1,32 +1,40 @@ { - "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", + "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?", + "header-remove-installed-apps": "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", + "removal-complete": "Removal Complete", "installing": "Installing", "restoring": "Restoring", - "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" + "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", + "compatible-apps": "Compatible Apps", + "remove-xiaomi-apps": "Remove Xiaomi Apps", + "downloading-compatible-apps": "Downloading Compatible Apps", + "installing-apps": "Installing Apps", + "downloading-latest": "Downloading Latest", + "complete": "Complete", + "failed": "Failed" } \ No newline at end of file diff --git a/lib/adb.js b/lib/adb.js index 66eda04..13f9a4b 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -18,8 +18,8 @@ module.exports = { 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'))); + 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); @@ -29,21 +29,21 @@ module.exports = { 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')); + 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')); + 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(await Language.get('alberto-locale-activated-on-watch')); + logger.info(await Language.get('alberto-locale-activated-on-watch')); }); } }); @@ -93,17 +93,17 @@ module.exports = { }, getInstalledPacakges: async () => { result = await shellExec(adbRun + ' shell pm list packages -3') - logger.info(await Language.get('packages_recieved_from_watch')) + 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'))) + 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(await Language.get('restarting-adb')) logger.info(result.stdout) - console.log(await Language.get('please_reconnect_to_watch')) + console.log(await Language.get('please-reconnect-to-watch')) common.pause(3000) - logger.info(await Language.get('remove_installed_apps_failed')) + logger.info(await Language.get('remove-installed-apps-failed')) module.exports.mainMenu() }) } else { diff --git a/lib/common.js b/lib/common.js index c187484..6dfd52d 100644 --- a/lib/common.js +++ b/lib/common.js @@ -5,11 +5,13 @@ const fs = require('fs') var pjson = require('../package.json'); const fetch = require('node-fetch'); var shell = require('shelljs'); +const logger = require('perfect-logger'); +const Language = require("@shypes/language-translator"); const globalVariables = require('../lib/globalVars'); module.exports = { - header: (page) => { + header: async (page) => { clear(); console.log( chalk.red( @@ -26,7 +28,7 @@ module.exports = { '-------------------------------------------------------------------------------------------------------' ) ) - console.log(chalk.blue(page)) + console.log(chalk.blue(await Language.get(page))) module.exports.connectionCheck() console.log(chalk.red('----------')) }, @@ -66,4 +68,27 @@ module.exports = { clearApkFolder: async () => { await shell.rm('-rf', './data/apps/*.apk'); }, + log: async (item) => { + logger.info(await Language.get(item, 'en')) + }, + print: async (item, colour) => { + switch (colour) { + case 'green': + console.log(chalk.green(await Language.get(item))) + break; + case 'red': + console.log(chalk.redBright(await Language.get(item))) + break; + case 'whiteBright': + console.log(chalk.whiteBright(await Language.get(item))) + break; + default: + console.log(chalk.white(await Language.get(item))) + break; + } + }, + dualLog: async (item, colour) => { + await module.exports.log(item) + await module.exports.print(item, colour) + } } \ No newline at end of file diff --git a/lib/inquirer.js b/lib/inquirer.js index e96e8fa..aa3e392 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -16,16 +16,16 @@ module.exports = { const questions = [{ type: "list", name: "mainMenu", - message: await Language.get('main_menu_question'), + message: await Language.get('main-menu-question'), choices: [ - 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'), + 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(); @@ -37,7 +37,7 @@ module.exports = { const questions = [{ type: "list", name: "connection", - message: await Language.get('connection_type_message'), + message: await Language.get('connection-type-message'), choices: [ "USB", "Wifi" @@ -52,7 +52,7 @@ module.exports = { const questions = [{ type: "input", name: "connectWifi", - message: await Language.get('connect_wifi_message'), + message: await Language.get('connect-wifi-message'), },]; return inquirer.prompt(questions); }, @@ -62,7 +62,7 @@ module.exports = { const questions = [{ type: "checkbox", name: "removeAppsList", - message: await Language.get('restore_app_message'), + message: await Language.get('restore-app-message'), choices: packages.apps, },]; return inquirer.prompt(questions); @@ -76,7 +76,7 @@ module.exports = { const questions = [{ type: "checkbox", name: "removeAppsList", - message: await Language.get('install_compatible_apps_message'), + message: await Language.get('install-compatible-apps-message'), choices: appList, },]; return inquirer.prompt(questions); @@ -85,7 +85,7 @@ module.exports = { const questions = [{ type: "checkbox", name: "removeAppsList", - message: await Language.get('remove_installed_apps_message'), + message: await Language.get('remove-installed-apps-message'), choices: installedApps, },]; return inquirer.prompt(questions); @@ -94,7 +94,7 @@ module.exports = { const questions = [{ type: "input", name: "restoreAnyApp", - message: await Language.get('restore_any_app_message'), + message: await Language.get('restore-any-app-message'), },]; return inquirer.prompt(questions); }, diff --git a/pages/pages.js b/pages/pages.js index a55cb5a..371dd39 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -20,27 +20,78 @@ logger.initialize('RunTIme', { }); module.exports = { - removeCompatibleApps: async () => { - common.header(await Language.get('remove_installed_apps_header')) - logger.info(await Language.get('remove_installed_apps_header')) - - 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) + oneClick: async () => { + common.log('main-menu-item-1') + common.header('main-menu-item-1') + common.print('remove-xiaomi-apps', 'whiteBright') + const removalPackagesList = files.loadPackageList() + for (let package of removalPackagesList.apps) { + await adb.removeXiaomiApk(package) } - console.log(chalk.green(await Language.get('remove_selected_user_apps'))) - logger.info(await Language.get('remove_selected_user_apps')) + common.print('removal-complete', 'green') + await common.pause(2000) + common.log('removal-complete') + common.log('compatible-apps') + + await common.clearApkFolder() + + const compatibleApps = await common.getCompatibleAppsList() + + console.log(chalk.whiteBright('----------')) + common.print('downloading-compatible-apps', 'whiteBright') + + for (const package of compatibleApps) { + if (package.Klean === "X") { + try { + newPacakgeName = package.name.replace(/\s/g, ''); + await common.downloadFile(package.url, './data/apps/' + newPacakgeName + '.apk') + logger.info(await Language.get('downloading-latest', 'en') + ' ' + package.name + ' ' + chalk.green(await Language.get('complete', 'en'))) + console.log(await Language.get('downloading-latest') + ' ' + package.name + ' ' + await Language.get('complete')) + } catch (error) { + logger.info(await Language.get('downloading-latest', 'en') + ' ' + package.name + ' ' + chalk.red(await Language.get('failed', 'en'))) + console.log(await Language.get('downloading-latest') + ' ' + package.name + ' ' + await Language.get('failed')) + } + } + } + const apkList = await files.getListOfAPk('./data/apps') + console.log(chalk.whiteBright('----------')) + common.print('installing-apps', 'whiteBright') + for (let element of apkList) { + await adb.installApk(element) + } + common.dualLog('compatible-apps-installed', 'green') await common.pause(2000) module.exports.mainMenu() - }, + + removeXiaomiApps: async () => { + common.header(await Language.get('main-menu-item-2')) + common.log('main-menu-item-2', 'green') + const value = await inquirer.removeAppsList(); + for (let package of value.removeAppsList) { + await adb.removeXiaomiApk(package) + } + common.dualLog('removal-complete', 'green') + await common.pause(2000) + module.exports.mainMenu() + }, + + restoreXiaomiApps: async () => { + logger.info("Restore Apps") + common.header('Restore Apps') + const value = await inquirer.removeAppsList(); + for (let package of value.removeAppsList) { + await adb.restoreXiaomiApk(package) + } + console.log(chalk.green('Restore Complete')) + await common.pause(2000) + logger.info("Restore Apps Complete") + module.exports.mainMenu() + }, + installCompatibleApps: async () => { - logger.info(await Language.get('install_compatible_apps_header')) - common.header(await Language.get('install_compatible_apps_header')) + logger.info(await Language.get('install-compatible-apps-header', 'en')) + common.header(await Language.get('install-compatible-apps-header')) const compatibleApps = await common.getCompatibleAppsList() const value = await inquirer.compatibleApps(); @@ -60,88 +111,15 @@ module.exports = { for (let package of apkList) { console.log(await Language.get('installing') + ' ' + package) - logger.info(await Language.get('installing') + ' ' + package) + logger.info(await Language.get('installing', 'en') + ' ' + package) await adb.installApk(package) } - console.log(chalk.green(await Language.get('compatible_apps_installed'))) - logger.info(await Language.get('compatible_apps_installed')) + console.log(chalk.green(await Language.get('compatible-apps-installed'))) + logger.info(await Language.get('compatible-apps-installed', 'en')) await common.pause(2000) module.exports.mainMenu() }, - removeApps: async () => { - logger.info("Remove Apps") - common.header('Remove Apps') - const value = await inquirer.removeAppsList(); - for (let package of value.removeAppsList) { - await adb.removeXiaomiApk(package) - } - console.log(chalk.green('Removal Complete')) - await common.pause(2000) - logger.info("Remove Complete") - module.exports.mainMenu() - }, - restoreApps: async () => { - logger.info("Restore Apps") - common.header('Restore Apps') - const value = await inquirer.removeAppsList(); - for (let package of value.removeAppsList) { - await adb.restoreXiaomiApk(package) - } - console.log(chalk.green('Restore Complete')) - await common.pause(2000) - logger.info("Restore Apps Complete") - module.exports.mainMenu() - }, - connectWatch: async () => { - logger.info("Connect to watch") - common.header('Connect to watch') - const value = await inquirer.connectionType() - connected = await adb.watchConnection(value) - if (connected != true) { - module.exports.connectWatch() - } else { - module.exports.mainMenu() - } - }, - oneClick: async () => { - logger.info("1-Click Karl0ss Klean") - common.header('1-Click Karl0ss Klean') - const removalPackagesList = files.loadPackageList() - for (let package of removalPackagesList.apps) { - await adb.removeXiaomiApk(package) - } - console.log(chalk.green('Removal Complete')) - await common.pause(2000) - logger.info("Remove Complete") - logger.info("Compatible Apps") - await common.clearApkFolder() - - const compatibleApps = await common.getCompatibleAppsList() - console.log(chalk.green('Download Compatible APKS')) - - for (const package of compatibleApps) { - if (package.Klean === "X") { - try { - newPacakgeName = package.name.replace(/\s/g, ''); - await common.downloadFile(package.url, './data/apps/' + newPacakgeName + '.apk') - logger.info('Downloading Latest ' + package.name + ' Complete') - console.log('Downloading Latest ' + package.name + ' Complete') - } catch (error) { - logger.info('Downloading Latest ' + package.name + ' FAILED') - } - } - } - const apkList = await files.getListOfAPk('./data/apps') - console.log(chalk.green('Install Apks')) - for (let element of apkList) { - await adb.installApk(element) - } - console.log(chalk.green('Compatible Apps Installed')) - logger.info('Compatible Apps Installed') - await common.pause(2000) - module.exports.mainMenu() - }, restoreAnyApp: async () => { logger.info("Restore Any App") common.header('Restore Any App') @@ -152,13 +130,14 @@ module.exports = { logger.info("App Restore Complete") module.exports.mainMenu() }, + batchInstallApks: async () => { logger.info("Batch Install Apks") common.header('Batch Install Apks') - let apkList = await files.getListOfAPk('./my_apk/') + let apkList = await files.getListOfAPk('./my-apk/') await files.renameLocalApk(apkList) - apkList = await files.getListOfAPk('./my_apk/') + apkList = await files.getListOfAPk('./my-apk/') for (let element of apkList) { console.log('Installing ' + element) @@ -170,34 +149,66 @@ module.exports = { await common.pause(2000) module.exports.mainMenu() }, + + batchRemoveInstalledApps: async () => { + common.header(await Language.get('header-remove-installed-apps')) + logger.info(await Language.get('header-remove-installed-apps', 'en')) + + 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', 'en')) + await common.pause(2000) + module.exports.mainMenu() + + }, + + connectWatch: async () => { + logger.info("Connect to watch") + common.header('Connect to watch') + const value = await inquirer.connectionType() + connected = await adb.watchConnection(value) + if (connected != true) { + module.exports.connectWatch() + } else { + module.exports.mainMenu() + } + }, + mainMenu: async () => { common.header('Main Menu') const mainMenuSelection = await inquirer.mainMenu(); switch (mainMenuSelection.mainMenu) { - case 'connect to miwatch': - module.exports.connectWatch() - break; case '1-click karl0ss klean': module.exports.oneClick() break; case 'remove xiaomi apps': - module.exports.removeApps() + module.exports.removeXiaomiApps() break; case 'restore xiaomi apps': - module.exports.restoreApps() + module.exports.restoreXiaomiApps() break; case 'install compatible apps': module.exports.installCompatibleApps() break; - case 'batch remove installed apps': - module.exports.removeCompatibleApps() - break; case 'restore any app': module.exports.restoreAnyApp() break; case 'batch install apks': module.exports.batchInstallApks() break; + case 'batch remove installed apps': + module.exports.batchRemoveInstalledApps() + break; + case 'connect to miwatch': + module.exports.connectWatch() + break; case 'quit': break; default: From ed396e05752195b4c84853fda55f1d3a786cf487 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 17:18:57 +0100 Subject: [PATCH 05/14] more lingual changes --- lang/en.json | 7 ++++-- pages/pages.js | 65 ++++++++++++++++++++++---------------------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/lang/en.json b/lang/en.json index a865a8e..8261bfc 100644 --- a/lang/en.json +++ b/lang/en.json @@ -5,7 +5,7 @@ "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-6": "Batch Install Apps", "main-menu-item-7": "Batch Remove Installed Apps", "main-menu-item-8": "Quit", "connection-type-message": "How do you want to connect?", @@ -36,5 +36,8 @@ "installing-apps": "Installing Apps", "downloading-latest": "Downloading Latest", "complete": "Complete", - "failed": "Failed" + "failed": "Failed", + "restoring-apps-complete": "Restoring Apps Complete", + "batch-install-apps-complete": "Batch Install Apps Complete", + "connect-to-watch": "Connect to watch" } \ No newline at end of file diff --git a/pages/pages.js b/pages/pages.js index 371dd39..40b8272 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -5,6 +5,7 @@ const files = require('../lib/files') const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); const adb = require('../lib/adb'); +const { dualLog } = require('../lib/common'); logger.info(process.platform + " detected") if (process.platform === 'win32' || process.platform === 'win64') { @@ -32,14 +33,14 @@ module.exports = { await common.pause(2000) common.log('removal-complete') common.log('compatible-apps') - + await common.clearApkFolder() const compatibleApps = await common.getCompatibleAppsList() - + console.log(chalk.whiteBright('----------')) common.print('downloading-compatible-apps', 'whiteBright') - + for (const package of compatibleApps) { if (package.Klean === "X") { try { @@ -65,8 +66,8 @@ module.exports = { }, removeXiaomiApps: async () => { - common.header(await Language.get('main-menu-item-2')) - common.log('main-menu-item-2', 'green') + common.header('main-menu-item-2') + common.log('main-menu-item-2') const value = await inquirer.removeAppsList(); for (let package of value.removeAppsList) { await adb.removeXiaomiApk(package) @@ -77,22 +78,20 @@ module.exports = { }, restoreXiaomiApps: async () => { - logger.info("Restore Apps") - common.header('Restore Apps') + common.header('main-menu-item-3') + common.log('main-menu-item-3') const value = await inquirer.removeAppsList(); for (let package of value.removeAppsList) { await adb.restoreXiaomiApk(package) } - console.log(chalk.green('Restore Complete')) + common.dualLog('restoring-apps-complete', 'green') await common.pause(2000) - logger.info("Restore Apps Complete") module.exports.mainMenu() }, installCompatibleApps: async () => { - logger.info(await Language.get('install-compatible-apps-header', 'en')) - common.header(await Language.get('install-compatible-apps-header')) - + common.header('main-menu-item-4') + common.log('main-menu-item-4') const compatibleApps = await common.getCompatibleAppsList() const value = await inquirer.compatibleApps(); @@ -110,49 +109,45 @@ module.exports = { const apkList = await files.getListOfAPk('./data/apps') for (let package of apkList) { - console.log(await Language.get('installing') + ' ' + package) - logger.info(await Language.get('installing', 'en') + ' ' + package) + common.dualLog('installing', 'whiteBright') await adb.installApk(package) } - console.log(chalk.green(await Language.get('compatible-apps-installed'))) - logger.info(await Language.get('compatible-apps-installed', 'en')) + common.dualLog('compatible-apps-installed', 'green') await common.pause(2000) module.exports.mainMenu() }, restoreAnyApp: async () => { - logger.info("Restore Any App") - common.header('Restore Any App') + common.header('main-menu-item-5') + common.log('main-menu-item-5') const value = await inquirer.restoreAnyApp(); await adb.restoreAnyApk(value) - console.log(chalk.green('Restore Complete')) + common.dualLog('restoring-apps-complete', 'green') await common.pause(2000) - logger.info("App Restore Complete") module.exports.mainMenu() }, - batchInstallApks: async () => { - logger.info("Batch Install Apks") - common.header('Batch Install Apks') + batchInstallApps: async () => { + common.header('main-menu-item-6') + common.log('main-menu-item-6') let apkList = await files.getListOfAPk('./my-apk/') await files.renameLocalApk(apkList) apkList = await files.getListOfAPk('./my-apk/') for (let element of apkList) { - console.log('Installing ' + element) - logger.info('Installing ' + element) + console.log(await Language.get('installing') + ' ' + element) + logger.info(await Language.get('installing') + ' ' + element) await adb.installApk(element) } - console.log(chalk.green('Batch Install Apks Completed')) - logger.info('Batch Install Apks Completed') + common.dualLog('batch-install-apps-complete', 'green') await common.pause(2000) module.exports.mainMenu() }, batchRemoveInstalledApps: async () => { - common.header(await Language.get('header-remove-installed-apps')) - logger.info(await Language.get('header-remove-installed-apps', 'en')) + common.header('main-menu-item-7') + common.log('main-menu-item-7') value = await adb.getInstalledPacakges() @@ -162,16 +157,14 @@ module.exports = { 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', 'en')) + common.dualLog('remove-selected-user-apps', 'green') await common.pause(2000) module.exports.mainMenu() - }, connectWatch: async () => { - logger.info("Connect to watch") - common.header('Connect to watch') + common.header('connect-to-watch') + common.log('connect-to-watch') const value = await inquirer.connectionType() connected = await adb.watchConnection(value) if (connected != true) { @@ -200,8 +193,8 @@ module.exports = { case 'restore any app': module.exports.restoreAnyApp() break; - case 'batch install apks': - module.exports.batchInstallApks() + case 'batch install apps': + module.exports.batchInstallApps() break; case 'batch remove installed apps': module.exports.batchRemoveInstalledApps() From 64fea32966cd2dde5c9398f0649adc441d7132f6 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Fri, 28 Aug 2020 17:50:31 +0100 Subject: [PATCH 06/14] 3.1.0 muilti --- lang/en.json | 5 ++++- lib/common.js | 6 +++--- lib/inquirer.js | 7 ------- package.json | 2 +- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lang/en.json b/lang/en.json index 8261bfc..43ce9ef 100644 --- a/lang/en.json +++ b/lang/en.json @@ -39,5 +39,8 @@ "failed": "Failed", "restoring-apps-complete": "Restoring Apps Complete", "batch-install-apps-complete": "Batch Install Apps Complete", - "connect-to-watch": "Connect to watch" + "connect-to-watch": "Connect to watch", + "connected-via-usb": "Connected via USB", + "connected-via-wifi": "Connected via Wifi", + "not-connected": "Not Connected" } \ No newline at end of file diff --git a/lib/common.js b/lib/common.js index 6dfd52d..944e36c 100644 --- a/lib/common.js +++ b/lib/common.js @@ -37,13 +37,13 @@ module.exports = { }, connectionCheck: async () => { if (globalVariables.localUSB === "X") { - console.log(chalk.white('MiWatch: ') + chalk.green('Connected via USB')) + console.log(chalk.white('MiWatch: ') + chalk.green(await Language.get('connected-via-usb'))) } if (globalVariables.miWatchIpaddress != "") { - console.log(chalk.white('MiWatch: ') + chalk.green('Connected via Wifi - ' + chalk.white(globalVariables.miWatchIpaddress))) + console.log(chalk.white('MiWatch: ') + chalk.green(await Language.get('connected-via-wifi') + ' ' + chalk.white(globalVariables.miWatchIpaddress))) } if (globalVariables.localUSB === "" && globalVariables.miWatchIpaddress === "") { - console.log(chalk.white('MiWatch: ') + chalk.red('Not Connected')) + console.log(chalk.white('MiWatch: ') + chalk.red(await Language.get('not-connected'))) } }, downloadFile: async (url, path) => { diff --git a/lib/inquirer.js b/lib/inquirer.js index aa3e392..15c92dc 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -4,13 +4,6 @@ const common = require("./common"); const Language = require("@shypes/language-translator"); -Language._({ - default_lang: "en", - ext: ".json", - __basedir: "./", - langFolder: 'lang' -}) - module.exports = { mainMenu: async () => { const questions = [{ diff --git a/package.json b/package.json index 82c7a2b..357f0d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "miwatchkleaner", - "version": "3.0.0", + "version": "3.1.0", "description": "MiWatch Cleaning Tool", "main": "app.js", "bin": "app.js", From 2905c6675ac2d986dc5dcd05d879cd91ebb905ae Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 11:20:45 +0100 Subject: [PATCH 07/14] more bits and albertolocale fix --- lib/adb.js | 4 +- lib/common.js | 15 +++- package-lock.json | 186 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 + 4 files changed, 201 insertions(+), 6 deletions(-) diff --git a/lib/adb.js b/lib/adb.js index 13f9a4b..18abfeb 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -39,9 +39,9 @@ module.exports = { logger.info(await Language.get('morelocale-activated-on-watch')); }) } - if (element === "data\\apps\\com.alberto.locale.apk") { + if (element === "data\\apps\\AlbertoLocale.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(result.stdout) console.log(await Language.get('alberto-locale-activated-on-watch')); logger.info(await Language.get('alberto-locale-activated-on-watch')); }); diff --git a/lib/common.js b/lib/common.js index 944e36c..aa43cd9 100644 --- a/lib/common.js +++ b/lib/common.js @@ -7,14 +7,16 @@ const fetch = require('node-fetch'); var shell = require('shelljs'); const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); - +// var remote = require('remote-file-size') const globalVariables = require('../lib/globalVars'); +var chalkRainbow = require('chalk-rainbow') + module.exports = { header: async (page) => { clear(); console.log( - chalk.red( + chalkRainbow( figlet.textSync('MiWatch Kleaner', { horizontalLayout: 'full' }) @@ -48,7 +50,8 @@ module.exports = { }, downloadFile: async (url, path) => { const res = await fetch(url); - await new Promise((resolve, reject) => { + // await module.exports.downloadSize(url) + await new Promise(async (resolve, reject) => { const fileStream = fs.createWriteStream(path); res.body.pipe(fileStream); res.body.on("error", (err) => { @@ -59,6 +62,12 @@ module.exports = { }); }); }, + downloadSize: async (url) => { + remote(url, function (err, o) { + console.log(o) + console.log(err) + }) + }, getCompatibleAppsList: async () => { let settings = { method: "Get" }; const response = await fetch("http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/compatibleApps.json", settings) diff --git a/package-lock.json b/package-lock.json index d1f411f..47a1279 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "miwatchkleaner", - "version": "3.0.0", + "version": "3.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -55,6 +55,11 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "ajv": { "version": "6.12.4", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", @@ -170,6 +175,51 @@ "supports-color": "^7.1.0" } }, + "chalk-rainbow": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chalk-rainbow/-/chalk-rainbow-1.0.0.tgz", + "integrity": "sha1-kS7wiQ0NI6ZX1byInuFzb++fuPA=", + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -212,6 +262,11 @@ "cli-color": "0.3.2" } }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -628,11 +683,31 @@ "har-schema": "^2.0.0" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "help": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", + "integrity": "sha1-luGQ1KCkU7icLLSwWrOOOo+f2t0=" + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -901,6 +976,22 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "noptd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/noptd/-/noptd-2.0.1.tgz", + "integrity": "sha1-sDV66CLk1odjFvwveV5N1FauVxU=", + "requires": { + "nopt": "~3.0.1" + } + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1040,6 +1131,11 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, + "pretty-bytes": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", + "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1092,6 +1188,94 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, + "remote-file-size": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/remote-file-size/-/remote-file-size-3.0.5.tgz", + "integrity": "sha512-wM0Djgzpd2ob7d79XeScnmRqr6ulJMeLrVJIiW/CYOkIjtvsYV3FPRxNP5HHh2wH/CeHGOWYAKrWEr93EUkSUg==", + "requires": { + "help": "~3.0.2", + "noptd": "~2.0.0", + "pretty-bytes": "~5.1.0", + "request": "~2.87.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" + } + } + } + }, "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 357f0d5..cb9b1f2 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@peterpanhihi/tiny": "^2.0.0", "@shypes/language-translator": "^2.0.15", "chalk": "^4.0.0", + "chalk-rainbow": "^1.0.0", "clear": "^0.1.0", "clui": "^0.3.6", "figlet": "^1.3.0", @@ -26,6 +27,7 @@ "node-fetch": "^2.6.0", "perfect-logger": "^2.0.1", "pkg": "^4.4.7", + "remote-file-size": "^3.0.5", "shell-exec": "^1.0.2", "shelljs": "^0.8.4" }, From f020e27f8c4fbfc9e0ea27a7d530a74144daa635 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 12:34:02 +0100 Subject: [PATCH 08/14] working multilingual :) --- app.js | 13 ++++++++++++- lang/es.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++ lib/adb.js | 9 ++++++++- lib/common.js | 10 +++++++--- lib/files.js | 8 ++++++++ lib/globalVars.js | 1 + lib/inquirer.js | 23 ++++++++++++++++++++++- pages/pages.js | 43 +++++++++++++++++++++++++++++++++---------- 8 files changed, 137 insertions(+), 16 deletions(-) create mode 100644 lang/es.json diff --git a/app.js b/app.js index 8fa6c87..6665b1b 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,14 @@ const pages = require('./pages/pages') +const Language = require("@shypes/language-translator"); +const globalVariables = require('./lib/globalVars'); + +async function main() { + lang = await pages.selectLanguage(); + globalVariables.language = lang.selection + await pages.connectWatch() +} + +main() + + -pages.connectWatch(); diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 0000000..d46e379 --- /dev/null +++ b/lang/es.json @@ -0,0 +1,46 @@ +{ + "main-menu-question": "¿Qué quieres hacer?", + "main-menu-item-1": "1-Click Karl0ss Klean", + "main-menu-item-2": "Eliminar aplicaciones Xiaomi", + "main-menu-item-3": "Restaurar aplicaciones Xiaomi", + "main-menu-item-4": "Instalar aplicaciones compatibles", + "main-menu-item-5": "Restaura CUALQUIER aplicación", + "main-menu-item-6": "Aplicaciones de instalación por lotes", + "main-menu-item-7": "Eliminar por lotes las aplicaciones instaladas", + "main-menu-item-8": "Salir", + "connection-type-message": "¿Cómo desea conectarse?", + "connect-wifi-message":"¿Cuál es su MiWatch IpAdress?", + "restore-app-message": "¿Qué aplicaciones quieres restaurar?", + "install-compatible-apps-message": "¿Qué aplicaciones quieres instalar?", + "remove-installed-apps-message": "¿Qué aplicaciones instaladas desea eliminar?", + "restore-any-app-message": "¿Qué aplicación desea restaurar?", + "header-remove-installed-apps": "Eliminar aplicaciones instaladas", + "packages-recieved-from-watch": "Paquetes recibidos desde watch", + "device-not-authorised": "Dispositivo no autorizado", + "restarting-adb": "Reiniciando ADB", + "please-reconnect-to-watch": "Vuelve a conectarte para mirar", + "remove-installed-apps-failed": "Falló la eliminación de aplicaciones instaladas", + "removing": "Eliminando", + "removal-complete": "Eliminación completa", + "installing": "Instalando", + "restoring": "Restaurando", + "remove-selected-user-apps": "Aplicaciones de usuario seleccionadas eliminadas", + "install-compatible-apps-header": "Instalar aplicaciones compatibles", + "simple-weather-activated-on-watch": "simpleWeather activado en el reloj", + "morelocale-activated-on-watch": "moreLocale activado durante el reloj", + "alberto-locale-activated-on-watch": "Alberto Locale activado durante el reloj", + "compatible-apps-installed": "Aplicaciones compatibles instaladas", + "compatible-apps": "Aplicaciones compatibles", + "remove-xiaomi-apps": "Eliminar aplicaciones Xiaomi", + "downloading-compatible-apps": "Descarga de aplicaciones compatibles", + "installing-apps": "Instalar aplicaciones", + "downloading-latest": "Descargando la última", + "complete": "Completo", + "failed": "Falló", + "restoring-apps-complete": "Restauración de aplicaciones completa", + "batch-install-apps-complete": "Instalación por lotes de aplicaciones completa", + "connect-to-watch": "Conectarse al reloj", + "connected-via-usb": "Conectado mediante USB", + "connected-via-wifi": "Conectado a través de Wifi", + "not-connected": "No conectado" +} \ No newline at end of file diff --git a/lib/adb.js b/lib/adb.js index 18abfeb..56ac8a9 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -6,7 +6,6 @@ const inquirer = require('../lib/inquirer'); const common = require('./common') const chalk = require('chalk'); const globalVariables = require('../lib/globalVars'); -const { removeAppsList } = require('../lib/inquirer'); if (process.platform === 'win32' || process.platform === 'win64') { adbRun = 'adb' @@ -16,6 +15,7 @@ if (process.platform === 'win32' || process.platform === 'win64') { module.exports = { installApk: async (element) => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) { if (result.stderr != '') { logger.info(await Language.get('device-not-authorised')); @@ -49,6 +49,7 @@ module.exports = { }); }, removeApk: async (package) => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' uninstall ' + package) if (result.stderr != '') { logger.info('Error ' + result.stderr); @@ -59,6 +60,7 @@ module.exports = { } }, removeXiaomiApk: async (package) => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + package) if (result.stderr != '') { logger.info('Error ' + result.stderr); @@ -69,6 +71,7 @@ module.exports = { } }, restoreXiaomiApk: async (package) => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell cmd package install-existing ' + package) if (result.stderr != '') { logger.info('Error ' + result.stderr); @@ -79,6 +82,7 @@ module.exports = { } }, restoreAnyApk: async (package) => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell cmd package install-existing ' + package.restoreAnyApp) if (result.stderr != '') { logger.info('Error ' + result.stderr); @@ -92,6 +96,7 @@ module.exports = { } }, getInstalledPacakges: async () => { + Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell pm list packages -3') logger.info(await Language.get('packages-recieved-from-watch')) if (result.stderr.includes('error')) { @@ -119,11 +124,13 @@ module.exports = { } }, killAdbServer: async () => { + Language.setActiveLang(globalVariables.language) let result = await shellExec(adbRun + ' kill-server') logger.info('Restarting ADB') logger.info(result.stdout) }, watchConnection: async (value) => { + Language.setActiveLang(globalVariables.language) if (value.connection === "usb") { await module.exports.killAdbServer() result = await shellExec(adbRun + ' devices') diff --git a/lib/common.js b/lib/common.js index aa43cd9..bca6df4 100644 --- a/lib/common.js +++ b/lib/common.js @@ -7,13 +7,12 @@ const fetch = require('node-fetch'); var shell = require('shelljs'); const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); -// var remote = require('remote-file-size') const globalVariables = require('../lib/globalVars'); var chalkRainbow = require('chalk-rainbow') - module.exports = { header: async (page) => { + Language.setActiveLang(globalVariables.language) clear(); console.log( chalkRainbow( @@ -24,7 +23,6 @@ module.exports = { ); console.log(chalk.red(' ' + pjson.version)); console.log(); - console.log( chalk.red( '-------------------------------------------------------------------------------------------------------' @@ -38,6 +36,7 @@ module.exports = { await new Promise(resolve => setTimeout(resolve, time)); }, connectionCheck: async () => { + Language.setActiveLang(globalVariables.language) if (globalVariables.localUSB === "X") { console.log(chalk.white('MiWatch: ') + chalk.green(await Language.get('connected-via-usb'))) } @@ -49,6 +48,7 @@ module.exports = { } }, downloadFile: async (url, path) => { + Language.setActiveLang(globalVariables.language) const res = await fetch(url); // await module.exports.downloadSize(url) await new Promise(async (resolve, reject) => { @@ -81,6 +81,7 @@ module.exports = { logger.info(await Language.get(item, 'en')) }, print: async (item, colour) => { + Language.setActiveLang(globalVariables.language) switch (colour) { case 'green': console.log(chalk.green(await Language.get(item))) @@ -91,6 +92,9 @@ module.exports = { case 'whiteBright': console.log(chalk.whiteBright(await Language.get(item))) break; + case 'rainbow': + console.log(chalkRainbow(await Language.get(item))) + break; default: console.log(chalk.white(await Language.get(item))) break; diff --git a/lib/files.js b/lib/files.js index fe73b90..57c4d87 100644 --- a/lib/files.js +++ b/lib/files.js @@ -2,6 +2,10 @@ const fs = require('fs'); const path = require('path'); const tiny = require("@peterpanhihi/tiny"); const getFilesIn = require('get-files-in') +const globalVariables = require('../lib/globalVars'); +const Language = require("@shypes/language-translator"); + +Language.setActiveLang(globalVariables.language) module.exports = { @@ -45,4 +49,8 @@ module.exports = { const result = getFilesIn(path, matchFiletypes = ["apk"], checkSubDirectories = false) return result }, + getLanguageFiles: () => { + const result = getFilesIn('./lang/', matchFiletypes = ["json"], checkSubDirectories = false) + return result + }, } \ No newline at end of file diff --git a/lib/globalVars.js b/lib/globalVars.js index 5cce1ae..6551469 100644 --- a/lib/globalVars.js +++ b/lib/globalVars.js @@ -1,6 +1,7 @@ class globalVariables { localUSB = ""; miWatchIpaddress = ""; + language = ""; usersList=[]; } diff --git a/lib/inquirer.js b/lib/inquirer.js index 15c92dc..7c82860 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -1,11 +1,12 @@ const inquirer = require("inquirer"); const files = require("./files"); const common = require("./common"); - const Language = require("@shypes/language-translator"); +const globalVariables = require('../lib/globalVars'); module.exports = { mainMenu: async () => { + Language.setActiveLang(globalVariables.language) const questions = [{ type: "list", name: "mainMenu", @@ -26,7 +27,22 @@ module.exports = { },]; return inquirer.prompt(questions); }, + LanguageSelect: async () => { + langList = files.getLanguageFiles() + langList = langList.map(s => s.slice(5, -5)); + const questions = [{ + type: "list", + name: "selection", + message: await Language.get('Select Language'), + choices: langList, + filter: function (val) { + return val.toLowerCase(); + }, + },]; + return inquirer.prompt(questions); + }, connectionType: async () => { + Language.setActiveLang(globalVariables.language) const questions = [{ type: "list", name: "connection", @@ -42,6 +58,7 @@ module.exports = { return inquirer.prompt(questions); }, connectWifi: async () => { + Language.setActiveLang(globalVariables.language) const questions = [{ type: "input", name: "connectWifi", @@ -50,6 +67,7 @@ module.exports = { return inquirer.prompt(questions); }, removeAppsList: async () => { + Language.setActiveLang(globalVariables.language) const packages = await files.loadPackageList(); const questions = [{ @@ -61,6 +79,7 @@ module.exports = { return inquirer.prompt(questions); }, compatibleApps: async () => { + Language.setActiveLang(globalVariables.language) const compatibleApps = await common.getCompatibleAppsList() const appList = [] for (let element of compatibleApps) { @@ -75,6 +94,7 @@ module.exports = { return inquirer.prompt(questions); }, installedApps: async (installedApps) => { + Language.setActiveLang(globalVariables.language) const questions = [{ type: "checkbox", name: "removeAppsList", @@ -84,6 +104,7 @@ module.exports = { return inquirer.prompt(questions); }, restoreAnyApp: async () => { + Language.setActiveLang(globalVariables.language) const questions = [{ type: "input", name: "restoreAnyApp", diff --git a/pages/pages.js b/pages/pages.js index 40b8272..50f4c83 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -5,7 +5,6 @@ const files = require('../lib/files') const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); const adb = require('../lib/adb'); -const { dualLog } = require('../lib/common'); logger.info(process.platform + " detected") if (process.platform === 'win32' || process.platform === 'win64') { @@ -174,35 +173,59 @@ module.exports = { } }, + selectLanguage: async () => { + common.header('Select Language') + common.log('Select Language') + // const value = await inquirer.connectionType() + const v = await inquirer.LanguageSelect() + // connected = await adb.watchConnection(value) + // if (connected != true) { + // module.exports.connectWatch() + // } else { + // module.exports.mainMenu() + // } + return v + }, + mainMenu: async () => { common.header('Main Menu') const mainMenuSelection = await inquirer.mainMenu(); + menu_1 = await Language.get('main-menu-item-1') + menu_2 = await Language.get('main-menu-item-2') + menu_3 = await Language.get('main-menu-item-3') + menu_4 = await Language.get('main-menu-item-4') + menu_5 = await Language.get('main-menu-item-5') + menu_6 = await Language.get('main-menu-item-6') + menu_7 = await Language.get('main-menu-item-7') + menu_8 = await Language.get('main-menu-item-8') + menu_9 = await Language.get('main-menu-item-9') + switch (mainMenuSelection.mainMenu) { - case '1-click karl0ss klean': + case menu_1.toLowerCase(): module.exports.oneClick() break; - case 'remove xiaomi apps': + case menu_2.toLowerCase(): module.exports.removeXiaomiApps() break; - case 'restore xiaomi apps': + case menu_3.toLowerCase(): module.exports.restoreXiaomiApps() break; - case 'install compatible apps': + case menu_4.toLowerCase(): module.exports.installCompatibleApps() break; - case 'restore any app': + case menu_5.toLowerCase(): module.exports.restoreAnyApp() break; - case 'batch install apps': + case menu_6.toLowerCase(): module.exports.batchInstallApps() break; - case 'batch remove installed apps': + case menu_7.toLowerCase(): module.exports.batchRemoveInstalledApps() break; - case 'connect to miwatch': + case menu_8.toLowerCase(): module.exports.connectWatch() break; - case 'quit': + case menu_9.toLowerCase(): break; default: // code block From f89d8835641800775c6ce9284a9850d6c01049eb Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 20:48:57 +0100 Subject: [PATCH 09/14] working spanish 100% --- lang/en.json | 9 ++++++- lang/es.json | 8 +++++- lib/adb.js | 69 +++++++++++++++++++---------------------------- package-lock.json | 69 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 5 files changed, 112 insertions(+), 44 deletions(-) diff --git a/lang/en.json b/lang/en.json index 43ce9ef..132d0a8 100644 --- a/lang/en.json +++ b/lang/en.json @@ -42,5 +42,12 @@ "connect-to-watch": "Connect to watch", "connected-via-usb": "Connected via USB", "connected-via-wifi": "Connected via Wifi", - "not-connected": "Not Connected" + "connected": "Connected", + "not-connected": "Not Connected", + "error-device-not-authorised": "Error - Device not authorised", + "not-found": "Not Found", + "try-again": "Try Again", + "connect-wifi-complete": "Connect Wifi Complete", + "not-authenticated": "Not Authenticated", + "error": "Error" } \ No newline at end of file diff --git a/lang/es.json b/lang/es.json index d46e379..48eb097 100644 --- a/lang/es.json +++ b/lang/es.json @@ -42,5 +42,11 @@ "connect-to-watch": "Conectarse al reloj", "connected-via-usb": "Conectado mediante USB", "connected-via-wifi": "Conectado a través de Wifi", - "not-connected": "No conectado" + "not-connected": "No conectado", + "error-device-not-authorised": "Error - Dispositivo no autorizado", + "not-found": "No encontrado", + "try-again": "Inténtalo de nuevo", + "connect-wifi-complete": "Conectar Wifi Completo", + "not-authenticated": "No autenticado", + "error": "Error" } \ No newline at end of file diff --git a/lib/adb.js b/lib/adb.js index 56ac8a9..b2efc84 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -6,6 +6,7 @@ const inquirer = require('../lib/inquirer'); const common = require('./common') const chalk = require('chalk'); const globalVariables = require('../lib/globalVars'); +const { dualLog } = require('./common'); if (process.platform === 'win32' || process.platform === 'win64') { adbRun = 'adb' @@ -18,32 +19,28 @@ module.exports = { Language.setActiveLang(globalVariables.language) 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'))); + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') } - console.log(element + ' - ' + result.stdout); - logger.info(element + ' - ' + result.stdout); + common.dualLog(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')); + common.log(result) + common.dualLog('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')); + common.log(result) + common.dualLog('morelocale-activated-on-watch') }) } if (element === "data\\apps\\AlbertoLocale.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.stdout) - console.log(await Language.get('alberto-locale-activated-on-watch')); - logger.info(await Language.get('alberto-locale-activated-on-watch')); + common.log(result) + common.dualLog('alberto-locale-activated-on-watch') }); } }); @@ -52,47 +49,39 @@ module.exports = { Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' uninstall ' + package) if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') } else { - logger.info('Removing ' + package + ' - ' + result.stdout); - console.log('Removing ' + package + ' - ' + result.stdout); + common.dualLog(await Language.get('removing') + ' ' + package + ' - ' + result.stdout) } }, removeXiaomiApk: async (package) => { Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + package) if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') } else { - logger.info('Removing ' + package + ' - ' + result.stdout); - console.log('Removing ' + package + ' - ' + result.stdout); + common.dualLog(await Language.get('removing') + ' ' + package + ' - ' + result.stdout) } }, restoreXiaomiApk: async (package) => { Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell cmd package install-existing ' + package) if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') } else { - logger.info('Removing ' + package + ' - ' + result.stdout); - console.log('Removing ' + package + ' - ' + result.stdout); + common.dualLog(await Language.get('removing') + ' ' + package + ' - ' + result.stdout) } }, restoreAnyApk: async (package) => { Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell cmd package install-existing ' + package.restoreAnyApp) if (result.stderr != '') { - logger.info('Error ' + result.stderr); - console.log(chalk.redBright('Error - Device not authorised')); + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') } else if (result.stdout.includes('doesn\'t exist')) { logger.info(result.stdout); console.log(chalk.redBright(result.stdout)); } else { - logger.info('Restoring ' + package.restoreAnyApp + ' - ' + result.stdout); - console.log('Restoring ' + package.restoreAnyApp + ' - ' + result.stdout); + common.dualLog(await Language.get('restoring') + ' ' + package + ' - ' + result.stdout) } }, getInstalledPacakges: async () => { @@ -126,8 +115,8 @@ module.exports = { killAdbServer: async () => { Language.setActiveLang(globalVariables.language) let result = await shellExec(adbRun + ' kill-server') - logger.info('Restarting ADB') - logger.info(result.stdout) + // common.log('') + // common.dualLog('restarting-adb' + ' ' + result.stderr, 'red') }, watchConnection: async (value) => { Language.setActiveLang(globalVariables.language) @@ -136,16 +125,14 @@ module.exports = { result = await shellExec(adbRun + ' devices') console.log(result.stdout) if (result.stdout.includes('device', 15)) { - console.log(chalk.green('MiWatch Connected via USB')) + common.dualLog(await Language.get('connected-via-usb', 'green')) await common.pause(3000) - logger.info("MiWatch connected") globalVariables.localUSB = "X" return true } else { - console.log(chalk.red('MiWatch not found')) - logger.info("MiWatch not found") + common.dualLog(await Language.get('not-found', 'red')) await common.pause(2000) - console.log(chalk.white('Try Again')) + common.dualLog(await Language.get('try-again', 'white')) await common.pause(1000) return false } @@ -156,23 +143,21 @@ module.exports = { result = await shellExec(adbRun + ' connect ' + value.connectWifi) logger.info("Connect Wifi Result " + result.stdout) if (result.stdout.includes('already connected') || result.stdout.includes('connected to ')) { - console.log(chalk.green('MiWatch Connected')) + common.dualLog(await Language.get('connected', 'green')) globalVariables.localUSB = "" globalVariables.miWatchIpaddress = value.connectWifi await common.pause(3000) - logger.info("Connect Wifi Complete") + common.dualLog(await Language.get('connect-wifi-complete', 'green')) return true } else { if (result.stdout.includes('failed to authenticate')) { - console.log(chalk.redBright('MiWatch not authenticated')) - logger.info('MiWatch not authenticated') + common.dualLog(await Language.get('not-authenticated', 'red')) return false } else { - console.log(chalk.red(result.stdout)) - logger.info(result.stdout) + common.dualLog(result.stdout, 'red') } await common.pause(2000) - console.log(chalk.white('Try Again')) + common.dualLog('try-again', '') await common.pause(1000) return false } diff --git a/package-lock.json b/package-lock.json index 47a1279..f9e0bc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,6 +111,11 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "async": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", + "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -664,6 +669,60 @@ "slash": "^3.0.0" } }, + "google-translate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/google-translate/-/google-translate-3.0.0.tgz", + "integrity": "sha512-NQrP9gnFBO9LpEAN7Ia4kiyycbubqG+vdmxhQE5hjhAeU6U2n1vM7Kb1wtI3YU7Ghk3+bdfiRiAr6Zhox/UV2w==", + "requires": { + "async": "3.1.0", + "he": "1.2.0", + "request": "2.88.0", + "underscore": "1.9.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -703,6 +762,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, "help": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", @@ -1540,6 +1604,11 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, "unique-temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", diff --git a/package.json b/package.json index cb9b1f2..1612351 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "clui": "^0.3.6", "figlet": "^1.3.0", "get-files-in": "^1.2.0", + "google-translate": "^3.0.0", "inquirer": "^7.1.0", "node-fetch": "^2.6.0", "perfect-logger": "^2.0.1", From 63cd59c6a12f235b99efb220c2e56c4c866a2491 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 21:03:18 +0100 Subject: [PATCH 10/14] remove any app --- lang/en.json | 11 +++++++---- lang/es.json | 11 +++++++---- lib/adb.js | 12 ++++++++++++ lib/inquirer.js | 9 +++++++++ pages/pages.js | 33 ++++++++++++++++++++------------- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/lang/en.json b/lang/en.json index 132d0a8..1dd6e24 100644 --- a/lang/en.json +++ b/lang/en.json @@ -5,9 +5,10 @@ "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 Apps", - "main-menu-item-7": "Batch Remove Installed Apps", - "main-menu-item-8": "Quit", + "main-menu-item-6": "Remove ANY app", + "main-menu-item-7": "Batch Install Apps", + "main-menu-item-8": "Batch Remove Installed Apps", + "main-menu-item-9": "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?", @@ -49,5 +50,7 @@ "try-again": "Try Again", "connect-wifi-complete": "Connect Wifi Complete", "not-authenticated": "Not Authenticated", - "error": "Error" + "error": "Error", + "remove-any-app-message": "What App do you want to remove?", + "removing-apps-complete": "Removing Apps Complete" } \ No newline at end of file diff --git a/lang/es.json b/lang/es.json index 48eb097..d1cba1c 100644 --- a/lang/es.json +++ b/lang/es.json @@ -5,9 +5,10 @@ "main-menu-item-3": "Restaurar aplicaciones Xiaomi", "main-menu-item-4": "Instalar aplicaciones compatibles", "main-menu-item-5": "Restaura CUALQUIER aplicación", - "main-menu-item-6": "Aplicaciones de instalación por lotes", - "main-menu-item-7": "Eliminar por lotes las aplicaciones instaladas", - "main-menu-item-8": "Salir", + "main-menu-item-6": "Eliminar CUALQUIER aplicación", + "main-menu-item-7": "Aplicaciones de instalación por lotes", + "main-menu-item-8": "Eliminar por lotes las aplicaciones instaladas", + "main-menu-item-9": "Salir", "connection-type-message": "¿Cómo desea conectarse?", "connect-wifi-message":"¿Cuál es su MiWatch IpAdress?", "restore-app-message": "¿Qué aplicaciones quieres restaurar?", @@ -48,5 +49,7 @@ "try-again": "Inténtalo de nuevo", "connect-wifi-complete": "Conectar Wifi Completo", "not-authenticated": "No autenticado", - "error": "Error" + "error": "Error", + "remove-any-app-message": "¿Qué aplicación quieres eliminar?", + "removing-apps-complete": "Eliminación de aplicaciones completa" } \ No newline at end of file diff --git a/lib/adb.js b/lib/adb.js index b2efc84..9e7fa95 100644 --- a/lib/adb.js +++ b/lib/adb.js @@ -84,6 +84,18 @@ module.exports = { common.dualLog(await Language.get('restoring') + ' ' + package + ' - ' + result.stdout) } }, + removeAnyApk: async (package) => { + Language.setActiveLang(globalVariables.language) + result = await shellExec(adbRun + ' shell pm uninstall -k --user 0 ' + package.removeAnyApp) + if (result.stderr != '') { + common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red') + } else if (result.stdout.includes('doesn\'t exist')) { + logger.info(result.stdout); + console.log(chalk.redBright(result.stdout)); + } else { + common.dualLog(await Language.get('removing') + ' ' + package + ' - ' + result.stdout) + } + }, getInstalledPacakges: async () => { Language.setActiveLang(globalVariables.language) result = await shellExec(adbRun + ' shell pm list packages -3') diff --git a/lib/inquirer.js b/lib/inquirer.js index 7c82860..270226f 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -112,4 +112,13 @@ module.exports = { },]; return inquirer.prompt(questions); }, + restoreAnyApp: async () => { + Language.setActiveLang(globalVariables.language) + const questions = [{ + type: "input", + name: "removeAnyApp", + message: await Language.get('remove-any-app-message'), + },]; + return inquirer.prompt(questions); + }, }; \ No newline at end of file diff --git a/pages/pages.js b/pages/pages.js index 50f4c83..74d39e9 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -126,9 +126,19 @@ module.exports = { module.exports.mainMenu() }, - batchInstallApps: async () => { + removeAnyApp: async () => { common.header('main-menu-item-6') common.log('main-menu-item-6') + const value = await inquirer.restoreAnyApp(); + await adb.restoreAnyApk(value) + common.dualLog('removing-apps-complete', 'green') + await common.pause(2000) + module.exports.mainMenu() + }, + + batchInstallApps: async () => { + common.header('main-menu-item-7') + common.log('main-menu-item-7') let apkList = await files.getListOfAPk('./my-apk/') await files.renameLocalApk(apkList) @@ -145,8 +155,8 @@ module.exports = { }, batchRemoveInstalledApps: async () => { - common.header('main-menu-item-7') - common.log('main-menu-item-7') + common.header('main-menu-item-8') + common.log('main-menu-item-8') value = await adb.getInstalledPacakges() @@ -176,14 +186,7 @@ module.exports = { selectLanguage: async () => { common.header('Select Language') common.log('Select Language') - // const value = await inquirer.connectionType() const v = await inquirer.LanguageSelect() - // connected = await adb.watchConnection(value) - // if (connected != true) { - // module.exports.connectWatch() - // } else { - // module.exports.mainMenu() - // } return v }, @@ -199,6 +202,7 @@ module.exports = { menu_7 = await Language.get('main-menu-item-7') menu_8 = await Language.get('main-menu-item-8') menu_9 = await Language.get('main-menu-item-9') + menu_10 = await Language.get('main-menu-item-10') switch (mainMenuSelection.mainMenu) { case menu_1.toLowerCase(): @@ -217,15 +221,18 @@ module.exports = { module.exports.restoreAnyApp() break; case menu_6.toLowerCase(): - module.exports.batchInstallApps() + module.exports.removeAnyApp() break; case menu_7.toLowerCase(): - module.exports.batchRemoveInstalledApps() + module.exports.batchInstallApps() break; case menu_8.toLowerCase(): - module.exports.connectWatch() + module.exports.batchRemoveInstalledApps() break; case menu_9.toLowerCase(): + module.exports.connectWatch() + break; + case menu_10.toLowerCase(): break; default: // code block From e9df7f047f0a4717d623fdc19ab8e6368feca819 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 21:04:55 +0100 Subject: [PATCH 11/14] delete lock file --- logger.lock | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 logger.lock diff --git a/logger.lock b/logger.lock deleted file mode 100644 index ee3e3b3..0000000 --- a/logger.lock +++ /dev/null @@ -1,11 +0,0 @@ -{ - "lastUpdatedBy": "RunTIme", - "FrontEndDriver": { - "startTime": 1588231747040, - "pid": 26780 - }, - "RunTIme": { - "startTime": 1592986481974, - "pid": 25068 - } -} \ No newline at end of file From 3dc25a6cc28e6a4b983c9c9c55d133006428f2c6 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 21:05:02 +0100 Subject: [PATCH 12/14] re npm i --- package-lock.json | 263 +++++++--------------------------------------- package.json | 2 - 2 files changed, 40 insertions(+), 225 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9e0bc4..9d50964 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,11 +55,6 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "ajv": { "version": "6.12.4", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", @@ -80,9 +75,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "4.2.1", @@ -111,11 +106,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "async": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", - "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -188,11 +178,6 @@ "chalk": "^1.1.3" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -210,14 +195,6 @@ "supports-color": "^2.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -267,11 +244,6 @@ "cli-color": "0.3.2" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -669,60 +641,6 @@ "slash": "^3.0.0" } }, - "google-translate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/google-translate/-/google-translate-3.0.0.tgz", - "integrity": "sha512-NQrP9gnFBO9LpEAN7Ia4kiyycbubqG+vdmxhQE5hjhAeU6U2n1vM7Kb1wtI3YU7Ghk3+bdfiRiAr6Zhox/UV2w==", - "requires": { - "async": "3.1.0", - "he": "1.2.0", - "request": "2.88.0", - "underscore": "1.9.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - } - } - }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -748,13 +666,6 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } } }, "has-flag": { @@ -762,16 +673,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "help": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/help/-/help-3.0.2.tgz", - "integrity": "sha1-luGQ1KCkU7icLLSwWrOOOo+f2t0=" - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -827,6 +728,21 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "interpret": { @@ -1040,22 +956,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "noptd": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/noptd/-/noptd-2.0.1.tgz", - "integrity": "sha1-sDV66CLk1odjFvwveV5N1FauVxU=", - "requires": { - "nopt": "~3.0.1" - } - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -1195,11 +1095,6 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "pretty-bytes": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.1.0.tgz", - "integrity": "sha512-wa5+qGVg9Yt7PB6rYm3kXlKzgzgivYTLRandezh43jjRqgyDyP+9YxfJpJiLs9yKD1WeU8/OvtToWpW7255FtA==" - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1252,94 +1147,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, - "remote-file-size": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/remote-file-size/-/remote-file-size-3.0.5.tgz", - "integrity": "sha512-wM0Djgzpd2ob7d79XeScnmRqr6ulJMeLrVJIiW/CYOkIjtvsYV3FPRxNP5HHh2wH/CeHGOWYAKrWEr93EUkSUg==", - "requires": { - "help": "~3.0.2", - "noptd": "~2.0.0", - "pretty-bytes": "~5.1.0", - "request": "~2.87.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "requires": { - "punycode": "^1.4.1" - } - } - } - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1493,6 +1300,21 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } } }, "string_decoder": { @@ -1504,17 +1326,17 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } @@ -1604,11 +1426,6 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, - "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" - }, "unique-temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", diff --git a/package.json b/package.json index 1612351..17a8d8f 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,10 @@ "clui": "^0.3.6", "figlet": "^1.3.0", "get-files-in": "^1.2.0", - "google-translate": "^3.0.0", "inquirer": "^7.1.0", "node-fetch": "^2.6.0", "perfect-logger": "^2.0.1", "pkg": "^4.4.7", - "remote-file-size": "^3.0.5", "shell-exec": "^1.0.2", "shelljs": "^0.8.4" }, From 8a0d5df4068b9971445c5c3769e84a5a99147a92 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 21:05:41 +0100 Subject: [PATCH 13/14] update to ignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index a09e2b1..fe18abe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,7 @@ node_modules/ -data/MiWatch.json data/apps/*.apk release/ data/*.log logger.lock null.log -.gitignore my_apk/*.apk \ No newline at end of file From ac1b5a4f15f1f6c6417859b13c3c0e82803a35f5 Mon Sep 17 00:00:00 2001 From: "karl.hudgell" Date: Sat, 29 Aug 2020 21:47:42 +0100 Subject: [PATCH 14/14] working --- app.js | 12 +----------- buildRelease.sh | 9 ++++++--- lib/inquirer.js | 3 ++- pages/pages.js | 10 ++++------ 4 files changed, 13 insertions(+), 21 deletions(-) diff --git a/app.js b/app.js index 6665b1b..3d797e8 100644 --- a/app.js +++ b/app.js @@ -1,14 +1,4 @@ const pages = require('./pages/pages') -const Language = require("@shypes/language-translator"); -const globalVariables = require('./lib/globalVars'); - -async function main() { - lang = await pages.selectLanguage(); - globalVariables.language = lang.selection - await pages.connectWatch() -} - -main() - +pages.selectLanguage() diff --git a/buildRelease.sh b/buildRelease.sh index 820abd6..f9ab3e9 100644 --- a/buildRelease.sh +++ b/buildRelease.sh @@ -8,15 +8,18 @@ mv ./release/miwatchkleaner-macos-* ./release/MacOs && \ cp ./data/xiaomiPackageRemovalList.json ./release/Windows/data/ && \ cp ./data/xiaomiPackageRemovalList.json ./release/MacOS/data/ && \ cp ./data/xiaomiPackageRemovalList.json ./release/Linux/data/ && \ +cp -rf ./lang/ ./release/Windows/ && \ +cp -rf ./lang/ ./release/MacOS/ && \ +cp -rf ./lang/ ./release/Linux/ && \ chmod 0777 ./release/**/adb && \ chmod 0777 ./release/**/miwatchkleaner-* && \ chmod +x ./release/**/adb && \ chmod +x ./release/**/miwatchkleaner-* && \ cd release/MacOS/ && \ -tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ my_apk/ miwatchkleaner-macos-x64 && \ +tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ my_apk/ lang/ miwatchkleaner-macos-x64 && \ cd .. && \ cd Linux/ && \ -tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ my_apk/ miwatchkleaner-linux-x64 && \ +tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ my_apk/ lang/ miwatchkleaner-linux-x64 && \ cd .. && \ cd Windows/ && \ -zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ miwatchkleaner-win-x86.exe \ No newline at end of file +zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ lang/ miwatchkleaner-win-x86.exe \ No newline at end of file diff --git a/lib/inquirer.js b/lib/inquirer.js index 270226f..b776c29 100644 --- a/lib/inquirer.js +++ b/lib/inquirer.js @@ -20,6 +20,7 @@ module.exports = { await Language.get('main-menu-item-6'), await Language.get('main-menu-item-7'), await Language.get('main-menu-item-8'), + await Language.get('main-menu-item-9'), ], filter: function (val) { return val.toLowerCase(); @@ -112,7 +113,7 @@ module.exports = { },]; return inquirer.prompt(questions); }, - restoreAnyApp: async () => { + removeAnyApp: async () => { Language.setActiveLang(globalVariables.language) const questions = [{ type: "input", diff --git a/pages/pages.js b/pages/pages.js index 74d39e9..9850710 100644 --- a/pages/pages.js +++ b/pages/pages.js @@ -4,6 +4,7 @@ const inquirer = require('../lib/inquirer'); const files = require('../lib/files') const logger = require('perfect-logger'); const Language = require("@shypes/language-translator"); +const globalVariables = require('../lib/globalVars'); const adb = require('../lib/adb'); logger.info(process.platform + " detected") @@ -129,7 +130,7 @@ module.exports = { removeAnyApp: async () => { common.header('main-menu-item-6') common.log('main-menu-item-6') - const value = await inquirer.restoreAnyApp(); + const value = await inquirer.removeAnyApp(); await adb.restoreAnyApk(value) common.dualLog('removing-apps-complete', 'green') await common.pause(2000) @@ -187,7 +188,8 @@ module.exports = { common.header('Select Language') common.log('Select Language') const v = await inquirer.LanguageSelect() - return v + globalVariables.language = v.selection + module.exports.connectWatch() }, mainMenu: async () => { @@ -202,7 +204,6 @@ module.exports = { menu_7 = await Language.get('main-menu-item-7') menu_8 = await Language.get('main-menu-item-8') menu_9 = await Language.get('main-menu-item-9') - menu_10 = await Language.get('main-menu-item-10') switch (mainMenuSelection.mainMenu) { case menu_1.toLowerCase(): @@ -230,9 +231,6 @@ module.exports = { module.exports.batchRemoveInstalledApps() break; case menu_9.toLowerCase(): - module.exports.connectWatch() - break; - case menu_10.toLowerCase(): break; default: // code block