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/
 | 
			
		||||
data/MiWatch.json
 | 
			
		||||
data/apps/*.apk
 | 
			
		||||
release/
 | 
			
		||||
data/*.log
 | 
			
		||||
logger.lock
 | 
			
		||||
null.log
 | 
			
		||||
.gitignore
 | 
			
		||||
my_apk/*.apk
 | 
			
		||||
							
								
								
									
										3
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								app.js
									
									
									
									
									
								
							@ -1,3 +1,4 @@
 | 
			
		||||
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/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
 | 
			
		||||
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": [
 | 
			
		||||
      "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",
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										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 logger = require('perfect-logger');
 | 
			
		||||
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 = {
 | 
			
		||||
  getListOfAPk: () => {
 | 
			
		||||
    this.apkListToInstall = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false)
 | 
			
		||||
  },
 | 
			
		||||
  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) => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) {
 | 
			
		||||
      if (result.stderr != '') {
 | 
			
		||||
        common.dualLog('device-not-authorised' + ' ' + result.stderr, 'red')
 | 
			
		||||
      }
 | 
			
		||||
      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) {
 | 
			
		||||
          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');
 | 
			
		||||
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');
 | 
			
		||||
var chalkRainbow = require('chalk-rainbow')
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    header: (page) => {
 | 
			
		||||
    header: async (page) => {
 | 
			
		||||
        Language.setActiveLang(globalVariables.language)
 | 
			
		||||
        clear();
 | 
			
		||||
        console.log(
 | 
			
		||||
            chalk.red(
 | 
			
		||||
            chalkRainbow(
 | 
			
		||||
                figlet.textSync('MiWatch Kleaner', {
 | 
			
		||||
                    horizontalLayout: 'full'
 | 
			
		||||
                })
 | 
			
		||||
@ -20,13 +23,12 @@ module.exports = {
 | 
			
		||||
        );
 | 
			
		||||
        console.log(chalk.red('                                                                                     ' + pjson.version));
 | 
			
		||||
        console.log();
 | 
			
		||||
 | 
			
		||||
        console.log(
 | 
			
		||||
            chalk.red(
 | 
			
		||||
                '-------------------------------------------------------------------------------------------------------'
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        console.log(chalk.blue(page))
 | 
			
		||||
        console.log(chalk.blue(await Language.get(page)))
 | 
			
		||||
        module.exports.connectionCheck()
 | 
			
		||||
        console.log(chalk.red('----------'))
 | 
			
		||||
    },
 | 
			
		||||
@ -34,19 +36,22 @@ 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('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) => {
 | 
			
		||||
        Language.setActiveLang(globalVariables.language)
 | 
			
		||||
        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) => {
 | 
			
		||||
@ -57,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)
 | 
			
		||||
@ -66,4 +77,31 @@ 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) => {
 | 
			
		||||
        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 path = require('path');
 | 
			
		||||
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 = {
 | 
			
		||||
  getCurrentDirectoryBase: () => {
 | 
			
		||||
@ -39,5 +44,13 @@ module.exports = {
 | 
			
		||||
      }
 | 
			
		||||
      resolve(x / y);
 | 
			
		||||
    }).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 {
 | 
			
		||||
    localUSB = "";
 | 
			
		||||
    miWatchIpaddress = "";
 | 
			
		||||
    language = "";
 | 
			
		||||
    usersList=[];
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,37 +1,53 @@
 | 
			
		||||
const inquirer = require("inquirer");
 | 
			
		||||
const files = require("./files");
 | 
			
		||||
const common = require("./common");
 | 
			
		||||
 | 
			
		||||
// let compatibleApps
 | 
			
		||||
const Language = require("@shypes/language-translator");
 | 
			
		||||
const globalVariables = require('../lib/globalVars');
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  mainMenu: () => {
 | 
			
		||||
  mainMenu: async () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    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'),
 | 
			
		||||
        await Language.get('main-menu-item-9'),
 | 
			
		||||
      ],
 | 
			
		||||
      filter: function (val) {
 | 
			
		||||
        return val.toLowerCase();
 | 
			
		||||
      },
 | 
			
		||||
    }, ];
 | 
			
		||||
    },];
 | 
			
		||||
    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 = [{
 | 
			
		||||
      type: "list",
 | 
			
		||||
      name: "connection",
 | 
			
		||||
      message: "How do you want to connect?",
 | 
			
		||||
      message: await Language.get('connection-type-message'),
 | 
			
		||||
      choices: [
 | 
			
		||||
        "USB",
 | 
			
		||||
        "Wifi"
 | 
			
		||||
@ -39,29 +55,32 @@ module.exports = {
 | 
			
		||||
      filter: function (val) {
 | 
			
		||||
        return val.toLowerCase();
 | 
			
		||||
      },
 | 
			
		||||
    }, ];
 | 
			
		||||
    },];
 | 
			
		||||
    return inquirer.prompt(questions);
 | 
			
		||||
  },
 | 
			
		||||
  connectWifi: () => {
 | 
			
		||||
  connectWifi: async () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    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 () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    const packages = await files.loadPackageList();
 | 
			
		||||
 | 
			
		||||
    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 () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    const compatibleApps = await common.getCompatibleAppsList()
 | 
			
		||||
    const appList = []
 | 
			
		||||
    for (let element of compatibleApps) {
 | 
			
		||||
@ -70,26 +89,37 @@ 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) => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    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 () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    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);
 | 
			
		||||
  },
 | 
			
		||||
  removeAnyApp: async () => {
 | 
			
		||||
    Language.setActiveLang(globalVariables.language)
 | 
			
		||||
    const questions = [{
 | 
			
		||||
      type: "input",
 | 
			
		||||
      name: "removeAnyApp",
 | 
			
		||||
      message: await Language.get('remove-any-app-message'),
 | 
			
		||||
    },];
 | 
			
		||||
    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",
 | 
			
		||||
  "version": "3.0.0",
 | 
			
		||||
  "version": "3.1.0",
 | 
			
		||||
  "lockfileVersion": 1,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
@ -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",
 | 
			
		||||
@ -70,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",
 | 
			
		||||
@ -165,6 +170,38 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "version": "0.7.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
 | 
			
		||||
@ -254,14 +291,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",
 | 
			
		||||
@ -631,6 +660,14 @@
 | 
			
		||||
        "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": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 | 
			
		||||
@ -691,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": {
 | 
			
		||||
@ -880,11 +932,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 +1147,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",
 | 
			
		||||
@ -1261,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": {
 | 
			
		||||
@ -1272,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"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "miwatchkleaner",
 | 
			
		||||
  "version": "3.0.0",
 | 
			
		||||
  "version": "3.1.0",
 | 
			
		||||
  "description": "MiWatch Cleaning Tool",
 | 
			
		||||
  "main": "app.js",
 | 
			
		||||
  "bin": "app.js",
 | 
			
		||||
@ -16,7 +16,9 @@
 | 
			
		||||
  "license": "ISC",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@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",
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										448
									
								
								pages/pages.js
									
									
									
									
									
								
							
							
						
						
									
										448
									
								
								pages/pages.js
									
									
									
									
									
								
							@ -1,12 +1,11 @@
 | 
			
		||||
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 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")
 | 
			
		||||
if (process.platform === 'win32' || process.platform === 'win64') {
 | 
			
		||||
@ -22,54 +21,77 @@ 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);
 | 
			
		||||
    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)
 | 
			
		||||
        }
 | 
			
		||||
        common.print('removal-complete', 'green')
 | 
			
		||||
        await common.pause(2000)
 | 
			
		||||
        common.log('removal-complete')
 | 
			
		||||
        common.log('compatible-apps')
 | 
			
		||||
 | 
			
		||||
                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);
 | 
			
		||||
                    });
 | 
			
		||||
        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'))
 | 
			
		||||
                }
 | 
			
		||||
                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 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) {
 | 
			
		||||
            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');
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        for (let package of apkList) {
 | 
			
		||||
            common.dualLog('installing', 'whiteBright')
 | 
			
		||||
            await adb.installApk(package)
 | 
			
		||||
        }
 | 
			
		||||
        console.log(chalk.green('Compatible Apps Installed'))
 | 
			
		||||
        logger.info('Compatible Apps Installed')
 | 
			
		||||
        common.dualLog('compatible-apps-installed', 'green')
 | 
			
		||||
        await common.pause(2000)
 | 
			
		||||
        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 () => {
 | 
			
		||||
        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 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);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        console.log(chalk.green('Restore Complete'))
 | 
			
		||||
        await adb.restoreAnyApk(value)
 | 
			
		||||
        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')
 | 
			
		||||
 | 
			
		||||
        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)
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
            });
 | 
			
		||||
            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('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 () => {
 | 
			
		||||
        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 'connect to miwatch':
 | 
			
		||||
                module.exports.connectWatch()
 | 
			
		||||
                break;
 | 
			
		||||
            case '1-click karl0ss klean':
 | 
			
		||||
            case menu_1.toLowerCase():
 | 
			
		||||
                module.exports.oneClick()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'remove xiaomi apps':
 | 
			
		||||
                module.exports.removeApps()
 | 
			
		||||
            case menu_2.toLowerCase():
 | 
			
		||||
                module.exports.removeXiaomiApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'restore xiaomi apps':
 | 
			
		||||
                module.exports.restoreApps()
 | 
			
		||||
            case menu_3.toLowerCase():
 | 
			
		||||
                module.exports.restoreXiaomiApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'install compatible apps':
 | 
			
		||||
                module.exports.compatibleApps()
 | 
			
		||||
            case menu_4.toLowerCase():
 | 
			
		||||
                module.exports.installCompatibleApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'batch remove installed apps':
 | 
			
		||||
                module.exports.removeCompatibleApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'restore any app':
 | 
			
		||||
            case menu_5.toLowerCase():
 | 
			
		||||
                module.exports.restoreAnyApp()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'batch install apks':
 | 
			
		||||
                module.exports.batchInstallApks()
 | 
			
		||||
            case menu_6.toLowerCase():
 | 
			
		||||
                module.exports.removeAnyApp()
 | 
			
		||||
                break;
 | 
			
		||||
            case 'quit':
 | 
			
		||||
            case menu_7.toLowerCase():
 | 
			
		||||
                module.exports.batchInstallApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case menu_8.toLowerCase():
 | 
			
		||||
                module.exports.batchRemoveInstalledApps()
 | 
			
		||||
                break;
 | 
			
		||||
            case menu_9.toLowerCase():
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
            // code block
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user