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: