frida-float-menu 1.0.0

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.
Files changed (44) hide show
  1. package/README.md +404 -0
  2. package/lib/api.d.ts +50 -0
  3. package/lib/api.js +149 -0
  4. package/lib/component/button.d.ts +11 -0
  5. package/lib/component/button.js +57 -0
  6. package/lib/component/category.d.ts +8 -0
  7. package/lib/component/category.js +37 -0
  8. package/lib/component/checkBox.d.ts +28 -0
  9. package/lib/component/checkBox.js +199 -0
  10. package/lib/component/collapsible.d.ts +19 -0
  11. package/lib/component/collapsible.js +177 -0
  12. package/lib/component/image.d.ts +18 -0
  13. package/lib/component/image.js +87 -0
  14. package/lib/component/input.d.ts +33 -0
  15. package/lib/component/input.js +346 -0
  16. package/lib/component/selector.d.ts +22 -0
  17. package/lib/component/selector.js +95 -0
  18. package/lib/component/slider.d.ts +18 -0
  19. package/lib/component/slider.js +155 -0
  20. package/lib/component/style/style.d.ts +5 -0
  21. package/lib/component/style/style.js +261 -0
  22. package/lib/component/style/theme.d.ts +29 -0
  23. package/lib/component/style/theme.js +23 -0
  24. package/lib/component/switch.d.ts +12 -0
  25. package/lib/component/switch.js +77 -0
  26. package/lib/component/text.d.ts +9 -0
  27. package/lib/component/text.js +36 -0
  28. package/lib/component/ui-components.d.ts +24 -0
  29. package/lib/component/ui-components.js +49 -0
  30. package/lib/component/views/log-view.d.ts +25 -0
  31. package/lib/component/views/log-view.js +231 -0
  32. package/lib/component/views/tabs-view.d.ts +35 -0
  33. package/lib/component/views/tabs-view.js +296 -0
  34. package/lib/event-emitter.d.ts +10 -0
  35. package/lib/event-emitter.js +52 -0
  36. package/lib/float-menu.d.ts +63 -0
  37. package/lib/float-menu.js +568 -0
  38. package/lib/index.d.ts +12 -0
  39. package/lib/index.js +28 -0
  40. package/lib/logger.d.ts +43 -0
  41. package/lib/logger.js +183 -0
  42. package/lib/utils.d.ts +8 -0
  43. package/lib/utils.js +16 -0
  44. package/package.json +36 -0
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dp = dp;
4
+ exports.applyStyle = applyStyle;
5
+ exports.applyEditTextStyle = applyEditTextStyle;
6
+ const api_1 = require("../../api");
7
+ function dp(ctx, v) {
8
+ const dm = ctx.getResources().getDisplayMetrics();
9
+ return Math.floor(v * dm.density.value + 0.5);
10
+ }
11
+ function applyStyle(view, role, theme) {
12
+ const ctx = view.getContext();
13
+ const dpx = (v) => dp(ctx, v);
14
+ const withAlpha = (color, alpha) => {
15
+ const a = Math.max(0, Math.min(255, alpha)) & 0xff;
16
+ return (a << 24) | (color & 0x00ffffff) | 0;
17
+ };
18
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
19
+ const TextView = Java.use("android.widget.TextView");
20
+ const rounded = (bg, rDp, stroke) => {
21
+ const d = GradientDrawable.$new();
22
+ d.setColor(bg | 0);
23
+ d.setCornerRadius(dp(ctx, rDp));
24
+ if (stroke)
25
+ d.setStroke(dp(ctx, stroke.wDp), stroke.c);
26
+ view.setBackground(d);
27
+ };
28
+ const asTextView = () => {
29
+ try {
30
+ return Java.cast(view, TextView);
31
+ }
32
+ catch (_e) {
33
+ return null;
34
+ }
35
+ };
36
+ switch (role) {
37
+ case "overlay":
38
+ rounded(theme.colors.overlayBg, theme.radiusDp.overlay);
39
+ view.setPadding(dp(ctx, 12), dp(ctx, 12), dp(ctx, 12), dp(ctx, 12));
40
+ view.setElevation(dp(ctx, 10));
41
+ break;
42
+ case "card":
43
+ rounded(theme.colors.cardBg, theme.radiusDp.card, {
44
+ c: theme.colors.divider,
45
+ wDp: 1,
46
+ });
47
+ view.setPadding(dp(ctx, 12), dp(ctx, 12), dp(ctx, 12), dp(ctx, 12));
48
+ view.setElevation(dp(ctx, 6));
49
+ break;
50
+ case "category": {
51
+ const bg = theme.colors.accentSoft ?? withAlpha(theme.colors.accent, 0x22);
52
+ const stroke = theme.colors.accentStroke ?? theme.colors.controlStroke;
53
+ rounded(bg, 1, { c: stroke, wDp: 2 });
54
+ view.setPadding(dpx(14), dpx(10), dpx(14), dpx(10));
55
+ const tv = asTextView();
56
+ if (tv) {
57
+ tv.setTextColor(theme.colors.text);
58
+ tv.setTextSize(2, theme.textSp.title);
59
+ tv.setTypeface(null, 1);
60
+ tv.setGravity(api_1.API.Gravity.CENTER.value);
61
+ try {
62
+ tv.setTypeface(null, 1);
63
+ }
64
+ catch (e) {
65
+ }
66
+ }
67
+ break;
68
+ }
69
+ case "row": {
70
+ const rowBg = theme.colors.rowBg ?? withAlpha(theme.colors.controlBg, 0x22);
71
+ const stroke = withAlpha(theme.colors.controlStroke, 0x33);
72
+ rounded(rowBg, theme.radiusDp.control, { c: stroke, wDp: 1 });
73
+ view.setPadding(dpx(12), dpx(10), dpx(12), dpx(10));
74
+ break;
75
+ }
76
+ case "text": {
77
+ const tv = asTextView();
78
+ if (tv) {
79
+ tv.setTextColor(theme.colors.text);
80
+ tv.setTextSize(2, theme.textSp.body);
81
+ }
82
+ break;
83
+ }
84
+ case "caption": {
85
+ const tv = asTextView();
86
+ if (tv) {
87
+ tv.setTextColor(theme.colors.subText);
88
+ tv.setTextSize(2, theme.textSp.caption);
89
+ }
90
+ break;
91
+ }
92
+ case "inputTrigger": {
93
+ const bg = theme.colors.accentSoft ?? theme.colors.controlBg;
94
+ const stroke = theme.colors.accentStroke ?? theme.colors.controlStroke;
95
+ rounded(bg, theme.radiusDp.control, { c: stroke, wDp: 2 });
96
+ view.setPadding(dpx(12), dpx(10), dpx(12), dpx(10));
97
+ view.setMinimumHeight(dp(ctx, 42));
98
+ const tv = asTextView();
99
+ if (tv) {
100
+ tv.setTextColor(theme.colors.text);
101
+ tv.setTextSize(2, theme.textSp.body);
102
+ tv.setAllCaps(false);
103
+ }
104
+ break;
105
+ }
106
+ case "primaryButton": {
107
+ rounded(theme.colors.accent, theme.radiusDp.control);
108
+ view.setPadding(dp(ctx, 14), dp(ctx, 10), dp(ctx, 14), dp(ctx, 10));
109
+ view.setMinimumHeight(dp(ctx, 40));
110
+ const tv = asTextView();
111
+ if (tv) {
112
+ tv.setTextColor(0xffffffff | 0);
113
+ tv.setTextSize(2, theme.textSp.body);
114
+ tv.setAllCaps(false);
115
+ }
116
+ break;
117
+ }
118
+ case "dangerButton": {
119
+ rounded(theme.colors.danger, theme.radiusDp.control);
120
+ view.setPadding(dp(ctx, 14), dp(ctx, 10), dp(ctx, 14), dp(ctx, 10));
121
+ view.setMinimumHeight(dp(ctx, 40));
122
+ const tv = asTextView();
123
+ if (tv) {
124
+ tv.setTextColor(0xffffffff | 0);
125
+ tv.setTextSize(2, theme.textSp.body);
126
+ tv.setAllCaps(false);
127
+ }
128
+ break;
129
+ }
130
+ case "headerBar": {
131
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
132
+ const ctx = view.getContext();
133
+ const bg = GradientDrawable.$new();
134
+ bg.setCornerRadius(dp(ctx, 14));
135
+ bg.setColor(theme.colors.cardBg);
136
+ bg.setStroke(dp(ctx, 1), theme.colors.accentStroke ?? theme.colors.controlStroke);
137
+ view.setBackgroundDrawable(bg);
138
+ view.setPadding(dp(ctx, 10), dp(ctx, 8), dp(ctx, 10), dp(ctx, 8));
139
+ break;
140
+ }
141
+ case "iconButton": {
142
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
143
+ const ctx = view.getContext();
144
+ const bg = GradientDrawable.$new();
145
+ bg.setCornerRadius(dp(ctx, 10));
146
+ bg.setColor(0x00000000);
147
+ bg.setStroke(dp(ctx, 1), theme.colors.accentStroke ?? theme.colors.controlStroke);
148
+ view.setBackgroundDrawable(bg);
149
+ view.setPadding(dp(ctx, 6), dp(ctx, 6), dp(ctx, 6), dp(ctx, 6));
150
+ if (view.setAllCaps)
151
+ view.setAllCaps(false);
152
+ if (view.setTextColor)
153
+ view.setTextColor(theme.colors.text);
154
+ if (view.setTextSize)
155
+ view.setTextSize(2, theme.textSp.body);
156
+ break;
157
+ }
158
+ case "textButton": {
159
+ const ctx = view.getContext();
160
+ try {
161
+ view.setBackground(null);
162
+ }
163
+ catch (e) { }
164
+ if (view.setAllCaps)
165
+ view.setAllCaps(false);
166
+ if (view.setTextColor)
167
+ view.setTextColor(theme.colors.accent);
168
+ if (view.setTextSize)
169
+ view.setTextSize(2, theme.textSp.body);
170
+ view.setPadding(dp(ctx, 8), dp(ctx, 6), dp(ctx, 8), dp(ctx, 6));
171
+ break;
172
+ }
173
+ case "dangerTextButton": {
174
+ const ctx = view.getContext();
175
+ try {
176
+ view.setBackground(null);
177
+ }
178
+ catch (e) { }
179
+ if (view.setAllCaps)
180
+ view.setAllCaps(false);
181
+ if (view.setTextColor)
182
+ view.setTextColor(theme.colors.danger ?? theme.colors.accent);
183
+ if (view.setTextSize)
184
+ view.setTextSize(2, theme.textSp.body);
185
+ view.setPadding(dp(ctx, 8), dp(ctx, 6), dp(ctx, 8), dp(ctx, 6));
186
+ break;
187
+ }
188
+ case "divider": {
189
+ const ctx = view.getContext();
190
+ view.setBackgroundColor(theme.colors.divider);
191
+ const lp = view.getLayoutParams?.();
192
+ if (lp) {
193
+ lp.height = dp(ctx, 1);
194
+ view.setLayoutParams(lp);
195
+ }
196
+ break;
197
+ }
198
+ case "chip": {
199
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
200
+ const ctx = view.getContext();
201
+ const bg = GradientDrawable.$new();
202
+ bg.setCornerRadius(dp(ctx, 999));
203
+ bg.setColor(theme.colors.chipBg ?? theme.colors.rowBg);
204
+ bg.setStroke(dp(ctx, 1), theme.colors.accentStroke ?? theme.colors.controlStroke);
205
+ view.setBackgroundDrawable(bg);
206
+ view.setPadding(dp(ctx, 10), dp(ctx, 4), dp(ctx, 10), dp(ctx, 4));
207
+ if (view.setTextColor)
208
+ view.setTextColor(theme.colors.subText);
209
+ if (view.setTextSize)
210
+ view.setTextSize(2, theme.textSp.caption ?? theme.textSp.body);
211
+ break;
212
+ }
213
+ case "dialog": {
214
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
215
+ const ctx = view.getContext();
216
+ const bg = GradientDrawable.$new();
217
+ bg.setCornerRadius(dp(ctx, 14));
218
+ bg.setColor(theme.colors.cardBg);
219
+ bg.setStroke(dp(ctx, 1), theme.colors.accentStroke ?? theme.colors.controlStroke);
220
+ view.setBackgroundDrawable(bg);
221
+ view.setPadding(dp(ctx, 12), dp(ctx, 12), dp(ctx, 12), dp(ctx, 12));
222
+ break;
223
+ }
224
+ case "inputField": {
225
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
226
+ const ctx = view.getContext();
227
+ const bg = GradientDrawable.$new();
228
+ bg.setCornerRadius(dp(ctx, 12));
229
+ bg.setColor(theme.colors.inputBg ?? theme.colors.rowBg);
230
+ bg.setStroke(dp(ctx, 1), theme.colors.accentStroke ?? theme.colors.controlStroke);
231
+ view.setBackgroundDrawable(bg);
232
+ view.setPadding(dp(ctx, 12), dp(ctx, 10), dp(ctx, 12), dp(ctx, 10));
233
+ if (view.setTextColor)
234
+ view.setTextColor(theme.colors.text);
235
+ if (view.setHintTextColor)
236
+ view.setHintTextColor(theme.colors.subText);
237
+ if (view.setTextSize)
238
+ view.setTextSize(2, theme.textSp.body);
239
+ break;
240
+ }
241
+ }
242
+ }
243
+ function applyEditTextStyle(editText, theme) {
244
+ const ctx = editText.getContext();
245
+ const GradientDrawable = Java.use("android.graphics.drawable.GradientDrawable");
246
+ const d = GradientDrawable.$new();
247
+ d.setColor(theme.colors.controlBg);
248
+ d.setCornerRadius(dp(ctx, theme.radiusDp.control));
249
+ d.setStroke(dp(ctx, 1), theme.colors.controlStroke);
250
+ editText.setBackground(d);
251
+ editText.setPadding(dp(ctx, 12), dp(ctx, 10), dp(ctx, 12), dp(ctx, 10));
252
+ try {
253
+ editText.setTextColor(theme.colors.text);
254
+ editText.setHintTextColor(theme.colors.subText);
255
+ if (editText.setHighlightColor)
256
+ editText.setHighlightColor(theme.colors.accent);
257
+ if (editText.setLinkTextColor)
258
+ editText.setLinkTextColor(theme.colors.accent);
259
+ }
260
+ catch (_e) { }
261
+ }
@@ -0,0 +1,29 @@
1
+ export type Theme = {
2
+ colors: {
3
+ overlayBg: number;
4
+ cardBg: number;
5
+ text: number;
6
+ subText: number;
7
+ accent: number;
8
+ danger: number;
9
+ divider: number;
10
+ controlBg: number;
11
+ controlStroke: number;
12
+ accentSoft?: number;
13
+ accentStroke?: number;
14
+ rowBg?: number;
15
+ inputBg?: number;
16
+ chipBg?: number;
17
+ };
18
+ radiusDp: {
19
+ overlay: number;
20
+ card: number;
21
+ control: number;
22
+ };
23
+ textSp: {
24
+ title: number;
25
+ body: number;
26
+ caption: number;
27
+ };
28
+ };
29
+ export declare const DarkNeonTheme: Theme;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DarkNeonTheme = void 0;
4
+ exports.DarkNeonTheme = {
5
+ colors: {
6
+ overlayBg: 0xcc0b0f1a | 0,
7
+ cardBg: 0xe61a1f2e | 0,
8
+ text: 0xffeaf0ff | 0,
9
+ subText: 0xff9aa4b2 | 0,
10
+ accent: 0xff3b82f6 | 0,
11
+ danger: 0xffef4444 | 0,
12
+ divider: 0x22ffffff | 0,
13
+ controlBg: 0x33111827 | 0,
14
+ controlStroke: 0x333b82f6 | 0,
15
+ accentSoft: 0x223b82f6 | 0,
16
+ accentStroke: 0x663b82f6 | 0,
17
+ rowBg: 0x1a111827 | 0,
18
+ inputBg: 0x2a111827 | 0,
19
+ chipBg: 0x22111827 | 0,
20
+ },
21
+ radiusDp: { overlay: 16, card: 14, control: 12 },
22
+ textSp: { title: 14, body: 13, caption: 11 },
23
+ };
@@ -0,0 +1,12 @@
1
+ import { UIComponent } from "./ui-components";
2
+ export declare class Switch extends UIComponent {
3
+ private label;
4
+ private handler?;
5
+ private switchView;
6
+ private labelView;
7
+ private setOnValueChange;
8
+ constructor(id: string, label: string, initialValue?: boolean);
9
+ protected createView(context: any): void;
10
+ protected updateView(): void;
11
+ setLabel(label: string): void;
12
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Switch = void 0;
4
+ const api_1 = require("../api");
5
+ const style_1 = require("./style/style");
6
+ const ui_components_1 = require("./ui-components");
7
+ class Switch extends ui_components_1.UIComponent {
8
+ setOnValueChange(handler) {
9
+ this.handler = handler;
10
+ }
11
+ constructor(id, label, initialValue = false) {
12
+ super(id);
13
+ this.label = label;
14
+ this.value = initialValue;
15
+ }
16
+ createView(context) {
17
+ const LinearLayout = api_1.API.LinearLayout;
18
+ const LinearLayoutParams = api_1.API.LinearLayoutParams;
19
+ const ViewGroupLayoutParams = api_1.API.ViewGroupLayoutParams;
20
+ const Gravity = api_1.API.Gravity;
21
+ const TextView = api_1.API.TextView;
22
+ const Switch = api_1.API.Switch;
23
+ const String = api_1.API.JString;
24
+ const row = LinearLayout.$new(context);
25
+ row.setOrientation(LinearLayout.HORIZONTAL.value);
26
+ row.setGravity(Gravity.CENTER_VERTICAL.value);
27
+ (0, style_1.applyStyle)(row, "row", this.menu.options.theme);
28
+ const label = TextView.$new(context);
29
+ label.setText(String.$new(this.label));
30
+ (0, style_1.applyStyle)(label, "text", this.menu.options.theme);
31
+ label.setLayoutParams(LinearLayoutParams.$new(0, ViewGroupLayoutParams.WRAP_CONTENT.value, 1));
32
+ const sw = Switch.$new(context);
33
+ sw.setChecked(this.value);
34
+ sw.setText(String.$new(""));
35
+ row.addView(label);
36
+ row.addView(sw);
37
+ this.view = row;
38
+ this.switchView = sw;
39
+ this.labelView = label;
40
+ const Listener = api_1.API.CompoundButtonOnCheckedChangeListener;
41
+ const self = this;
42
+ const changeListener = Java.registerClass({
43
+ name: "com.frida.MyCheckedChangeListener" +
44
+ Date.now() +
45
+ Math.random().toString(36).substring(6),
46
+ implements: [Listener],
47
+ methods: {
48
+ onCheckedChanged: function (_btn, isChecked) {
49
+ self.value = isChecked;
50
+ self.emit("valueChanged", isChecked);
51
+ if (self.handler)
52
+ setImmediate(() => self.handler(isChecked));
53
+ },
54
+ },
55
+ });
56
+ this.switchView.setOnCheckedChangeListener(changeListener.$new());
57
+ }
58
+ updateView() {
59
+ if (!this.view)
60
+ return;
61
+ Java.scheduleOnMainThread(() => {
62
+ if (this.switchView)
63
+ this.switchView.setChecked(this.value);
64
+ });
65
+ }
66
+ setLabel(label) {
67
+ this.label = label;
68
+ if (!this.view)
69
+ return;
70
+ Java.scheduleOnMainThread(() => {
71
+ const String = api_1.API.JString;
72
+ if (this.labelView)
73
+ this.labelView.setText(String.$new(label));
74
+ });
75
+ }
76
+ }
77
+ exports.Switch = Switch;
@@ -0,0 +1,9 @@
1
+ import { UIComponent } from "./ui-components";
2
+ export declare class TextView extends UIComponent {
3
+ private content;
4
+ private size;
5
+ constructor(id: string, content: string, size?: number);
6
+ protected createView(context: any): void;
7
+ protected updateView(): void;
8
+ setText(content: string): void;
9
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextView = void 0;
4
+ const api_1 = require("../api");
5
+ const style_1 = require("./style/style");
6
+ const ui_components_1 = require("./ui-components");
7
+ class TextView extends ui_components_1.UIComponent {
8
+ constructor(id, content, size = 16) {
9
+ super(id);
10
+ this.content = content;
11
+ this.value = content;
12
+ this.size = size;
13
+ }
14
+ createView(context) {
15
+ const TextView = api_1.API.TextView;
16
+ const Html = api_1.API.Html;
17
+ this.view = TextView.$new(context);
18
+ (0, style_1.applyStyle)(this.view, "text", this.menu.options.theme);
19
+ this.view.setTextSize(this.size);
20
+ this.view.setText(Html.fromHtml(this.content));
21
+ }
22
+ updateView() {
23
+ if (!this.view)
24
+ return;
25
+ Java.scheduleOnMainThread(() => {
26
+ const Html = api_1.API.Html;
27
+ this.view.setText(Html.fromHtml(this.value));
28
+ });
29
+ }
30
+ setText(content) {
31
+ this.content = content;
32
+ this.value = content;
33
+ this.updateView();
34
+ }
35
+ }
36
+ exports.TextView = TextView;
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from "../event-emitter";
2
+ import { FloatMenu } from "../float-menu";
3
+ export declare abstract class UIComponent {
4
+ protected emitter: EventEmitter;
5
+ protected view: any;
6
+ protected value: any;
7
+ protected id: string;
8
+ protected menu: FloatMenu;
9
+ constructor(id: string);
10
+ setMenu(menu: FloatMenu): void;
11
+ apply(role: any, theme: any): void;
12
+ getView(): any;
13
+ getValue(): any;
14
+ getId(): string;
15
+ setValue(value: any): void;
16
+ on(event: string, listener: (...args: any[]) => void): void;
17
+ off(event: string, listener: (...args: any[]) => void): void;
18
+ protected emit(event: string, ...args: any[]): void;
19
+ protected abstract createView(context: any): void;
20
+ init(context: any): void;
21
+ protected abstract updateView(): void;
22
+ attach(): void;
23
+ detach(): void;
24
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UIComponent = void 0;
4
+ const event_emitter_1 = require("../event-emitter");
5
+ const style_1 = require("./style/style");
6
+ class UIComponent {
7
+ constructor(id) {
8
+ this.emitter = new event_emitter_1.EventEmitter();
9
+ this.id = id;
10
+ }
11
+ setMenu(menu) {
12
+ this.menu = menu;
13
+ }
14
+ apply(role, theme) {
15
+ if (!this.view)
16
+ return;
17
+ Java.scheduleOnMainThread(() => (0, style_1.applyStyle)(this.view, role, theme));
18
+ }
19
+ getView() {
20
+ return this.view;
21
+ }
22
+ getValue() {
23
+ return this.value;
24
+ }
25
+ getId() {
26
+ return this.id;
27
+ }
28
+ setValue(value) {
29
+ this.value = value;
30
+ this.updateView();
31
+ }
32
+ on(event, listener) {
33
+ this.emitter.on(event, listener);
34
+ }
35
+ off(event, listener) {
36
+ this.emitter.off(event, listener);
37
+ }
38
+ emit(event, ...args) {
39
+ this.emitter.emit(event, ...args);
40
+ }
41
+ init(context) {
42
+ this.createView(context);
43
+ }
44
+ attach() {
45
+ }
46
+ detach() {
47
+ }
48
+ }
49
+ exports.UIComponent = UIComponent;
@@ -0,0 +1,25 @@
1
+ export declare class LogView {
2
+ private context;
3
+ private logDrawerPanel;
4
+ isLogDrawerOpen: boolean;
5
+ private _loggerUnsub;
6
+ private logView;
7
+ private logMaxLines;
8
+ private theme;
9
+ private parentView;
10
+ private height;
11
+ logScrollView: any;
12
+ constructor(context: any, height: number, theme: any, logMaxLines?: number);
13
+ private bindLoggerToLogViewOnce;
14
+ private _logMaxLinesCache;
15
+ private _logRing;
16
+ private _logHead;
17
+ private _logSize;
18
+ private _logPending;
19
+ private _logFlushScheduled;
20
+ private addLogToView;
21
+ createViewOnce(parentView: any): void;
22
+ openLogDrawer(): void;
23
+ closeLogDrawer(): void;
24
+ private createLogView;
25
+ }