making progress

This commit is contained in:
karl.hudgell 2020-08-28 13:03:24 +01:00
parent 3658fd26aa
commit 73ee55d913
7 changed files with 171 additions and 142 deletions

1
app.js
View File

@ -1,3 +1,4 @@
const pages = require('./pages/pages') const pages = require('./pages/pages')
pages.connectWatch(); pages.connectWatch();

31
lang/en.json Normal file
View File

@ -0,0 +1,31 @@
{
"main_menu_question": "What do you want to do?",
"main_menu_item_1": "1-Click Karl0ss Klean",
"main_menu_item_2": "Remove Xiaomi Apps",
"main_menu_item_3": "Restore Xiaomi Apps",
"main_menu_item_4": "Install Compatible Apps",
"main_menu_item_5": "Restore ANY app",
"main_menu_item_6": "Batch Install APKs",
"main_menu_item_7": "Batch Remove Installed Apps",
"main_menu_item_8": "Quit",
"connection_type_message": "How do you want to connect?",
"connect_wifi_message":"What is your MiWatch IpAdress?",
"restore_app_message": "What apps do you want to restore?",
"install_compatible_apps_message": "What apps do you want to Install?",
"remove_installed_apps_message": "What Installed apps do you want to remove?",
"restore_any_app_message": "What App do you want to restore?",
"remove_installed_apps_header": "Remove Installed Apps",
"packages_recieved_from_watch": "Packages recieved from watch",
"device_not_authorised": "Device not authorised",
"restarting_adb": "Restarting ADB",
"please_reconnect_to_watch": "Please reconnect to watch",
"remove_installed_apps_failed": "Remove Installed Apps Failed",
"removing": "Removing",
"installing": "Installing",
"remove_selected_user_apps": "Removed Selected User Apps",
"install_compatible_apps_header": "Install Compatible Apps",
"simple_weather_activated_on_watch": "simpleWeather Activated On Watch",
"morelocale_activated_on_watch": "moreLocale Activated On Watch",
"alberto_locale_activated_on_watch": "Alberto Locale Activated On Watch",
"compatible_apps_installed": "Compatible Apps Installed"
}

View File

@ -1,24 +1,85 @@
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')
if (process.platform === 'win32' || process.platform === 'win64') {
adbRun = 'adb'
} else {
adbRun = './adb'
}
module.exports = { module.exports = {
getListOfAPk: () => { getListOfAPk: () => {
this.apkListToInstall = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false) const result = gfin('./data/apps', matchFiletypes = ["apk"], checkSubDirectories = false)
return result
}, },
installApk: async () => { installApk: async (element) => {
await module.exports.getListOfAPk() result = await shellExec(adbRun + ' install -r ' + element).then(async function (result) {
for (let element of this.apkListToInstall) { if (result.stderr != '') {
if (process.platform === 'win32' || process.platform === 'win64') { logger.info(await Language.get('device_not_authorised'));
await shellExec('adb install -r ' + element).then(function (result) { console.log(chalk.redBright(await Language.get('device_not_authorised')));
console.log('Installing ' + element + ' - ' + result.stdout); }
}); console.log(element + ' - ' + result.stdout);
} else { logger.info(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')
await common.downloadFile('http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/Others/simpleweather_split_config.xhdpi.apk', './data/apps/simpleweather_split_config.xhdpi.apk')
await shellExec(adbRun + ' install-multiple "data\\apps\\simpleweather_base.apk" "data\\apps\\simpleweather_split_config.armeabi_v7a.apk" "data\\apps\\simpleweather_split_config.xhdpi.apk"').then(async function (result) {
console.log(result)
console.log(await Language.get('simple_weather_activated_on_watch'));
logger.info(await Language.get('simple_weather_activated_on_watch'));
})
}
if (element === "data\\apps\\MoreLocale.apk") {
await shellExec(adbRun + ' shell pm grant jp.co.c_lis.ccl.morelocale android.permission.CHANGE_CONFIGURATION').then(async function (result) {
console.log(await Language.get('morelocale_activated_on_watch'));
logger.info(await Language.get('morelocale_activated_on_watch'));
})
}
if (element === "data\\apps\\com.alberto.locale.apk") {
await shellExec(adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION && ' + adbRun + ' shell am start -n com.alberto.locale/com.alberto.locale.MainActivity && ' + adbRun + ' shell pm grant com.alberto.locale android.permission.CHANGE_CONFIGURATION').then(async function (result) {
console.log(result)
console.log(await Language.get('alberto_locale_activated_on_watch'));
logger.info(await Language.get('alberto_locale_activated_on_watch'));
}); });
} }
} });
// console.log(chalk.green('Removal Complete')) },
removeApk: async (package) => {
result = await shellExec(adbRun + ' uninstall ' + package)
console.log(package + ' - ' + result.stdout);
logger.info(package + ' - ' + result.stdout);
},
getInstalledPacakges: async () => {
result = await shellExec(adbRun + ' shell pm list packages -3')
logger.info(await Language.get('packages_recieved_from_watch'))
if (result.stderr.includes('error')) {
logger.info(result.stderr)
console.log(chalk.red(await Language.get('device_not_authorised')))
common.pause(3000)
await shellExec(adbRun + ' kill-server').then(async function (result) {
logger.info(await Language.get('restarting_adb'))
logger.info(result.stdout)
console.log(await Language.get('please_reconnect_to_watch'))
common.pause(3000)
logger.info(await Language.get('remove_installed_apps_failed'))
module.exports.mainMenu()
})
} else {
if (process.platform === 'win32' || process.platform === 'win64') {
installedAppList = result.stdout.split('\r\n'); // split string on comma space
installedAppList.splice(-1, 1)
} else {
installedAppList = result.stdout.split('\n'); // split string on comma space
installedAppList.splice(-1, 1)
}
const value = await inquirer.installedApps(installedAppList);
return value
}
}, },
}; };

View File

@ -2,36 +2,42 @@ const inquirer = require("inquirer");
const files = require("./files"); const files = require("./files");
const common = require("./common"); const common = require("./common");
// let compatibleApps const Language = require("@shypes/language-translator");
Language._({
default_lang: "en",
ext: ".json",
__basedir: "./",
langFolder: 'lang'
})
module.exports = { module.exports = {
mainMenu: () => { mainMenu: async () => {
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"
], ],
filter: function (val) { filter: function (val) {
return val.toLowerCase(); return val.toLowerCase();
}, },
}, ]; },];
return inquirer.prompt(questions); return inquirer.prompt(questions);
}, },
connectionType: () => { connectionType: async () => {
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,15 +45,15 @@ 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 () => {
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 () => {
@ -56,9 +62,9 @@ module.exports = {
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 () => {
@ -70,26 +76,26 @@ 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) => {
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 () => {
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); return inquirer.prompt(questions);
}, },
}; };

26
package-lock.json generated
View File

@ -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",
@ -254,14 +259,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",
@ -880,11 +877,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 +1092,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",

View File

@ -16,6 +16,7 @@
"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",
"clear": "^0.1.0", "clear": "^0.1.0",
"clui": "^0.3.6", "clui": "^0.3.6",

View File

@ -6,7 +6,8 @@ const files = require('../lib/files')
const getFilesIn = require('get-files-in') const getFilesIn = require('get-files-in')
let logger = require('perfect-logger'); let logger = require('perfect-logger');
const globalVariables = require('../lib/globalVars'); const globalVariables = require('../lib/globalVars');
const Language = require("@shypes/language-translator");
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') {
@ -23,52 +24,26 @@ logger.initialize('RunTIme', {
module.exports = { module.exports = {
removeCompatibleApps: async () => { removeCompatibleApps: async () => {
let installedAppList common.header(await Language.get('remove_installed_apps_header'))
common.header('Remove Installed Apps') logger.info(await Language.get('remove_installed_apps_header'))
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);
for (let element of value.removeAppsList) { value = await adb.getInstalledPacakges()
console.log('Removing ' + element)
logger.info('Removing ' + element) for (let element of value.removeAppsList) {
const package = element.substring(8) console.log(await Language.get('removing') + ' ' + element)
await shellExec(adbRun + ' uninstall ' + package).then(async function (result) { logger.info(await Language.get('removing') + ' ' + element)
console.log(element + ' - ' + result.stdout); const package = element.substring(8)
logger.info(element + ' - ' + result.stdout); await adb.removeApk(package)
}); }
} console.log(chalk.green(await Language.get('remove_selected_user_apps')))
console.log(chalk.green('Removed Selected User Apps')) logger.info(await Language.get('remove_selected_user_apps'))
logger.info('Removed Selected User Apps') await common.pause(2000)
await common.pause(2000) module.exports.mainMenu()
module.exports.mainMenu()
}
})
}, },
compatibleApps: async () => { compatibleApps: async () => {
logger.info("Compatible Apps") logger.info(await Language.get('install_compatible_apps_header'))
common.header('Install Compatible Apps') common.header(await Language.get('install_compatible_apps_header'))
const compatibleApps = await common.getCompatibleAppsList() const compatibleApps = await common.getCompatibleAppsList()
const value = await inquirer.compatibleApps(); const value = await inquirer.compatibleApps();
@ -84,45 +59,15 @@ module.exports = {
} }
} }
const apkList = await getFilesIn('./data/apps', matchFiletypes = ['apk'], checkSubDirectories = false) const apkList = await adb.getListOfAPk()
for (let element of apkList) { 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('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')) console.log(chalk.green(await Language.get('compatible_apps_installed')))
logger.info('Compatible Apps Installed') logger.info(await Language.get('compatible_apps_installed'))
await common.pause(2000) await common.pause(2000)
module.exports.mainMenu() module.exports.mainMenu()
}, },