Merge branch '3.1.0' of Karl/MiWatchKleaner into master
This commit is contained in:
commit
a2cb5a7a49
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,8 +1,7 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
data/MiWatch.json
|
|
||||||
data/apps/*.apk
|
data/apps/*.apk
|
||||||
release/
|
release/
|
||||||
data/*.log
|
data/*.log
|
||||||
logger.lock
|
logger.lock
|
||||||
null.log
|
null.log
|
||||||
.gitignore
|
my_apk/*.apk
|
3
app.js
3
app.js
@ -1,3 +1,4 @@
|
|||||||
const pages = require('./pages/pages')
|
const pages = require('./pages/pages')
|
||||||
|
|
||||||
pages.connectWatch();
|
pages.selectLanguage()
|
||||||
|
|
||||||
|
@ -8,15 +8,18 @@ mv ./release/miwatchkleaner-macos-* ./release/MacOs && \
|
|||||||
cp ./data/xiaomiPackageRemovalList.json ./release/Windows/data/ && \
|
cp ./data/xiaomiPackageRemovalList.json ./release/Windows/data/ && \
|
||||||
cp ./data/xiaomiPackageRemovalList.json ./release/MacOS/data/ && \
|
cp ./data/xiaomiPackageRemovalList.json ./release/MacOS/data/ && \
|
||||||
cp ./data/xiaomiPackageRemovalList.json ./release/Linux/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/**/adb && \
|
||||||
chmod 0777 ./release/**/miwatchkleaner-* && \
|
chmod 0777 ./release/**/miwatchkleaner-* && \
|
||||||
chmod +x ./release/**/adb && \
|
chmod +x ./release/**/adb && \
|
||||||
chmod +x ./release/**/miwatchkleaner-* && \
|
chmod +x ./release/**/miwatchkleaner-* && \
|
||||||
cd release/MacOS/ && \
|
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 .. && \
|
||||||
cd Linux/ && \
|
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 .. && \
|
||||||
cd Windows/ && \
|
cd Windows/ && \
|
||||||
zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ miwatchkleaner-win-x86.exe
|
zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ lang/ miwatchkleaner-win-x86.exe
|
@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"apps": [
|
"apps": [
|
||||||
"com.android.messaging",
|
"com.android.messaging",
|
||||||
"com.eg.android.AlipayGphone",
|
|
||||||
"com.google.android.clockwork.flashlight",
|
"com.google.android.clockwork.flashlight",
|
||||||
"com.google.android.clockwork.gestures.tutorial",
|
"com.google.android.clockwork.gestures.tutorial",
|
||||||
"com.google.android.clockwork.lesetup",
|
"com.google.android.clockwork.lesetup",
|
||||||
@ -12,7 +11,6 @@
|
|||||||
"com.google.android.wearable.overlay.common.baiji",
|
"com.google.android.wearable.overlay.common.baiji",
|
||||||
"com.google.android.wearable.overlay.helium.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",
|
|
||||||
"com.google.android.wearable.overlay.home.baiji.tiles",
|
"com.google.android.wearable.overlay.home.baiji.tiles",
|
||||||
"com.gotokeep.keep",
|
"com.gotokeep.keep",
|
||||||
"com.onetrack.watch",
|
"com.onetrack.watch",
|
||||||
|
56
lang/en.json
Normal file
56
lang/en.json
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"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": "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?",
|
||||||
|
"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",
|
||||||
|
"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",
|
||||||
|
"restoring-apps-complete": "Restoring Apps Complete",
|
||||||
|
"batch-install-apps-complete": "Batch Install Apps Complete",
|
||||||
|
"connect-to-watch": "Connect to watch",
|
||||||
|
"connected-via-usb": "Connected via USB",
|
||||||
|
"connected-via-wifi": "Connected via Wifi",
|
||||||
|
"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",
|
||||||
|
"remove-any-app-message": "What App do you want to remove?",
|
||||||
|
"removing-apps-complete": "Removing Apps Complete"
|
||||||
|
}
|
55
lang/es.json
Normal file
55
lang/es.json
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"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": "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?",
|
||||||
|
"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",
|
||||||
|
"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",
|
||||||
|
"remove-any-app-message": "¿Qué aplicación quieres eliminar?",
|
||||||
|
"removing-apps-complete": "Eliminación de aplicaciones completa"
|
||||||
|
}
|
186
lib/adb.js
186
lib/adb.js
@ -1,24 +1,178 @@
|
|||||||
const gfin = require('get-files-in')
|
const gfin = require('get-files-in')
|
||||||
|
const logger = require('perfect-logger');
|
||||||
const shellExec = require('shell-exec')
|
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 { dualLog } = require('./common');
|
||||||
|
|
||||||
|
if (process.platform === 'win32' || process.platform === 'win64') {
|
||||||
|
adbRun = 'adb'
|
||||||
|
} else {
|
||||||
|
adbRun = './adb'
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getListOfAPk: () => {
|
installApk: async (element) => {
|
||||||
this.apkListToInstall = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false)
|
Language.setActiveLang(globalVariables.language)
|
||||||
},
|
result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) {
|
||||||
installApk: async () => {
|
if (result.stderr != '') {
|
||||||
await module.exports.getListOfAPk()
|
common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red')
|
||||||
for (let element of this.apkListToInstall) {
|
}
|
||||||
if (process.platform === 'win32' || process.platform === 'win64') {
|
common.dualLog(element + ' - ' + result.stdout)
|
||||||
await shellExec('adb install -r ' + element).then(function (result) {
|
|
||||||
console.log('Installing ' + 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')
|
||||||
} else {
|
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('./adb install -r ' + element).then(function (result) {
|
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('Installing ' + element + ' - ' + result.stdout);
|
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) {
|
||||||
|
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) {
|
||||||
|
common.log(result)
|
||||||
|
common.dualLog('alberto-locale-activated-on-watch')
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
// console.log(chalk.green('Removal Complete'))
|
|
||||||
},
|
},
|
||||||
|
removeApk: async (package) => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
|
result = await shellExec(adbRun + ' uninstall ' + package)
|
||||||
|
if (result.stderr != '') {
|
||||||
|
common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red')
|
||||||
|
} else {
|
||||||
|
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 != '') {
|
||||||
|
common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red')
|
||||||
|
} else {
|
||||||
|
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 != '') {
|
||||||
|
common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red')
|
||||||
|
} else {
|
||||||
|
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 != '') {
|
||||||
|
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('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')
|
||||||
|
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
|
||||||
|
}
|
||||||
|
},
|
||||||
|
killAdbServer: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
|
let result = await shellExec(adbRun + ' kill-server')
|
||||||
|
// common.log('')
|
||||||
|
// common.dualLog('restarting-adb' + ' ' + result.stderr, 'red')
|
||||||
|
},
|
||||||
|
watchConnection: async (value) => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
|
if (value.connection === "usb") {
|
||||||
|
await module.exports.killAdbServer()
|
||||||
|
result = await shellExec(adbRun + ' devices')
|
||||||
|
console.log(result.stdout)
|
||||||
|
if (result.stdout.includes('device', 15)) {
|
||||||
|
common.dualLog(await Language.get('connected-via-usb', 'green'))
|
||||||
|
await common.pause(3000)
|
||||||
|
globalVariables.localUSB = "X"
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
common.dualLog(await Language.get('not-found', 'red'))
|
||||||
|
await common.pause(2000)
|
||||||
|
common.dualLog(await Language.get('try-again', 'white'))
|
||||||
|
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 ')) {
|
||||||
|
common.dualLog(await Language.get('connected', 'green'))
|
||||||
|
globalVariables.localUSB = ""
|
||||||
|
globalVariables.miWatchIpaddress = value.connectWifi
|
||||||
|
await common.pause(3000)
|
||||||
|
common.dualLog(await Language.get('connect-wifi-complete', 'green'))
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
if (result.stdout.includes('failed to authenticate')) {
|
||||||
|
common.dualLog(await Language.get('not-authenticated', 'red'))
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
common.dualLog(result.stdout, 'red')
|
||||||
|
}
|
||||||
|
await common.pause(2000)
|
||||||
|
common.dualLog('try-again', '')
|
||||||
|
await common.pause(1000)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
@ -5,14 +5,17 @@ const fs = require('fs')
|
|||||||
var pjson = require('../package.json');
|
var pjson = require('../package.json');
|
||||||
const fetch = require('node-fetch');
|
const fetch = require('node-fetch');
|
||||||
var shell = require('shelljs');
|
var shell = require('shelljs');
|
||||||
|
const logger = require('perfect-logger');
|
||||||
|
const Language = require("@shypes/language-translator");
|
||||||
const globalVariables = require('../lib/globalVars');
|
const globalVariables = require('../lib/globalVars');
|
||||||
|
var chalkRainbow = require('chalk-rainbow')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
header: (page) => {
|
header: async (page) => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
clear();
|
clear();
|
||||||
console.log(
|
console.log(
|
||||||
chalk.red(
|
chalkRainbow(
|
||||||
figlet.textSync('MiWatch Kleaner', {
|
figlet.textSync('MiWatch Kleaner', {
|
||||||
horizontalLayout: 'full'
|
horizontalLayout: 'full'
|
||||||
})
|
})
|
||||||
@ -20,13 +23,12 @@ module.exports = {
|
|||||||
);
|
);
|
||||||
console.log(chalk.red(' ' + pjson.version));
|
console.log(chalk.red(' ' + pjson.version));
|
||||||
console.log();
|
console.log();
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
chalk.red(
|
chalk.red(
|
||||||
'-------------------------------------------------------------------------------------------------------'
|
'-------------------------------------------------------------------------------------------------------'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
console.log(chalk.blue(page))
|
console.log(chalk.blue(await Language.get(page)))
|
||||||
module.exports.connectionCheck()
|
module.exports.connectionCheck()
|
||||||
console.log(chalk.red('----------'))
|
console.log(chalk.red('----------'))
|
||||||
},
|
},
|
||||||
@ -34,19 +36,22 @@ module.exports = {
|
|||||||
await new Promise(resolve => setTimeout(resolve, time));
|
await new Promise(resolve => setTimeout(resolve, time));
|
||||||
},
|
},
|
||||||
connectionCheck: async () => {
|
connectionCheck: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
if (globalVariables.localUSB === "X") {
|
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 != "") {
|
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 === "") {
|
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) => {
|
downloadFile: async (url, path) => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const res = await fetch(url);
|
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);
|
const fileStream = fs.createWriteStream(path);
|
||||||
res.body.pipe(fileStream);
|
res.body.pipe(fileStream);
|
||||||
res.body.on("error", (err) => {
|
res.body.on("error", (err) => {
|
||||||
@ -57,6 +62,12 @@ module.exports = {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
downloadSize: async (url) => {
|
||||||
|
remote(url, function (err, o) {
|
||||||
|
console.log(o)
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
},
|
||||||
getCompatibleAppsList: async () => {
|
getCompatibleAppsList: async () => {
|
||||||
let settings = { method: "Get" };
|
let settings = { method: "Get" };
|
||||||
const response = await fetch("http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/compatibleApps.json", settings)
|
const response = await fetch("http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/compatibleApps.json", settings)
|
||||||
@ -66,4 +77,31 @@ module.exports = {
|
|||||||
clearApkFolder: async () => {
|
clearApkFolder: async () => {
|
||||||
await shell.rm('-rf', './data/apps/*.apk');
|
await shell.rm('-rf', './data/apps/*.apk');
|
||||||
},
|
},
|
||||||
|
log: async (item) => {
|
||||||
|
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)))
|
||||||
|
break;
|
||||||
|
case 'red':
|
||||||
|
console.log(chalk.redBright(await Language.get(item)))
|
||||||
|
break;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dualLog: async (item, colour) => {
|
||||||
|
await module.exports.log(item)
|
||||||
|
await module.exports.print(item, colour)
|
||||||
|
}
|
||||||
}
|
}
|
17
lib/files.js
17
lib/files.js
@ -1,7 +1,12 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const tiny = require("@peterpanhihi/tiny");
|
const tiny = require("@peterpanhihi/tiny");
|
||||||
const { resolve } = require('path');
|
const getFilesIn = require('get-files-in')
|
||||||
|
const globalVariables = require('../lib/globalVars');
|
||||||
|
const Language = require("@shypes/language-translator");
|
||||||
|
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getCurrentDirectoryBase: () => {
|
getCurrentDirectoryBase: () => {
|
||||||
@ -39,5 +44,13 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
resolve(x / y);
|
resolve(x / y);
|
||||||
}).catch(err => NaN)
|
}).catch(err => NaN)
|
||||||
}
|
},
|
||||||
|
getListOfAPk: (path) => {
|
||||||
|
const result = getFilesIn(path, matchFiletypes = ["apk"], checkSubDirectories = false)
|
||||||
|
return result
|
||||||
|
},
|
||||||
|
getLanguageFiles: () => {
|
||||||
|
const result = getFilesIn('./lang/', matchFiletypes = ["json"], checkSubDirectories = false)
|
||||||
|
return result
|
||||||
|
},
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
class globalVariables {
|
class globalVariables {
|
||||||
localUSB = "";
|
localUSB = "";
|
||||||
miWatchIpaddress = "";
|
miWatchIpaddress = "";
|
||||||
|
language = "";
|
||||||
usersList=[];
|
usersList=[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,37 +1,53 @@
|
|||||||
const inquirer = require("inquirer");
|
const inquirer = require("inquirer");
|
||||||
const files = require("./files");
|
const files = require("./files");
|
||||||
const common = require("./common");
|
const common = require("./common");
|
||||||
|
const Language = require("@shypes/language-translator");
|
||||||
// let compatibleApps
|
const globalVariables = require('../lib/globalVars');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
mainMenu: () => {
|
mainMenu: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const questions = [{
|
const questions = [{
|
||||||
type: "list",
|
type: "list",
|
||||||
name: "mainMenu",
|
name: "mainMenu",
|
||||||
message: "What do you want to do?",
|
message: await Language.get('main-menu-question'),
|
||||||
choices: [
|
choices: [
|
||||||
// "Connect to MiWatch",
|
await Language.get('main-menu-item-1'),
|
||||||
"1-Click Karl0ss Klean",
|
await Language.get('main-menu-item-2'),
|
||||||
"Remove Xiaomi Apps",
|
await Language.get('main-menu-item-3'),
|
||||||
"Restore Xiaomi Apps",
|
await Language.get('main-menu-item-4'),
|
||||||
"Install Compatible Apps",
|
await Language.get('main-menu-item-5'),
|
||||||
"Restore ANY app",
|
await Language.get('main-menu-item-6'),
|
||||||
"Batch Install APKs",
|
await Language.get('main-menu-item-7'),
|
||||||
"Batch Remove Installed Apps",
|
await Language.get('main-menu-item-8'),
|
||||||
"Quit"
|
await Language.get('main-menu-item-9'),
|
||||||
],
|
],
|
||||||
filter: function (val) {
|
filter: function (val) {
|
||||||
return val.toLowerCase();
|
return val.toLowerCase();
|
||||||
},
|
},
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
connectionType: () => {
|
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 = [{
|
const questions = [{
|
||||||
type: "list",
|
type: "list",
|
||||||
name: "connection",
|
name: "connection",
|
||||||
message: "How do you want to connect?",
|
message: await Language.get('connection-type-message'),
|
||||||
choices: [
|
choices: [
|
||||||
"USB",
|
"USB",
|
||||||
"Wifi"
|
"Wifi"
|
||||||
@ -39,29 +55,32 @@ module.exports = {
|
|||||||
filter: function (val) {
|
filter: function (val) {
|
||||||
return val.toLowerCase();
|
return val.toLowerCase();
|
||||||
},
|
},
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
connectWifi: () => {
|
connectWifi: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const questions = [{
|
const questions = [{
|
||||||
type: "input",
|
type: "input",
|
||||||
name: "connectWifi",
|
name: "connectWifi",
|
||||||
message: "What is your MiWatch IpAdress?",
|
message: await Language.get('connect-wifi-message'),
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
removeAppsList: async () => {
|
removeAppsList: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const packages = await files.loadPackageList();
|
const packages = await files.loadPackageList();
|
||||||
|
|
||||||
const questions = [{
|
const questions = [{
|
||||||
type: "checkbox",
|
type: "checkbox",
|
||||||
name: "removeAppsList",
|
name: "removeAppsList",
|
||||||
message: "What apps do you want to restore?",
|
message: await Language.get('restore-app-message'),
|
||||||
choices: packages.apps,
|
choices: packages.apps,
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
compatibleApps: async () => {
|
compatibleApps: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const compatibleApps = await common.getCompatibleAppsList()
|
const compatibleApps = await common.getCompatibleAppsList()
|
||||||
const appList = []
|
const appList = []
|
||||||
for (let element of compatibleApps) {
|
for (let element of compatibleApps) {
|
||||||
@ -70,26 +89,37 @@ module.exports = {
|
|||||||
const questions = [{
|
const questions = [{
|
||||||
type: "checkbox",
|
type: "checkbox",
|
||||||
name: "removeAppsList",
|
name: "removeAppsList",
|
||||||
message: "What apps do you want to Install?",
|
message: await Language.get('install-compatible-apps-message'),
|
||||||
choices: appList,
|
choices: appList,
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
installedApps: async (installedApps) => {
|
installedApps: async (installedApps) => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const questions = [{
|
const questions = [{
|
||||||
type: "checkbox",
|
type: "checkbox",
|
||||||
name: "removeAppsList",
|
name: "removeAppsList",
|
||||||
message: "What Installed apps do you want to remove?",
|
message: await Language.get('remove-installed-apps-message'),
|
||||||
choices: installedApps,
|
choices: installedApps,
|
||||||
}, ];
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
restoreAnyApp: async () => {
|
restoreAnyApp: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
const questions = [{
|
const questions = [{
|
||||||
type: "input",
|
type: "input",
|
||||||
name: "restoreAnyApp",
|
name: "restoreAnyApp",
|
||||||
message: "What App do you want to restore?",
|
message: await Language.get('restore-any-app-message'),
|
||||||
}, ];
|
},];
|
||||||
|
return inquirer.prompt(questions);
|
||||||
|
},
|
||||||
|
removeAnyApp: async () => {
|
||||||
|
Language.setActiveLang(globalVariables.language)
|
||||||
|
const questions = [{
|
||||||
|
type: "input",
|
||||||
|
name: "removeAnyApp",
|
||||||
|
message: await Language.get('remove-any-app-message'),
|
||||||
|
},];
|
||||||
return inquirer.prompt(questions);
|
return inquirer.prompt(questions);
|
||||||
},
|
},
|
||||||
};
|
};
|
11
logger.lock
11
logger.lock
@ -1,11 +0,0 @@
|
|||||||
{
|
|
||||||
"lastUpdatedBy": "RunTIme",
|
|
||||||
"FrontEndDriver": {
|
|
||||||
"startTime": 1588231747040,
|
|
||||||
"pid": 26780
|
|
||||||
},
|
|
||||||
"RunTIme": {
|
|
||||||
"startTime": 1592986481974,
|
|
||||||
"pid": 25068
|
|
||||||
}
|
|
||||||
}
|
|
118
package-lock.json
generated
118
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "miwatchkleaner",
|
"name": "miwatchkleaner",
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -45,6 +45,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@peterpanhihi/tiny/-/tiny-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@peterpanhihi/tiny/-/tiny-2.0.0.tgz",
|
||||||
"integrity": "sha512-usAoksj49559JLAsQXmrE5wOV6A055icErp8jpJDCicfojwEVPaSLk5EZ1EXhcgIuqjSNkzCOXu0gSdm3Std+w=="
|
"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": {
|
"@types/color-name": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||||
@ -70,9 +75,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ansi-regex": {
|
"ansi-regex": {
|
||||||
"version": "5.0.0",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||||
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
|
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
||||||
},
|
},
|
||||||
"ansi-styles": {
|
"ansi-styles": {
|
||||||
"version": "4.2.1",
|
"version": "4.2.1",
|
||||||
@ -165,6 +170,38 @@
|
|||||||
"supports-color": "^7.1.0"
|
"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-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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"supports-color": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"chardet": {
|
"chardet": {
|
||||||
"version": "0.7.0",
|
"version": "0.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
|
||||||
@ -254,14 +291,6 @@
|
|||||||
"assert-plus": "^1.0.0"
|
"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": {
|
"deep-is": {
|
||||||
"version": "0.1.3",
|
"version": "0.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
|
||||||
@ -631,6 +660,14 @@
|
|||||||
"har-schema": "^2.0.0"
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
"has-flag": {
|
"has-flag": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
@ -691,6 +728,21 @@
|
|||||||
"string-width": "^4.1.0",
|
"string-width": "^4.1.0",
|
||||||
"strip-ansi": "^6.0.0",
|
"strip-ansi": "^6.0.0",
|
||||||
"through": "^2.3.6"
|
"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": {
|
"interpret": {
|
||||||
@ -880,11 +932,6 @@
|
|||||||
"minimist": "^1.2.5"
|
"minimist": "^1.2.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ms": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
|
||||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
|
||||||
},
|
|
||||||
"multistream": {
|
"multistream": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz",
|
||||||
@ -1100,14 +1147,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||||
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
|
"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": {
|
"request": {
|
||||||
"version": "2.88.2",
|
"version": "2.88.2",
|
||||||
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
|
||||||
@ -1261,6 +1300,21 @@
|
|||||||
"emoji-regex": "^8.0.0",
|
"emoji-regex": "^8.0.0",
|
||||||
"is-fullwidth-code-point": "^3.0.0",
|
"is-fullwidth-code-point": "^3.0.0",
|
||||||
"strip-ansi": "^6.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": {
|
"string_decoder": {
|
||||||
@ -1272,17 +1326,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"strip-ansi": {
|
"strip-ansi": {
|
||||||
"version": "6.0.0",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||||
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
|
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-regex": "^5.0.0"
|
"ansi-regex": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"supports-color": {
|
"supports-color": {
|
||||||
"version": "7.1.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
|
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "miwatchkleaner",
|
"name": "miwatchkleaner",
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"description": "MiWatch Cleaning Tool",
|
"description": "MiWatch Cleaning Tool",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
"bin": "app.js",
|
"bin": "app.js",
|
||||||
@ -16,7 +16,9 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@peterpanhihi/tiny": "^2.0.0",
|
"@peterpanhihi/tiny": "^2.0.0",
|
||||||
|
"@shypes/language-translator": "^2.0.15",
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
|
"chalk-rainbow": "^1.0.0",
|
||||||
"clear": "^0.1.0",
|
"clear": "^0.1.0",
|
||||||
"clui": "^0.3.6",
|
"clui": "^0.3.6",
|
||||||
"figlet": "^1.3.0",
|
"figlet": "^1.3.0",
|
||||||
|
450
pages/pages.js
450
pages/pages.js
@ -1,12 +1,11 @@
|
|||||||
const chalk = require('chalk');
|
const chalk = require('chalk');
|
||||||
const common = require('../lib/common');
|
const common = require('../lib/common');
|
||||||
const inquirer = require('../lib/inquirer');
|
const inquirer = require('../lib/inquirer');
|
||||||
const shellExec = require('shell-exec')
|
|
||||||
const files = require('../lib/files')
|
const files = require('../lib/files')
|
||||||
const getFilesIn = require('get-files-in')
|
const logger = require('perfect-logger');
|
||||||
let logger = require('perfect-logger');
|
const Language = require("@shypes/language-translator");
|
||||||
const globalVariables = require('../lib/globalVars');
|
const globalVariables = require('../lib/globalVars');
|
||||||
|
const adb = require('../lib/adb');
|
||||||
|
|
||||||
logger.info(process.platform + " detected")
|
logger.info(process.platform + " detected")
|
||||||
if (process.platform === 'win32' || process.platform === 'win64') {
|
if (process.platform === 'win32' || process.platform === 'win64') {
|
||||||
@ -22,54 +21,77 @@ logger.initialize('RunTIme', {
|
|||||||
});
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
removeCompatibleApps: async () => {
|
oneClick: async () => {
|
||||||
let installedAppList
|
common.log('main-menu-item-1')
|
||||||
common.header('Remove Installed Apps')
|
common.header('main-menu-item-1')
|
||||||
logger.info('Remove Installed Apps')
|
common.print('remove-xiaomi-apps', 'whiteBright')
|
||||||
await shellExec(adbRun + ' shell pm list packages -3').then(async function (result) {
|
const removalPackagesList = files.loadPackageList()
|
||||||
logger.info('Packages recieved from watch')
|
for (let package of removalPackagesList.apps) {
|
||||||
if (result.stderr.includes('error')) {
|
await adb.removeXiaomiApk(package)
|
||||||
logger.info(result.stderr)
|
}
|
||||||
console.log(chalk.red('Device not authorised'))
|
common.print('removal-complete', 'green')
|
||||||
common.pause(3000)
|
await common.pause(2000)
|
||||||
await shellExec(adbRun + ' kill-server').then(async function (result) {
|
common.log('removal-complete')
|
||||||
logger.info('Restarting ADB')
|
common.log('compatible-apps')
|
||||||
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);
|
|
||||||
|
|
||||||
for (let element of value.removeAppsList) {
|
await common.clearApkFolder()
|
||||||
console.log('Removing ' + element)
|
|
||||||
logger.info('Removing ' + element)
|
const compatibleApps = await common.getCompatibleAppsList()
|
||||||
const package = element.substring(8)
|
|
||||||
await shellExec(adbRun + ' uninstall ' + package).then(async function (result) {
|
console.log(chalk.whiteBright('----------'))
|
||||||
console.log(element + ' - ' + result.stdout);
|
common.print('downloading-compatible-apps', 'whiteBright')
|
||||||
logger.info(element + ' - ' + result.stdout);
|
|
||||||
});
|
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'))
|
||||||
}
|
}
|
||||||
console.log(chalk.green('Removed Selected User Apps'))
|
|
||||||
logger.info('Removed Selected User Apps')
|
|
||||||
await common.pause(2000)
|
|
||||||
module.exports.mainMenu()
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
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()
|
||||||
},
|
},
|
||||||
compatibleApps: async () => {
|
|
||||||
logger.info("Compatible Apps")
|
|
||||||
common.header('Install Compatible Apps')
|
|
||||||
|
|
||||||
|
removeXiaomiApps: async () => {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
common.dualLog('removal-complete', 'green')
|
||||||
|
await common.pause(2000)
|
||||||
|
module.exports.mainMenu()
|
||||||
|
},
|
||||||
|
|
||||||
|
restoreXiaomiApps: async () => {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
common.dualLog('restoring-apps-complete', 'green')
|
||||||
|
await common.pause(2000)
|
||||||
|
module.exports.mainMenu()
|
||||||
|
},
|
||||||
|
|
||||||
|
installCompatibleApps: async () => {
|
||||||
|
common.header('main-menu-item-4')
|
||||||
|
common.log('main-menu-item-4')
|
||||||
const compatibleApps = await common.getCompatibleAppsList()
|
const compatibleApps = await common.getCompatibleAppsList()
|
||||||
const value = await inquirer.compatibleApps();
|
const value = await inquirer.compatibleApps();
|
||||||
|
|
||||||
@ -84,277 +106,131 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const apkList = await getFilesIn('./data/apps', matchFiletypes = ['apk'], checkSubDirectories = false)
|
const apkList = await files.getListOfAPk('./data/apps')
|
||||||
|
|
||||||
for (let element of apkList) {
|
for (let package of apkList) {
|
||||||
console.log('Installing ' + element)
|
common.dualLog('installing', 'whiteBright')
|
||||||
logger.info('Installing ' + element)
|
await adb.installApk(package)
|
||||||
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(chalk.green('Compatible Apps Installed'))
|
common.dualLog('compatible-apps-installed', 'green')
|
||||||
logger.info('Compatible Apps Installed')
|
|
||||||
await common.pause(2000)
|
await common.pause(2000)
|
||||||
module.exports.mainMenu()
|
module.exports.mainMenu()
|
||||||
},
|
},
|
||||||
removeApps: async () => {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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 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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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()
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
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()
|
|
||||||
|
|
||||||
for (const element of compatibleApps) {
|
|
||||||
if (element.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')
|
|
||||||
} catch (error) {
|
|
||||||
logger.info('Downloading Latest ' + element.name + ' FAILED')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const apkList = await getFilesIn('./data/apps', matchFiletypes = ['apk'], checkSubDirectories = false)
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
console.log(chalk.green('Compatible Apps Installed'))
|
|
||||||
logger.info('Compatible Apps Installed')
|
|
||||||
await common.pause(2000)
|
|
||||||
module.exports.mainMenu()
|
|
||||||
},
|
|
||||||
restoreAnyApp: async () => {
|
restoreAnyApp: async () => {
|
||||||
logger.info("Restore Any App")
|
common.header('main-menu-item-5')
|
||||||
common.header('Restore Any App')
|
common.log('main-menu-item-5')
|
||||||
const value = await inquirer.restoreAnyApp();
|
const value = await inquirer.restoreAnyApp();
|
||||||
await shellExec(adbRun + ' shell cmd package install-existing ' + value.restoreAnyApp).then(function (result) {
|
await adb.restoreAnyApk(value)
|
||||||
if (result.stderr != '') {
|
common.dualLog('restoring-apps-complete', 'green')
|
||||||
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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
console.log(chalk.green('Restore Complete'))
|
|
||||||
await common.pause(2000)
|
await common.pause(2000)
|
||||||
logger.info("App Restore Complete")
|
|
||||||
module.exports.mainMenu()
|
module.exports.mainMenu()
|
||||||
},
|
},
|
||||||
batchInstallApks: async () => {
|
|
||||||
logger.info("Batch Install Apks")
|
|
||||||
common.header('Batch Install Apks')
|
|
||||||
|
|
||||||
let apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false)
|
|
||||||
|
|
||||||
|
removeAnyApp: async () => {
|
||||||
|
common.header('main-menu-item-6')
|
||||||
|
common.log('main-menu-item-6')
|
||||||
|
const value = await inquirer.removeAnyApp();
|
||||||
|
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)
|
await files.renameLocalApk(apkList)
|
||||||
|
apkList = await files.getListOfAPk('./my-apk/')
|
||||||
apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false)
|
|
||||||
|
|
||||||
for (let element of apkList) {
|
for (let element of apkList) {
|
||||||
console.log('Installing ' + element)
|
console.log(await Language.get('installing') + ' ' + element)
|
||||||
logger.info('Installing ' + element)
|
logger.info(await Language.get('installing') + ' ' + element)
|
||||||
await shellExec(adbRun + ' install -r ' + element).then(async function (result) {
|
await adb.installApk(element)
|
||||||
if (result.stderr != '') {
|
|
||||||
logger.info('Error ' + result.stderr);
|
|
||||||
console.log(chalk.redBright(result.stderr));
|
|
||||||
}
|
|
||||||
console.log(element + ' - ' + result.stdout);
|
|
||||||
logger.info(element + ' - ' + result.stdout);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
console.log(chalk.green('Batch Install Apks Completed'))
|
common.dualLog('batch-install-apps-complete', 'green')
|
||||||
logger.info('Batch Install Apks Completed')
|
|
||||||
await common.pause(2000)
|
await common.pause(2000)
|
||||||
module.exports.mainMenu()
|
module.exports.mainMenu()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
batchRemoveInstalledApps: async () => {
|
||||||
|
common.header('main-menu-item-8')
|
||||||
|
common.log('main-menu-item-8')
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
common.dualLog('remove-selected-user-apps', 'green')
|
||||||
|
await common.pause(2000)
|
||||||
|
module.exports.mainMenu()
|
||||||
|
},
|
||||||
|
|
||||||
|
connectWatch: async () => {
|
||||||
|
common.header('connect-to-watch')
|
||||||
|
common.log('connect-to-watch')
|
||||||
|
const value = await inquirer.connectionType()
|
||||||
|
connected = await adb.watchConnection(value)
|
||||||
|
if (connected != true) {
|
||||||
|
module.exports.connectWatch()
|
||||||
|
} else {
|
||||||
|
module.exports.mainMenu()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
selectLanguage: async () => {
|
||||||
|
common.header('Select Language')
|
||||||
|
common.log('Select Language')
|
||||||
|
const v = await inquirer.LanguageSelect()
|
||||||
|
globalVariables.language = v.selection
|
||||||
|
module.exports.connectWatch()
|
||||||
|
},
|
||||||
|
|
||||||
mainMenu: async () => {
|
mainMenu: async () => {
|
||||||
common.header('Main Menu')
|
common.header('Main Menu')
|
||||||
const mainMenuSelection = await inquirer.mainMenu();
|
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) {
|
switch (mainMenuSelection.mainMenu) {
|
||||||
case 'connect to miwatch':
|
case menu_1.toLowerCase():
|
||||||
module.exports.connectWatch()
|
|
||||||
break;
|
|
||||||
case '1-click karl0ss klean':
|
|
||||||
module.exports.oneClick()
|
module.exports.oneClick()
|
||||||
break;
|
break;
|
||||||
case 'remove xiaomi apps':
|
case menu_2.toLowerCase():
|
||||||
module.exports.removeApps()
|
module.exports.removeXiaomiApps()
|
||||||
break;
|
break;
|
||||||
case 'restore xiaomi apps':
|
case menu_3.toLowerCase():
|
||||||
module.exports.restoreApps()
|
module.exports.restoreXiaomiApps()
|
||||||
break;
|
break;
|
||||||
case 'install compatible apps':
|
case menu_4.toLowerCase():
|
||||||
module.exports.compatibleApps()
|
module.exports.installCompatibleApps()
|
||||||
break;
|
break;
|
||||||
case 'batch remove installed apps':
|
case menu_5.toLowerCase():
|
||||||
module.exports.removeCompatibleApps()
|
|
||||||
break;
|
|
||||||
case 'restore any app':
|
|
||||||
module.exports.restoreAnyApp()
|
module.exports.restoreAnyApp()
|
||||||
break;
|
break;
|
||||||
case 'batch install apks':
|
case menu_6.toLowerCase():
|
||||||
module.exports.batchInstallApks()
|
module.exports.removeAnyApp()
|
||||||
break;
|
break;
|
||||||
case 'quit':
|
case menu_7.toLowerCase():
|
||||||
|
module.exports.batchInstallApps()
|
||||||
|
break;
|
||||||
|
case menu_8.toLowerCase():
|
||||||
|
module.exports.batchRemoveInstalledApps()
|
||||||
|
break;
|
||||||
|
case menu_9.toLowerCase():
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// code block
|
// code block
|
||||||
|
Loading…
x
Reference in New Issue
Block a user