@yume-chan/android-bin 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rush/temp/package-deps_build +0 -0
- package/.rush/temp/package-deps_build.json +13 -0
- package/.rush/temp/package-deps_build_watch.json +13 -0
- package/.rush/temp/package-deps_postinstall.json +13 -0
- package/.rush/temp/shrinkwrap-deps.json +4 -0
- package/CHANGELOG.json +22 -0
- package/CHANGELOG.md +11 -0
- package/README.md +5 -0
- package/android-bin.build.log +2 -0
- package/esm/bug-report.d.ts +34 -0
- package/esm/bug-report.d.ts.map +1 -0
- package/esm/bug-report.js +115 -0
- package/esm/bug-report.js.map +1 -0
- package/esm/demo-mode.d.ts +43 -0
- package/esm/demo-mode.d.ts.map +1 -0
- package/esm/demo-mode.js +147 -0
- package/esm/demo-mode.js.map +1 -0
- package/esm/index.d.ts +4 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +4 -0
- package/esm/index.js.map +1 -0
- package/esm/settings.d.ts +13 -0
- package/esm/settings.d.ts.map +1 -0
- package/esm/settings.js +25 -0
- package/esm/settings.js.map +1 -0
- package/package.json +40 -0
- package/src/bug-report.ts +143 -0
- package/src/demo-mode.ts +179 -0
- package/src/index.ts +3 -0
- package/src/settings.ts +49 -0
- package/tsconfig.json +8 -0
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": {
|
|
3
|
+
"libraries/android-bin/.rush/temp/shrinkwrap-deps.json": "c2eea9e95f7a91089a0529b750286ccd75726818",
|
|
4
|
+
"libraries/android-bin/README.md": "96d1e739d73df6dc17920182c1c5799b65652b69",
|
|
5
|
+
"libraries/android-bin/package.json": "d520445357198824728876bfd7175f94e923a1a4",
|
|
6
|
+
"libraries/android-bin/src/bug-report.ts": "f2cd3131b59f12a06b943e492274a258123ff6e1",
|
|
7
|
+
"libraries/android-bin/src/demo-mode.ts": "1ee4a2d1bc238a1600387fc39549241a2a6bb161",
|
|
8
|
+
"libraries/android-bin/src/index.ts": "c9c23c664f823e0dc557405cd538ea8ace80cd3e",
|
|
9
|
+
"libraries/android-bin/src/settings.ts": "a323081296746d78ea07f473680321331ff0d46c",
|
|
10
|
+
"libraries/android-bin/tsconfig.json": "39805c3201f468dc5a1a584b592970777c655bca"
|
|
11
|
+
},
|
|
12
|
+
"arguments": "build-ts-package "
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": {
|
|
3
|
+
"libraries/android-bin/.rush/temp/shrinkwrap-deps.json": "c2eea9e95f7a91089a0529b750286ccd75726818",
|
|
4
|
+
"libraries/android-bin/README.md": "96d1e739d73df6dc17920182c1c5799b65652b69",
|
|
5
|
+
"libraries/android-bin/package.json": "d520445357198824728876bfd7175f94e923a1a4",
|
|
6
|
+
"libraries/android-bin/src/bug-report.ts": "f2cd3131b59f12a06b943e492274a258123ff6e1",
|
|
7
|
+
"libraries/android-bin/src/demo-mode.ts": "1ee4a2d1bc238a1600387fc39549241a2a6bb161",
|
|
8
|
+
"libraries/android-bin/src/index.ts": "c9c23c664f823e0dc557405cd538ea8ace80cd3e",
|
|
9
|
+
"libraries/android-bin/src/settings.ts": "a323081296746d78ea07f473680321331ff0d46c",
|
|
10
|
+
"libraries/android-bin/tsconfig.json": "39805c3201f468dc5a1a584b592970777c655bca"
|
|
11
|
+
},
|
|
12
|
+
"arguments": "build-ts-package --incremental "
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"files": {
|
|
3
|
+
"libraries/android-bin/.rush/temp/shrinkwrap-deps.json": "4a66ebc96ce486db90e703e033412dd27055264b",
|
|
4
|
+
"libraries/android-bin/README.md": "96d1e739d73df6dc17920182c1c5799b65652b69",
|
|
5
|
+
"libraries/android-bin/package.json": "368868c45277e097267c990798e20b72c52d06a7",
|
|
6
|
+
"libraries/android-bin/src/bug-report.ts": "d1fab2f22bca38081c763abff9a42836d90803e5",
|
|
7
|
+
"libraries/android-bin/src/demo-mode.ts": "60feecacac2a9a8587e72e3b4f85334acf96f169",
|
|
8
|
+
"libraries/android-bin/src/index.ts": "b821d7309b6ef03a9c81044250d632b4c52c9d2c",
|
|
9
|
+
"libraries/android-bin/src/settings.ts": "a323081296746d78ea07f473680321331ff0d46c",
|
|
10
|
+
"libraries/android-bin/tsconfig.json": "07f9242b115ab18b8e8d2564d25d32349ffb21cb"
|
|
11
|
+
},
|
|
12
|
+
"arguments": ""
|
|
13
|
+
}
|
package/CHANGELOG.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yume-chan/android-bin",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.0.11",
|
|
6
|
+
"tag": "@yume-chan/android-bin_v0.0.11",
|
|
7
|
+
"date": "Sun, 03 Apr 2022 10:54:15 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "Improve compatibility with Node.js 12 ESM format"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"dependency": [
|
|
15
|
+
{
|
|
16
|
+
"comment": "Updating dependency \"@yume-chan/adb\" from `^0.0.10` to `^0.0.11`"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Change Log - @yume-chan/android-bin
|
|
2
|
+
|
|
3
|
+
This log was last generated on Sun, 03 Apr 2022 10:54:15 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.0.11
|
|
6
|
+
Sun, 03 Apr 2022 10:54:15 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- Improve compatibility with Node.js 12 ESM format
|
|
11
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AdbCommandBase, ReadableStream } from "@yume-chan/adb";
|
|
2
|
+
export interface BugReportVersion {
|
|
3
|
+
major: number;
|
|
4
|
+
minor: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class BugReportZ extends AdbCommandBase {
|
|
7
|
+
static VERSION_REGEX: RegExp;
|
|
8
|
+
static BEGIN_REGEX: RegExp;
|
|
9
|
+
static PROGRESS_REGEX: RegExp;
|
|
10
|
+
static OK_REGEX: RegExp;
|
|
11
|
+
static FAIL_REGEX: RegExp;
|
|
12
|
+
/**
|
|
13
|
+
* Retrieve the version of bugreportz.
|
|
14
|
+
*
|
|
15
|
+
* @returns a `BugReportVersion` object, or `undefined` if `bugreportz` is not available.
|
|
16
|
+
*/
|
|
17
|
+
version(): Promise<BugReportVersion | undefined>;
|
|
18
|
+
supportStream(version: BugReportVersion): boolean;
|
|
19
|
+
stream(): ReadableStream<Uint8Array>;
|
|
20
|
+
supportProgress(version: BugReportVersion): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Create a zipped bugreport file.
|
|
23
|
+
*
|
|
24
|
+
* Compare to `stream`, this method will write the output on device. You can pull it using sync protocol.
|
|
25
|
+
*
|
|
26
|
+
* @param onProgress Progress callback. Only specify this if `supportsProgress()` returns `true`.
|
|
27
|
+
* @returns The path of the bugreport file.
|
|
28
|
+
*/
|
|
29
|
+
generate(onProgress?: (progress: string, total: string) => void): Promise<string>;
|
|
30
|
+
}
|
|
31
|
+
export declare class BugReport extends AdbCommandBase {
|
|
32
|
+
generate(): ReadableStream<string>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=bug-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-report.d.ts","sourceRoot":"","sources":["../src/bug-report.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAgD,cAAc,EAAuD,MAAM,gBAAgB,CAAC;AAEnK,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAW,SAAQ,cAAc;IAC1C,OAAc,aAAa,SAAkB;IAE7C,OAAc,WAAW,SAAgB;IAEzC,OAAc,cAAc,SAAyB;IAErD,OAAc,QAAQ,SAAa;IAEnC,OAAc,UAAU,SAAe;IAEvC;;;;OAIG;IACU,OAAO,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAsBtD,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAIjD,MAAM,IAAI,cAAc,CAAC,UAAU,CAAC;IAYpC,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAI1D;;;;;;;OAOG;IACU,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAmDjG;AAED,qBAAa,SAAU,SAAQ,cAAc;IAClC,QAAQ,IAAI,cAAc,CAAC,MAAM,CAAC;CAY5C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// cspell: ignore bugreport
|
|
2
|
+
// cspell: ignore bugreportz
|
|
3
|
+
import { AdbCommandBase, AdbShellSubprocessProtocol, DecodeUtf8Stream, SplitLineStream, WrapReadableStream, WritableStream } from "@yume-chan/adb";
|
|
4
|
+
export class BugReportZ extends AdbCommandBase {
|
|
5
|
+
static VERSION_REGEX = /(\d+)\.(\d+)/;
|
|
6
|
+
static BEGIN_REGEX = /BEGIN:(.*)/;
|
|
7
|
+
static PROGRESS_REGEX = /PROGRESS:(.*)\/(.*)/;
|
|
8
|
+
static OK_REGEX = /OK:(.*)/;
|
|
9
|
+
static FAIL_REGEX = /FAIL:(.*)/;
|
|
10
|
+
/**
|
|
11
|
+
* Retrieve the version of bugreportz.
|
|
12
|
+
*
|
|
13
|
+
* @returns a `BugReportVersion` object, or `undefined` if `bugreportz` is not available.
|
|
14
|
+
*/
|
|
15
|
+
async version() {
|
|
16
|
+
// bugreportz requires shell protocol
|
|
17
|
+
if (!AdbShellSubprocessProtocol.isSupported(this.adb)) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const { stderr, exitCode } = await this.adb.subprocess.spawnAndWait(['bugreportz', '-v']);
|
|
21
|
+
if (exitCode !== 0 || stderr === '') {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const match = stderr.match(BugReportZ.VERSION_REGEX);
|
|
25
|
+
if (!match) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
major: parseInt(match[1], 10),
|
|
30
|
+
minor: parseInt(match[2], 10),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
supportStream(version) {
|
|
34
|
+
return version.major > 1 || version.minor >= 2;
|
|
35
|
+
}
|
|
36
|
+
stream() {
|
|
37
|
+
return new WrapReadableStream({
|
|
38
|
+
start: async () => {
|
|
39
|
+
const process = await this.adb.subprocess.spawn(['bugreportz', '-s']);
|
|
40
|
+
return {
|
|
41
|
+
readable: process.stdout,
|
|
42
|
+
state: undefined,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
supportProgress(version) {
|
|
48
|
+
return version.major > 1 || version.minor >= 1;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a zipped bugreport file.
|
|
52
|
+
*
|
|
53
|
+
* Compare to `stream`, this method will write the output on device. You can pull it using sync protocol.
|
|
54
|
+
*
|
|
55
|
+
* @param onProgress Progress callback. Only specify this if `supportsProgress()` returns `true`.
|
|
56
|
+
* @returns The path of the bugreport file.
|
|
57
|
+
*/
|
|
58
|
+
async generate(onProgress) {
|
|
59
|
+
const process = await this.adb.subprocess.spawn([
|
|
60
|
+
'bugreportz',
|
|
61
|
+
...(onProgress ? ['-p'] : []),
|
|
62
|
+
]);
|
|
63
|
+
let filename;
|
|
64
|
+
let error;
|
|
65
|
+
await process.stdout
|
|
66
|
+
.pipeThrough(new DecodeUtf8Stream())
|
|
67
|
+
.pipeThrough(new SplitLineStream())
|
|
68
|
+
.pipeTo(new WritableStream({
|
|
69
|
+
write(line) {
|
|
70
|
+
// (Not 100% sure) `BEGIN:` and `PROGRESS:` only appear when `-p` is specified.
|
|
71
|
+
let match = line.match(BugReportZ.PROGRESS_REGEX);
|
|
72
|
+
if (match) {
|
|
73
|
+
onProgress?.(match[1], match[2]);
|
|
74
|
+
}
|
|
75
|
+
match = line.match(BugReportZ.BEGIN_REGEX);
|
|
76
|
+
if (match) {
|
|
77
|
+
filename = match[1];
|
|
78
|
+
}
|
|
79
|
+
match = line.match(BugReportZ.OK_REGEX);
|
|
80
|
+
if (match) {
|
|
81
|
+
filename = match[1];
|
|
82
|
+
}
|
|
83
|
+
match = line.match(BugReportZ.FAIL_REGEX);
|
|
84
|
+
if (match) {
|
|
85
|
+
// Don't report error now
|
|
86
|
+
// We want to gather all output.
|
|
87
|
+
error = match[1];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
if (error) {
|
|
92
|
+
throw new Error(error);
|
|
93
|
+
}
|
|
94
|
+
if (!filename) {
|
|
95
|
+
throw new Error('bugreportz did not return file name');
|
|
96
|
+
}
|
|
97
|
+
// Design choice: we don't automatically pull the file to avoid more dependency on `@yume-chan/adb`
|
|
98
|
+
return filename;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class BugReport extends AdbCommandBase {
|
|
102
|
+
generate() {
|
|
103
|
+
return new WrapReadableStream({
|
|
104
|
+
start: async () => {
|
|
105
|
+
const process = await this.adb.subprocess.spawn(['bugreport']);
|
|
106
|
+
return {
|
|
107
|
+
readable: process.stdout
|
|
108
|
+
.pipeThrough(new DecodeUtf8Stream()),
|
|
109
|
+
state: undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=bug-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-report.js","sourceRoot":"","sources":["../src/bug-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Adb, AdbCommandBase } from '@yume-chan/adb';
|
|
2
|
+
export declare enum DemoModeSignalStrength {
|
|
3
|
+
Hidden = "null",
|
|
4
|
+
Level0 = "0",
|
|
5
|
+
Level1 = "1",
|
|
6
|
+
Level2 = "2",
|
|
7
|
+
Level3 = "3",
|
|
8
|
+
Level4 = "4"
|
|
9
|
+
}
|
|
10
|
+
export declare const DemoModeMobileDataTypes: readonly ["1x", "3g", "4g", "4g+", "5g", "5ge", "5g+", "e", "g", "h", "h+", "lte", "lte+", "dis", "not", "null"];
|
|
11
|
+
export declare type DemoModeMobileDataType = (typeof DemoModeMobileDataTypes)[number];
|
|
12
|
+
export declare const DemoModeStatusBarModes: readonly ["opaque", "translucent", "semi-transparent", "transparent", "warning"];
|
|
13
|
+
export declare type DemoModeStatusBarMode = (typeof DemoModeStatusBarModes)[number];
|
|
14
|
+
export declare class DemoMode extends AdbCommandBase {
|
|
15
|
+
private settings;
|
|
16
|
+
constructor(adb: Adb);
|
|
17
|
+
static readonly AllowedSettingKey = "sysui_demo_allowed";
|
|
18
|
+
static readonly EnabledSettingKey = "sysui_tuner_demo_on";
|
|
19
|
+
getAllowed(): Promise<boolean>;
|
|
20
|
+
setAllowed(value: boolean): Promise<void>;
|
|
21
|
+
getEnabled(): Promise<boolean>;
|
|
22
|
+
setEnabled(value: boolean): Promise<void>;
|
|
23
|
+
broadcast(command: string, extra?: Record<string, string>): Promise<void>;
|
|
24
|
+
setBatteryLevel(level: number): Promise<void>;
|
|
25
|
+
setBatteryCharging(value: boolean): Promise<void>;
|
|
26
|
+
setPowerSaveMode(value: boolean): Promise<void>;
|
|
27
|
+
setAirplaneMode(show: boolean): Promise<void>;
|
|
28
|
+
setWifiSignalStrength(value: DemoModeSignalStrength): Promise<void>;
|
|
29
|
+
setMobileDataType(value: DemoModeMobileDataType): Promise<void>;
|
|
30
|
+
setMobileSignalStrength(value: DemoModeSignalStrength): Promise<void>;
|
|
31
|
+
setNoSimCardIcon(show: boolean): Promise<void>;
|
|
32
|
+
setStatusBarMode(mode: DemoModeStatusBarMode): Promise<void>;
|
|
33
|
+
setVibrateModeEnabled(value: boolean): Promise<void>;
|
|
34
|
+
setBluetoothConnected(value: boolean): Promise<void>;
|
|
35
|
+
setLocatingIcon(show: boolean): Promise<void>;
|
|
36
|
+
setAlarmIcon(show: boolean): Promise<void>;
|
|
37
|
+
setSyncingIcon(show: boolean): Promise<void>;
|
|
38
|
+
setMuteIcon(show: boolean): Promise<void>;
|
|
39
|
+
setSpeakerPhoneIcon(show: boolean): Promise<void>;
|
|
40
|
+
setNotificationsVisibility(show: boolean): Promise<void>;
|
|
41
|
+
setTime(hour: number, minute: number): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=demo-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-mode.d.ts","sourceRoot":"","sources":["../src/demo-mode.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,oBAAY,sBAAsB;IAC9B,MAAM,SAAS;IACf,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,MAAM,MAAM;CACf;AAGD,eAAO,MAAM,uBAAuB,kHACkC,CAAC;AAEvE,oBAAY,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAG9E,eAAO,MAAM,sBAAsB,kFAAmF,CAAC;AAEvH,oBAAY,qBAAqB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,qBAAa,QAAS,SAAQ,cAAc;IACxC,OAAO,CAAC,QAAQ,CAAW;gBAEf,GAAG,EAAE,GAAG;IAKpB,gBAAuB,iBAAiB,wBAAwB;IAKhE,gBAAuB,iBAAiB,yBAAyB;IAEpD,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAK9B,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAazE,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/D,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQpE"}
|
package/esm/demo-mode.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// cspell: ignore carriernetworkchange
|
|
2
|
+
// cspell: ignore powersave
|
|
3
|
+
// cspell: ignore nosim
|
|
4
|
+
// cspell: ignore systemui
|
|
5
|
+
// cspell: ignore sysui
|
|
6
|
+
import { AdbCommandBase } from '@yume-chan/adb';
|
|
7
|
+
import { Settings } from "./settings.js";
|
|
8
|
+
export var DemoModeSignalStrength;
|
|
9
|
+
(function (DemoModeSignalStrength) {
|
|
10
|
+
DemoModeSignalStrength["Hidden"] = "null";
|
|
11
|
+
DemoModeSignalStrength["Level0"] = "0";
|
|
12
|
+
DemoModeSignalStrength["Level1"] = "1";
|
|
13
|
+
DemoModeSignalStrength["Level2"] = "2";
|
|
14
|
+
DemoModeSignalStrength["Level3"] = "3";
|
|
15
|
+
DemoModeSignalStrength["Level4"] = "4";
|
|
16
|
+
})(DemoModeSignalStrength || (DemoModeSignalStrength = {}));
|
|
17
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java;l=1073
|
|
18
|
+
export const DemoModeMobileDataTypes = ['1x', '3g', '4g', '4g+', '5g', '5ge', '5g+',
|
|
19
|
+
'e', 'g', 'h', 'h+', 'lte', 'lte+', 'dis', 'not', 'null'];
|
|
20
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3136
|
|
21
|
+
export const DemoModeStatusBarModes = ['opaque', 'translucent', 'semi-transparent', 'transparent', 'warning'];
|
|
22
|
+
export class DemoMode extends AdbCommandBase {
|
|
23
|
+
settings;
|
|
24
|
+
constructor(adb) {
|
|
25
|
+
super(adb);
|
|
26
|
+
this.settings = new Settings(adb);
|
|
27
|
+
}
|
|
28
|
+
static AllowedSettingKey = 'sysui_demo_allowed';
|
|
29
|
+
// Demo Mode actually doesn't have a setting indicates its enablement
|
|
30
|
+
// However Developer Mode menu uses this key
|
|
31
|
+
// So we can only try our best to guess if it's enabled
|
|
32
|
+
static EnabledSettingKey = 'sysui_tuner_demo_on';
|
|
33
|
+
async getAllowed() {
|
|
34
|
+
const output = await this.settings.get('global', DemoMode.AllowedSettingKey);
|
|
35
|
+
return output.trim() === '1';
|
|
36
|
+
}
|
|
37
|
+
async setAllowed(value) {
|
|
38
|
+
if (value) {
|
|
39
|
+
await this.settings.put('global', DemoMode.AllowedSettingKey, '1');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await this.setEnabled(false);
|
|
43
|
+
await this.settings.delete('global', DemoMode.AllowedSettingKey);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async getEnabled() {
|
|
47
|
+
const result = await this.settings.get('global', DemoMode.EnabledSettingKey);
|
|
48
|
+
return result.trim() === '1';
|
|
49
|
+
}
|
|
50
|
+
async setEnabled(value) {
|
|
51
|
+
if (value) {
|
|
52
|
+
await this.settings.put('global', DemoMode.EnabledSettingKey, '1');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await this.settings.delete('global', DemoMode.EnabledSettingKey);
|
|
56
|
+
await this.broadcast('exit');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async broadcast(command, extra) {
|
|
60
|
+
await this.adb.subprocess.spawnAndWaitLegacy([
|
|
61
|
+
'am',
|
|
62
|
+
'broadcast',
|
|
63
|
+
'-a',
|
|
64
|
+
'com.android.systemui.demo',
|
|
65
|
+
'-e',
|
|
66
|
+
'command',
|
|
67
|
+
command,
|
|
68
|
+
...(extra ? Object.entries(extra).flatMap(([key, value]) => ['-e', key, value]) : []),
|
|
69
|
+
]);
|
|
70
|
+
}
|
|
71
|
+
async setBatteryLevel(level) {
|
|
72
|
+
await this.broadcast('battery', { level: level.toString() });
|
|
73
|
+
}
|
|
74
|
+
async setBatteryCharging(value) {
|
|
75
|
+
await this.broadcast('battery', { plugged: value.toString() });
|
|
76
|
+
}
|
|
77
|
+
async setPowerSaveMode(value) {
|
|
78
|
+
await this.broadcast('battery', { powersave: value.toString() });
|
|
79
|
+
}
|
|
80
|
+
async setAirplaneMode(show) {
|
|
81
|
+
await this.broadcast('network', { airplane: show ? 'show' : 'hide' });
|
|
82
|
+
}
|
|
83
|
+
async setWifiSignalStrength(value) {
|
|
84
|
+
await this.broadcast('network', { wifi: 'show', level: value });
|
|
85
|
+
}
|
|
86
|
+
async setMobileDataType(value) {
|
|
87
|
+
for (let i = 0; i < 2; i += 1) {
|
|
88
|
+
await this.broadcast('network', {
|
|
89
|
+
mobile: 'show',
|
|
90
|
+
sims: '1',
|
|
91
|
+
nosim: 'hide',
|
|
92
|
+
slot: '0',
|
|
93
|
+
datatype: value,
|
|
94
|
+
fully: 'true',
|
|
95
|
+
roam: 'false',
|
|
96
|
+
level: '4',
|
|
97
|
+
inflate: 'false',
|
|
98
|
+
activity: 'in',
|
|
99
|
+
carriernetworkchange: 'hide',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async setMobileSignalStrength(value) {
|
|
104
|
+
await this.broadcast('network', { mobile: 'show', level: value });
|
|
105
|
+
}
|
|
106
|
+
async setNoSimCardIcon(show) {
|
|
107
|
+
await this.broadcast('network', { nosim: show ? 'show' : 'hide' });
|
|
108
|
+
}
|
|
109
|
+
async setStatusBarMode(mode) {
|
|
110
|
+
await this.broadcast('bars', { mode });
|
|
111
|
+
}
|
|
112
|
+
async setVibrateModeEnabled(value) {
|
|
113
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=103
|
|
114
|
+
await this.broadcast('status', { volume: value ? 'vibrate' : 'hide' });
|
|
115
|
+
}
|
|
116
|
+
async setBluetoothConnected(value) {
|
|
117
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=114
|
|
118
|
+
await this.broadcast('status', { bluetooth: value ? 'connected' : 'hide' });
|
|
119
|
+
}
|
|
120
|
+
async setLocatingIcon(show) {
|
|
121
|
+
await this.broadcast('status', { location: show ? 'show' : 'hide' });
|
|
122
|
+
}
|
|
123
|
+
async setAlarmIcon(show) {
|
|
124
|
+
await this.broadcast('status', { alarm: show ? 'show' : 'hide' });
|
|
125
|
+
}
|
|
126
|
+
async setSyncingIcon(show) {
|
|
127
|
+
await this.broadcast('status', { sync: show ? 'show' : 'hide' });
|
|
128
|
+
}
|
|
129
|
+
async setMuteIcon(show) {
|
|
130
|
+
await this.broadcast('status', { mute: show ? 'show' : 'hide' });
|
|
131
|
+
}
|
|
132
|
+
async setSpeakerPhoneIcon(show) {
|
|
133
|
+
await this.broadcast('status', { speakerphone: show ? 'show' : 'hide' });
|
|
134
|
+
}
|
|
135
|
+
async setNotificationsVisibility(show) {
|
|
136
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3131
|
|
137
|
+
await this.broadcast('notifications', { visible: show.toString() });
|
|
138
|
+
}
|
|
139
|
+
async setTime(hour, minute) {
|
|
140
|
+
await this.broadcast('clock', {
|
|
141
|
+
// cspell: disable-next-line
|
|
142
|
+
hhmm: hour.toString().padStart(2, '0') +
|
|
143
|
+
minute.toString().padStart(2, '0'),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=demo-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-mode.js","sourceRoot":"","sources":["../src/demo-mode.ts"],"names":[],"mappings":"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"}
|
package/esm/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
package/esm/index.js
ADDED
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AdbCommandBase } from "@yume-chan/adb";
|
|
2
|
+
export declare type SettingsNamespace = 'system' | 'secure' | 'global';
|
|
3
|
+
export declare type SettingsResetMode = 'untrusted_defaults' | 'untrusted_clear' | 'trusted_defaults';
|
|
4
|
+
export declare class Settings extends AdbCommandBase {
|
|
5
|
+
base(command: string, namespace: SettingsNamespace, ...args: string[]): Promise<string>;
|
|
6
|
+
get(namespace: SettingsNamespace, key: string): Promise<string>;
|
|
7
|
+
delete(namespace: SettingsNamespace, key: string): Promise<string>;
|
|
8
|
+
put(namespace: SettingsNamespace, key: string, value: string, tag?: string, makeDefault?: boolean): Promise<string>;
|
|
9
|
+
reset(namespace: SettingsNamespace, mode: SettingsResetMode): Promise<string>;
|
|
10
|
+
reset(namespace: SettingsNamespace, packageName: string, tag?: string): Promise<string>;
|
|
11
|
+
list(namespace: SettingsNamespace): Promise<string[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,oBAAY,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,oBAAY,iBAAiB,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAG9F,qBAAa,QAAS,SAAQ,cAAc;IAGjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE;IAIrE,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM;IAI7C,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM;IAIhD,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO;IAWjG,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7E,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUjF,IAAI,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAIrE"}
|
package/esm/settings.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AdbCommandBase } from "@yume-chan/adb";
|
|
2
|
+
// frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java
|
|
3
|
+
export class Settings extends AdbCommandBase {
|
|
4
|
+
// TODO: `--user <user>` argument
|
|
5
|
+
base(command, namespace, ...args) {
|
|
6
|
+
return this.adb.subprocess.spawnAndWaitLegacy(['settings', command, namespace, ...args]);
|
|
7
|
+
}
|
|
8
|
+
get(namespace, key) {
|
|
9
|
+
return this.base('get', namespace, key);
|
|
10
|
+
}
|
|
11
|
+
delete(namespace, key) {
|
|
12
|
+
return this.base('delete', namespace, key);
|
|
13
|
+
}
|
|
14
|
+
put(namespace, key, value, tag, makeDefault) {
|
|
15
|
+
return this.base('put', namespace, key, value, ...(tag ? [tag] : []), ...(makeDefault ? ['default'] : []));
|
|
16
|
+
}
|
|
17
|
+
reset(namespace, modeOrPackageName, tag) {
|
|
18
|
+
return this.base('reset', namespace, modeOrPackageName, ...(tag ? [tag] : []));
|
|
19
|
+
}
|
|
20
|
+
async list(namespace) {
|
|
21
|
+
const output = await this.base('list', namespace);
|
|
22
|
+
return output.split('\n');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMhD,oGAAoG;AACpG,MAAM,OAAO,QAAS,SAAQ,cAAc;IACxC,iCAAiC;IAE1B,IAAI,CAAC,OAAe,EAAE,SAA4B,EAAE,GAAG,IAAc;QACxE,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7F,CAAC;IAEM,GAAG,CAAC,SAA4B,EAAE,GAAW;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,SAA4B,EAAE,GAAW;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEM,GAAG,CAAC,SAA4B,EAAE,GAAW,EAAE,KAAa,EAAE,GAAY,EAAE,WAAqB;QACpG,OAAO,IAAI,CAAC,IAAI,CACZ,KAAK,EACL,SAAS,EACT,GAAG,EACH,KAAK,EACL,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACrB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACtC,CAAC;IACN,CAAC;IAIM,KAAK,CAAC,SAA4B,EAAE,iBAAyB,EAAE,GAAY;QAC9E,OAAO,IAAI,CAAC,IAAI,CACZ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CACxB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,SAA4B;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACJ"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yume-chan/android-bin",
|
|
3
|
+
"version": "0.0.11",
|
|
4
|
+
"description": "Wrappers for Android built-in executables.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"adb",
|
|
7
|
+
"Android"
|
|
8
|
+
],
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"author": {
|
|
11
|
+
"name": "Simon Chan",
|
|
12
|
+
"email": "cnsimonchan@live.com",
|
|
13
|
+
"url": "https://chensi.moe/blog"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/yume-chan/ya-webadb/tree/master/libraries/android-bin#readme",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/yume-chan/ya-webadb.git",
|
|
19
|
+
"directory": "libraries/android-bin"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/yume-chan/ya-webadb/issues"
|
|
23
|
+
},
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "esm/index.js",
|
|
26
|
+
"types": "esm/index.d.ts",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "next",
|
|
29
|
+
"@yume-chan/ts-package-builder": "^1.0.0"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@yume-chan/adb": "^0.0.11",
|
|
33
|
+
"tslib": "^2.3.1"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "build-ts-package",
|
|
37
|
+
"build:watch": "build-ts-package --incremental"
|
|
38
|
+
},
|
|
39
|
+
"readme": "# `@yume-chan/android-bin`\r\n\r\nWrappers for Android built-in executables.\r\n\r\nCurrently it's bound to `@yume-chan/adb`, maybe one day it can be used with other executors.\r\n"
|
|
40
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// cspell: ignore bugreport
|
|
2
|
+
// cspell: ignore bugreportz
|
|
3
|
+
|
|
4
|
+
import { AdbCommandBase, AdbShellSubprocessProtocol, DecodeUtf8Stream, ReadableStream, SplitLineStream, WrapReadableStream, WritableStream } from "@yume-chan/adb";
|
|
5
|
+
|
|
6
|
+
export interface BugReportVersion {
|
|
7
|
+
major: number;
|
|
8
|
+
minor: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class BugReportZ extends AdbCommandBase {
|
|
12
|
+
public static VERSION_REGEX = /(\d+)\.(\d+)/;
|
|
13
|
+
|
|
14
|
+
public static BEGIN_REGEX = /BEGIN:(.*)/;
|
|
15
|
+
|
|
16
|
+
public static PROGRESS_REGEX = /PROGRESS:(.*)\/(.*)/;
|
|
17
|
+
|
|
18
|
+
public static OK_REGEX = /OK:(.*)/;
|
|
19
|
+
|
|
20
|
+
public static FAIL_REGEX = /FAIL:(.*)/;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve the version of bugreportz.
|
|
24
|
+
*
|
|
25
|
+
* @returns a `BugReportVersion` object, or `undefined` if `bugreportz` is not available.
|
|
26
|
+
*/
|
|
27
|
+
public async version(): Promise<BugReportVersion | undefined> {
|
|
28
|
+
// bugreportz requires shell protocol
|
|
29
|
+
if (!AdbShellSubprocessProtocol.isSupported(this.adb)) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const { stderr, exitCode } = await this.adb.subprocess.spawnAndWait(['bugreportz', '-v']);
|
|
34
|
+
if (exitCode !== 0 || stderr === '') {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const match = stderr.match(BugReportZ.VERSION_REGEX);
|
|
39
|
+
if (!match) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
major: parseInt(match[1]!, 10),
|
|
45
|
+
minor: parseInt(match[2]!, 10),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public supportStream(version: BugReportVersion): boolean {
|
|
50
|
+
return version.major > 1 || version.minor >= 2;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public stream(): ReadableStream<Uint8Array> {
|
|
54
|
+
return new WrapReadableStream<Uint8Array, ReadableStream<Uint8Array>, undefined>({
|
|
55
|
+
start: async () => {
|
|
56
|
+
const process = await this.adb.subprocess.spawn(['bugreportz', '-s']);
|
|
57
|
+
return {
|
|
58
|
+
readable: process.stdout,
|
|
59
|
+
state: undefined,
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public supportProgress(version: BugReportVersion): boolean {
|
|
66
|
+
return version.major > 1 || version.minor >= 1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Create a zipped bugreport file.
|
|
71
|
+
*
|
|
72
|
+
* Compare to `stream`, this method will write the output on device. You can pull it using sync protocol.
|
|
73
|
+
*
|
|
74
|
+
* @param onProgress Progress callback. Only specify this if `supportsProgress()` returns `true`.
|
|
75
|
+
* @returns The path of the bugreport file.
|
|
76
|
+
*/
|
|
77
|
+
public async generate(onProgress?: (progress: string, total: string) => void): Promise<string> {
|
|
78
|
+
const process = await this.adb.subprocess.spawn([
|
|
79
|
+
'bugreportz',
|
|
80
|
+
...(onProgress ? ['-p'] : []),
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
let filename: string | undefined;
|
|
84
|
+
let error: string | undefined;
|
|
85
|
+
|
|
86
|
+
await process.stdout
|
|
87
|
+
.pipeThrough(new DecodeUtf8Stream())
|
|
88
|
+
.pipeThrough(new SplitLineStream())
|
|
89
|
+
.pipeTo(new WritableStream<string>({
|
|
90
|
+
write(line) {
|
|
91
|
+
// (Not 100% sure) `BEGIN:` and `PROGRESS:` only appear when `-p` is specified.
|
|
92
|
+
let match = line.match(BugReportZ.PROGRESS_REGEX);
|
|
93
|
+
if (match) {
|
|
94
|
+
onProgress?.(match[1]!, match[2]!);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
match = line.match(BugReportZ.BEGIN_REGEX);
|
|
98
|
+
if (match) {
|
|
99
|
+
filename = match[1]!;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
match = line.match(BugReportZ.OK_REGEX);
|
|
103
|
+
if (match) {
|
|
104
|
+
filename = match[1];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
match = line.match(BugReportZ.FAIL_REGEX);
|
|
108
|
+
if (match) {
|
|
109
|
+
// Don't report error now
|
|
110
|
+
// We want to gather all output.
|
|
111
|
+
error = match[1];
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
if (error) {
|
|
118
|
+
throw new Error(error);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!filename) {
|
|
122
|
+
throw new Error('bugreportz did not return file name');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Design choice: we don't automatically pull the file to avoid more dependency on `@yume-chan/adb`
|
|
126
|
+
return filename;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export class BugReport extends AdbCommandBase {
|
|
131
|
+
public generate(): ReadableStream<string> {
|
|
132
|
+
return new WrapReadableStream<string, ReadableStream<string>, undefined>({
|
|
133
|
+
start: async () => {
|
|
134
|
+
const process = await this.adb.subprocess.spawn(['bugreport']);
|
|
135
|
+
return {
|
|
136
|
+
readable: process.stdout
|
|
137
|
+
.pipeThrough(new DecodeUtf8Stream()),
|
|
138
|
+
state: undefined,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
package/src/demo-mode.ts
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// cspell: ignore carriernetworkchange
|
|
2
|
+
// cspell: ignore powersave
|
|
3
|
+
// cspell: ignore nosim
|
|
4
|
+
// cspell: ignore systemui
|
|
5
|
+
// cspell: ignore sysui
|
|
6
|
+
|
|
7
|
+
import { Adb, AdbCommandBase } from '@yume-chan/adb';
|
|
8
|
+
import { Settings } from "./settings.js";
|
|
9
|
+
|
|
10
|
+
export enum DemoModeSignalStrength {
|
|
11
|
+
Hidden = 'null',
|
|
12
|
+
Level0 = '0',
|
|
13
|
+
Level1 = '1',
|
|
14
|
+
Level2 = '2',
|
|
15
|
+
Level3 = '3',
|
|
16
|
+
Level4 = '4',
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java;l=1073
|
|
20
|
+
export const DemoModeMobileDataTypes = ['1x', '3g', '4g', '4g+', '5g', '5ge', '5g+',
|
|
21
|
+
'e', 'g', 'h', 'h+', 'lte', 'lte+', 'dis', 'not', 'null'] as const;
|
|
22
|
+
|
|
23
|
+
export type DemoModeMobileDataType = (typeof DemoModeMobileDataTypes)[number];
|
|
24
|
+
|
|
25
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3136
|
|
26
|
+
export const DemoModeStatusBarModes = ['opaque', 'translucent', 'semi-transparent', 'transparent', 'warning'] as const;
|
|
27
|
+
|
|
28
|
+
export type DemoModeStatusBarMode = (typeof DemoModeStatusBarModes)[number];
|
|
29
|
+
|
|
30
|
+
export class DemoMode extends AdbCommandBase {
|
|
31
|
+
private settings: Settings;
|
|
32
|
+
|
|
33
|
+
constructor(adb: Adb) {
|
|
34
|
+
super(adb);
|
|
35
|
+
this.settings = new Settings(adb);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public static readonly AllowedSettingKey = 'sysui_demo_allowed';
|
|
39
|
+
|
|
40
|
+
// Demo Mode actually doesn't have a setting indicates its enablement
|
|
41
|
+
// However Developer Mode menu uses this key
|
|
42
|
+
// So we can only try our best to guess if it's enabled
|
|
43
|
+
public static readonly EnabledSettingKey = 'sysui_tuner_demo_on';
|
|
44
|
+
|
|
45
|
+
public async getAllowed(): Promise<boolean> {
|
|
46
|
+
const output = await this.settings.get('global', DemoMode.AllowedSettingKey);
|
|
47
|
+
return output.trim() === '1';
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public async setAllowed(value: boolean): Promise<void> {
|
|
51
|
+
if (value) {
|
|
52
|
+
await this.settings.put('global', DemoMode.AllowedSettingKey, '1');
|
|
53
|
+
} else {
|
|
54
|
+
await this.setEnabled(false);
|
|
55
|
+
await this.settings.delete('global', DemoMode.AllowedSettingKey);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public async getEnabled(): Promise<boolean> {
|
|
60
|
+
const result = await this.settings.get('global', DemoMode.EnabledSettingKey);
|
|
61
|
+
return result.trim() === '1';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public async setEnabled(value: boolean): Promise<void> {
|
|
65
|
+
if (value) {
|
|
66
|
+
await this.settings.put('global', DemoMode.EnabledSettingKey, '1');
|
|
67
|
+
} else {
|
|
68
|
+
await this.settings.delete('global', DemoMode.EnabledSettingKey);
|
|
69
|
+
await this.broadcast('exit');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public async broadcast(command: string, extra?: Record<string, string>): Promise<void> {
|
|
74
|
+
await this.adb.subprocess.spawnAndWaitLegacy([
|
|
75
|
+
'am',
|
|
76
|
+
'broadcast',
|
|
77
|
+
'-a',
|
|
78
|
+
'com.android.systemui.demo',
|
|
79
|
+
'-e',
|
|
80
|
+
'command',
|
|
81
|
+
command,
|
|
82
|
+
...(extra ? Object.entries(extra).flatMap(([key, value]) => ['-e', key, value]) : []),
|
|
83
|
+
]);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public async setBatteryLevel(level: number): Promise<void> {
|
|
87
|
+
await this.broadcast('battery', { level: level.toString() });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public async setBatteryCharging(value: boolean): Promise<void> {
|
|
91
|
+
await this.broadcast('battery', { plugged: value.toString() });
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public async setPowerSaveMode(value: boolean): Promise<void> {
|
|
95
|
+
await this.broadcast('battery', { powersave: value.toString() });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public async setAirplaneMode(show: boolean): Promise<void> {
|
|
99
|
+
await this.broadcast('network', { airplane: show ? 'show' : 'hide' });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public async setWifiSignalStrength(value: DemoModeSignalStrength): Promise<void> {
|
|
103
|
+
await this.broadcast('network', { wifi: 'show', level: value });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public async setMobileDataType(value: DemoModeMobileDataType): Promise<void> {
|
|
107
|
+
for (let i = 0; i < 2; i += 1) {
|
|
108
|
+
await this.broadcast('network', {
|
|
109
|
+
mobile: 'show',
|
|
110
|
+
sims: '1',
|
|
111
|
+
nosim: 'hide',
|
|
112
|
+
slot: '0',
|
|
113
|
+
datatype: value,
|
|
114
|
+
fully: 'true',
|
|
115
|
+
roam: 'false',
|
|
116
|
+
level: '4',
|
|
117
|
+
inflate: 'false',
|
|
118
|
+
activity: 'in',
|
|
119
|
+
carriernetworkchange: 'hide',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public async setMobileSignalStrength(value: DemoModeSignalStrength): Promise<void> {
|
|
125
|
+
await this.broadcast('network', { mobile: 'show', level: value });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public async setNoSimCardIcon(show: boolean): Promise<void> {
|
|
129
|
+
await this.broadcast('network', { nosim: show ? 'show' : 'hide' });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public async setStatusBarMode(mode: DemoModeStatusBarMode): Promise<void> {
|
|
133
|
+
await this.broadcast('bars', { mode });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public async setVibrateModeEnabled(value: boolean): Promise<void> {
|
|
137
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=103
|
|
138
|
+
await this.broadcast('status', { volume: value ? 'vibrate' : 'hide' });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public async setBluetoothConnected(value: boolean): Promise<void> {
|
|
142
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java;l=114
|
|
143
|
+
await this.broadcast('status', { bluetooth: value ? 'connected' : 'hide' });
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public async setLocatingIcon(show: boolean): Promise<void> {
|
|
147
|
+
await this.broadcast('status', { location: show ? 'show' : 'hide' });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public async setAlarmIcon(show: boolean): Promise<void> {
|
|
151
|
+
await this.broadcast('status', { alarm: show ? 'show' : 'hide' });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
public async setSyncingIcon(show: boolean): Promise<void> {
|
|
155
|
+
await this.broadcast('status', { sync: show ? 'show' : 'hide' });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public async setMuteIcon(show: boolean): Promise<void> {
|
|
159
|
+
await this.broadcast('status', { mute: show ? 'show' : 'hide' });
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public async setSpeakerPhoneIcon(show: boolean): Promise<void> {
|
|
163
|
+
await this.broadcast('status', { speakerphone: show ? 'show' : 'hide' });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public async setNotificationsVisibility(show: boolean): Promise<void> {
|
|
167
|
+
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java;l=3131
|
|
168
|
+
await this.broadcast('notifications', { visible: show.toString() });
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
public async setTime(hour: number, minute: number): Promise<void> {
|
|
172
|
+
await this.broadcast('clock', {
|
|
173
|
+
// cspell: disable-next-line
|
|
174
|
+
hhmm:
|
|
175
|
+
hour.toString().padStart(2, '0') +
|
|
176
|
+
minute.toString().padStart(2, '0'),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
package/src/index.ts
ADDED
package/src/settings.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { AdbCommandBase } from "@yume-chan/adb";
|
|
2
|
+
|
|
3
|
+
export type SettingsNamespace = 'system' | 'secure' | 'global';
|
|
4
|
+
|
|
5
|
+
export type SettingsResetMode = 'untrusted_defaults' | 'untrusted_clear' | 'trusted_defaults';
|
|
6
|
+
|
|
7
|
+
// frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java
|
|
8
|
+
export class Settings extends AdbCommandBase {
|
|
9
|
+
// TODO: `--user <user>` argument
|
|
10
|
+
|
|
11
|
+
public base(command: string, namespace: SettingsNamespace, ...args: string[]) {
|
|
12
|
+
return this.adb.subprocess.spawnAndWaitLegacy(['settings', command, namespace, ...args]);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public get(namespace: SettingsNamespace, key: string) {
|
|
16
|
+
return this.base('get', namespace, key);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public delete(namespace: SettingsNamespace, key: string) {
|
|
20
|
+
return this.base('delete', namespace, key);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public put(namespace: SettingsNamespace, key: string, value: string, tag?: string, makeDefault?: boolean) {
|
|
24
|
+
return this.base(
|
|
25
|
+
'put',
|
|
26
|
+
namespace,
|
|
27
|
+
key,
|
|
28
|
+
value,
|
|
29
|
+
...(tag ? [tag] : []),
|
|
30
|
+
...(makeDefault ? ['default'] : []),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public reset(namespace: SettingsNamespace, mode: SettingsResetMode): Promise<string>;
|
|
35
|
+
public reset(namespace: SettingsNamespace, packageName: string, tag?: string): Promise<string>;
|
|
36
|
+
public reset(namespace: SettingsNamespace, modeOrPackageName: string, tag?: string): Promise<string> {
|
|
37
|
+
return this.base(
|
|
38
|
+
'reset',
|
|
39
|
+
namespace,
|
|
40
|
+
modeOrPackageName,
|
|
41
|
+
...(tag ? [tag] : []),
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public async list(namespace: SettingsNamespace): Promise<string[]> {
|
|
46
|
+
const output = await this.base('list', namespace);
|
|
47
|
+
return output.split('\n');
|
|
48
|
+
}
|
|
49
|
+
}
|