Merge branch '3.0.0' of Karl/MiWatchKleaner into master
This commit is contained in:
commit
928033df1d
3
.gitignore
vendored
3
.gitignore
vendored
@ -4,4 +4,5 @@ data/apps/*.apk
|
||||
release/
|
||||
data/*.log
|
||||
logger.lock
|
||||
logger.lock
|
||||
null.log
|
||||
.gitignore
|
||||
|
2
app.js
2
app.js
@ -1,3 +1,3 @@
|
||||
const pages = require('./pages/pages')
|
||||
|
||||
pages.mainMenu();
|
||||
pages.connectWatch();
|
||||
|
@ -1,22 +1,22 @@
|
||||
echo What is build number && \
|
||||
read buildNum && \
|
||||
pkg package.json && \
|
||||
mv miwatchkleaner2-* ./release && \
|
||||
mv ./release/miwatchkleaner2-win-* ./release/Windows && \
|
||||
mv ./release/miwatchkleaner2-linux-* ./release/Linux && \
|
||||
mv ./release/miwatchkleaner2-macos-* ./release/MacOs && \
|
||||
mv miwatchkleaner-* ./release && \
|
||||
mv ./release/miwatchkleaner-win-* ./release/Windows && \
|
||||
mv ./release/miwatchkleaner-linux-* ./release/Linux && \
|
||||
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/ && \
|
||||
chmod 0777 ./release/**/adb && \
|
||||
chmod 0777 ./release/**/miwatchkleaner2-* && \
|
||||
chmod 0777 ./release/**/miwatchkleaner-* && \
|
||||
chmod +x ./release/**/adb && \
|
||||
chmod +x ./release/**/miwatchkleaner2-* && \
|
||||
chmod +x ./release/**/miwatchkleaner-* && \
|
||||
cd release/MacOS/ && \
|
||||
tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ miwatchkleaner2-macos-x64 && \
|
||||
tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ my_apk/ miwatchkleaner-macos-x64 && \
|
||||
cd .. && \
|
||||
cd Linux/ && \
|
||||
tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ miwatchkleaner2-linux-x64 && \
|
||||
tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ my_apk/ miwatchkleaner-linux-x64 && \
|
||||
cd .. && \
|
||||
cd Windows/ && \
|
||||
zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ miwatchkleaner2-win-x86.exe
|
||||
zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ miwatchkleaner-win-x86.exe
|
@ -1 +0,0 @@
|
||||
{"ipAddress":""}
|
@ -4,7 +4,9 @@ const figlet = require('figlet');
|
||||
const fs = require('fs')
|
||||
var pjson = require('../package.json');
|
||||
const fetch = require('node-fetch');
|
||||
var shell = require('shelljs');
|
||||
|
||||
const globalVariables = require('../lib/globalVars');
|
||||
|
||||
module.exports = {
|
||||
header: (page) => {
|
||||
@ -25,37 +27,43 @@ module.exports = {
|
||||
)
|
||||
)
|
||||
console.log(chalk.blue(page))
|
||||
module.exports.ipCheck()
|
||||
module.exports.connectionCheck()
|
||||
console.log(chalk.red('----------'))
|
||||
},
|
||||
pause: async (time) => {
|
||||
await new Promise(resolve => setTimeout(resolve, time));
|
||||
},
|
||||
ipCheck: async () => {
|
||||
const miwatchData = JSON.parse(fs.readFileSync('./data/MiWatch.json', 'utf8'));
|
||||
if (miwatchData.ipAddress === "") {
|
||||
console.log(chalk.white('MiWatch IP: ') + chalk.red('Not Connected'))
|
||||
} else {
|
||||
console.log(chalk.white('MiWatch IP: ' + chalk.green(miwatchData.ipAddress)))
|
||||
connectionCheck: async () => {
|
||||
if (globalVariables.localUSB === "X") {
|
||||
console.log(chalk.white('MiWatch: ') + chalk.green('Connected via USB'))
|
||||
}
|
||||
if (globalVariables.miWatchIpaddress != "") {
|
||||
console.log(chalk.white('MiWatch: ') + chalk.green('Connected via Wifi - ' + chalk.white(globalVariables.miWatchIpaddress)))
|
||||
}
|
||||
if (globalVariables.localUSB === "" && globalVariables.miWatchIpaddress === "") {
|
||||
console.log(chalk.white('MiWatch: ') + chalk.red('Not Connected'))
|
||||
}
|
||||
},
|
||||
downloadFile: async (url, path) => {
|
||||
const res = await fetch(url);
|
||||
await new Promise((resolve, reject) => {
|
||||
const fileStream = fs.createWriteStream(path);
|
||||
res.body.pipe(fileStream);
|
||||
res.body.on("error", (err) => {
|
||||
reject(err);
|
||||
});
|
||||
fileStream.on("finish", function() {
|
||||
resolve();
|
||||
});
|
||||
const fileStream = fs.createWriteStream(path);
|
||||
res.body.pipe(fileStream);
|
||||
res.body.on("error", (err) => {
|
||||
reject(err);
|
||||
});
|
||||
fileStream.on("finish", function () {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
},
|
||||
getCompatibleAppsList: async () => {
|
||||
let settings = { method: "Get" };
|
||||
const response = await fetch("http://kithub.cf/Karl/MiWatchKleaner-APKs/raw/master/compatibleApps.json", settings)
|
||||
.then(res => res.json())
|
||||
return response
|
||||
.then(res => res.json())
|
||||
return response
|
||||
},
|
||||
clearApkFolder: async () => {
|
||||
await shell.rm('-rf', './data/apps/*.apk');
|
||||
},
|
||||
}
|
15
lib/files.js
15
lib/files.js
@ -1,5 +1,7 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const tiny = require("@peterpanhihi/tiny");
|
||||
const { resolve } = require('path');
|
||||
|
||||
module.exports = {
|
||||
getCurrentDirectoryBase: () => {
|
||||
@ -14,7 +16,7 @@ module.exports = {
|
||||
ipAddress: value
|
||||
}
|
||||
try {
|
||||
fs.writeFileSync('./data/MiWatch.json', JSON.stringify(data))
|
||||
fs.writeFileSync('./data/options.json', JSON.stringify(data))
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
@ -27,4 +29,15 @@ module.exports = {
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
renameLocalApk: async (apkList) => {
|
||||
return new Promise(function (resolve, reject) {
|
||||
for (let e of apkList) {
|
||||
a = tiny(e)
|
||||
fs.rename(e, a, function (err) {
|
||||
if (err) console.log('ERROR: ' + err);
|
||||
});
|
||||
}
|
||||
resolve(x / y);
|
||||
}).catch(err => NaN)
|
||||
}
|
||||
}
|
7
lib/globalVars.js
Normal file
7
lib/globalVars.js
Normal file
@ -0,0 +1,7 @@
|
||||
class globalVariables {
|
||||
localUSB = "";
|
||||
miWatchIpaddress = "";
|
||||
usersList=[];
|
||||
}
|
||||
|
||||
module.exports = new globalVariables();
|
@ -11,13 +11,14 @@ module.exports = {
|
||||
name: "mainMenu",
|
||||
message: "What do you want to do?",
|
||||
choices: [
|
||||
"Connect to MiWatch via Wifi",
|
||||
// "Connect to MiWatch",
|
||||
"1-Click Karl0ss Klean",
|
||||
"Remove Xiaomi Apps",
|
||||
"Restore Xiaomi Apps",
|
||||
"Install Compatible Apps",
|
||||
"Remove Installed Apps",
|
||||
"Restore ANY app",
|
||||
"Batch Install APKs",
|
||||
"Batch Remove Installed Apps",
|
||||
"Quit"
|
||||
],
|
||||
filter: function (val) {
|
||||
@ -26,6 +27,21 @@ module.exports = {
|
||||
}, ];
|
||||
return inquirer.prompt(questions);
|
||||
},
|
||||
connectionType: () => {
|
||||
const questions = [{
|
||||
type: "list",
|
||||
name: "connection",
|
||||
message: "How do you want to connect?",
|
||||
choices: [
|
||||
"USB",
|
||||
"Wifi"
|
||||
],
|
||||
filter: function (val) {
|
||||
return val.toLowerCase();
|
||||
},
|
||||
}, ];
|
||||
return inquirer.prompt(questions);
|
||||
},
|
||||
connectWifi: () => {
|
||||
const questions = [{
|
||||
type: "input",
|
||||
|
0
my_apk/.gitkeep
Normal file
0
my_apk/.gitkeep
Normal file
30
package-lock.json
generated
30
package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "miwatchkleaner2.0",
|
||||
"version": "2.0.8",
|
||||
"name": "miwatchkleaner",
|
||||
"version": "3.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@ -40,6 +40,11 @@
|
||||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
"@peterpanhihi/tiny": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@peterpanhihi/tiny/-/tiny-2.0.0.tgz",
|
||||
"integrity": "sha512-usAoksj49559JLAsQXmrE5wOV6A055icErp8jpJDCicfojwEVPaSLk5EZ1EXhcgIuqjSNkzCOXu0gSdm3Std+w=="
|
||||
},
|
||||
"@types/color-name": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||
@ -249,6 +254,14 @@
|
||||
"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",
|
||||
@ -867,6 +880,11 @@
|
||||
"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",
|
||||
@ -1082,6 +1100,14 @@
|
||||
"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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "miwatchkleaner2.0",
|
||||
"version": "2.0.10",
|
||||
"name": "miwatchkleaner",
|
||||
"version": "3.0.0",
|
||||
"description": "MiWatch Cleaning Tool",
|
||||
"main": "app.js",
|
||||
"bin": "app.js",
|
||||
@ -15,6 +15,7 @@
|
||||
"author": "Karl Hudgell",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@peterpanhihi/tiny": "^2.0.0",
|
||||
"chalk": "^4.0.0",
|
||||
"clear": "^0.1.0",
|
||||
"clui": "^0.3.6",
|
||||
|
108
pages/pages.js
108
pages/pages.js
@ -3,12 +3,17 @@ const common = require('../lib/common');
|
||||
const inquirer = require('../lib/inquirer');
|
||||
const shellExec = require('shell-exec')
|
||||
const files = require('../lib/files')
|
||||
const fs = require('fs')
|
||||
const getFilesIn = require('get-files-in')
|
||||
var shell = require('shelljs');
|
||||
let logger = require('perfect-logger');
|
||||
const globalVariables = require('../lib/globalVars');
|
||||
|
||||
let adbRun
|
||||
|
||||
logger.info(process.platform + " detected")
|
||||
if (process.platform === 'win32' || process.platform === 'win64') {
|
||||
adbRun = 'adb'
|
||||
} else {
|
||||
adbRun = './adb'
|
||||
}
|
||||
|
||||
logger.initialize('RunTIme', {
|
||||
logLevelFile: 0, // Log level for file
|
||||
@ -68,7 +73,7 @@ module.exports = {
|
||||
const compatibleApps = await common.getCompatibleAppsList()
|
||||
const value = await inquirer.compatibleApps();
|
||||
|
||||
await shell.rm('-rf', './data/apps/*.apk');
|
||||
await common.clearApkFolder()
|
||||
|
||||
for (let element of value.removeAppsList) {
|
||||
for (let element2 of compatibleApps) {
|
||||
@ -162,46 +167,55 @@ module.exports = {
|
||||
logger.info("Restore Apps Complete")
|
||||
module.exports.mainMenu()
|
||||
},
|
||||
connectWifi: async () => {
|
||||
logger.info("Connect Wifi")
|
||||
const miwatchData = JSON.parse(fs.readFileSync('./data/MiWatch.json', 'utf8'));
|
||||
common.header('Connect Wifi')
|
||||
if (miwatchData.ipAddress !== "") {
|
||||
await shellExec(adbRun + ' kill-server')
|
||||
console.log('Trying to connect with stored ipAddress')
|
||||
shellExec(adbRun + ' connect ' + miwatchData.ipAddress).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'))
|
||||
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("Connect Wifi Complete")
|
||||
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)
|
||||
files.writeIpAddress('')
|
||||
console.log(chalk.white('Try Again'))
|
||||
await common.pause(1000)
|
||||
module.exports.connectWifi()
|
||||
module.exports.connectWatch()
|
||||
}
|
||||
}).catch()
|
||||
} else {
|
||||
await shellExec(adbRun + ' kill-server')
|
||||
})
|
||||
}
|
||||
if (value.connection === "wifi") {
|
||||
const value = await inquirer.connectWifi();
|
||||
const miWatchIpaddress = value.connectWifi
|
||||
shellExec(adbRun + ' connect ' + miWatchIpaddress).then(async function (result) {
|
||||
globalVariables.miWatchIpaddress = value.connectWifi
|
||||
await shellExec(adbRun + ' kill-server').then(async function (result) {
|
||||
logger.info('Restarting ADB')
|
||||
logger.info(result.stdout)
|
||||
})
|
||||
await shellExec(adbRun + ' connect ' + globalVariables.miWatchIpaddress).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'))
|
||||
files.writeIpAddress(miWatchIpaddress)
|
||||
globalVariables.localUSB = ""
|
||||
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('MiWatch not found'))
|
||||
console.log(chalk.red(result.stdout))
|
||||
logger.info(result.stdout)
|
||||
}
|
||||
await common.pause(2000)
|
||||
console.log(chalk.white('Try Again'))
|
||||
@ -231,7 +245,7 @@ module.exports = {
|
||||
logger.info("Remove Complete")
|
||||
logger.info("Compatible Apps")
|
||||
|
||||
await shell.rm('-rf', './data/apps/*.apk');
|
||||
await common.clearApkFolder()
|
||||
|
||||
const compatibleApps = await common.getCompatibleAppsList()
|
||||
|
||||
@ -285,18 +299,39 @@ module.exports = {
|
||||
logger.info("App Restore Complete")
|
||||
module.exports.mainMenu()
|
||||
},
|
||||
batchInstallApks: async () => {
|
||||
logger.info("Batch Install Apks")
|
||||
common.header('Batch Install Apks')
|
||||
|
||||
let apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false)
|
||||
|
||||
await files.renameLocalApk(apkList)
|
||||
|
||||
apkList = await getFilesIn('./my_apk/', 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(result.stderr));
|
||||
}
|
||||
console.log(element + ' - ' + result.stdout);
|
||||
logger.info(element + ' - ' + result.stdout);
|
||||
});
|
||||
}
|
||||
console.log(chalk.green('Batch Install Apks Completed'))
|
||||
logger.info('Batch Install Apks Completed')
|
||||
await common.pause(2000)
|
||||
module.exports.mainMenu()
|
||||
},
|
||||
mainMenu: async () => {
|
||||
common.header('Main Menu')
|
||||
if (process.platform === 'win32' || process.platform === 'win64') {
|
||||
adbRun = 'adb'
|
||||
} else {
|
||||
adbRun = './adb'
|
||||
}
|
||||
logger.info(process.platform + " detected")
|
||||
const mainMenuSelection = await inquirer.mainMenu();
|
||||
switch (mainMenuSelection.mainMenu) {
|
||||
case 'connect to miwatch via wifi':
|
||||
module.exports.connectWifi()
|
||||
case 'connect to miwatch':
|
||||
module.exports.connectWatch()
|
||||
break;
|
||||
case '1-click karl0ss klean':
|
||||
module.exports.oneClick()
|
||||
@ -310,12 +345,15 @@ module.exports = {
|
||||
case 'install compatible apps':
|
||||
module.exports.compatibleApps()
|
||||
break;
|
||||
case 'remove installed apps':
|
||||
case 'batch remove installed apps':
|
||||
module.exports.removeCompatibleApps()
|
||||
break;
|
||||
case 'restore any app':
|
||||
module.exports.restoreAnyApp()
|
||||
break;
|
||||
case 'batch install apks':
|
||||
module.exports.batchInstallApks()
|
||||
break;
|
||||
case 'quit':
|
||||
break;
|
||||
default:
|
||||
|
Loading…
x
Reference in New Issue
Block a user