├── .gitattributes
├── .gitignore
├── AndroidLoggerApp.deployproj
├── AndroidLoggerApp.dpr
├── AndroidLoggerApp.dproj
├── AndroidLoggerApp.res
├── AndroidLoggers.groupproj
├── AndroidManifest.template.xml
├── AndroudLoggerApp.Main.fmx
├── AndroudLoggerApp.Main.pas
├── FMX.Platform.Logger.Android.Fix.pas
├── FixAndroidLogger.deployproj
├── FixAndroidLogger.dpr
├── FixAndroidLogger.dproj
├── FixAndroidLogger.res
├── FixAndroudLoggerDemoImpl.LgXhdpiPh.fmx
├── FixAndroudLoggerDemoImpl.fmx
├── FixAndroudLoggerDemoImpl.pas
├── README.md
└── images
├── AndroidLogViewer.gif
├── ChangeTag2.png
├── console2.png
└── log-1.png
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Uncomment these types if you want even more clean repository. But be careful.
2 | # It can make harm to an existing project source. Read explanations below.
3 | #
4 | # Resource files are binaries containing manifest, project icon and version info.
5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
6 | #*.res
7 | #
8 | # Type library file (binary). In old Delphi versions it should be stored.
9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
10 | #*.tlb
11 | #
12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
13 | # Uncomment this if you are not using diagrams or use newer Delphi version.
14 | #*.ddp
15 | #
16 | # Visual LiveBindings file. Added in Delphi XE2.
17 | # Uncomment this if you are not using LiveBindings Designer.
18 | #*.vlb
19 | #
20 | # Deployment Manager configuration file for your project. Added in Delphi XE2.
21 | # Uncomment this if it is not mobile development and you do not use remote debug feature.
22 | #*.deployproj
23 | #
24 | # C++ object files produced when C/C++ Output file generation is configured.
25 | # Uncomment this if you are not using external objects (zlib library for example).
26 | #*.obj
27 | #
28 |
29 | # Delphi compiler-generated binaries (safe to delete)
30 | *.exe
31 | *.dll
32 | *.bpl
33 | *.bpi
34 | *.dcp
35 | *.so
36 | *.apk
37 | *.drc
38 | *.map
39 | *.dres
40 | *.rsm
41 | *.tds
42 | *.dcu
43 | *.lib
44 | *.a
45 | *.o
46 | *.ocx
47 |
48 | # Delphi autogenerated files (duplicated info)
49 | *.cfg
50 | *.hpp
51 | *Resource.rc
52 |
53 | # Delphi local files (user-specific info)
54 | *.local
55 | *.identcache
56 | *.projdata
57 | *.tvsconfig
58 | *.dsk
59 |
60 | # Delphi history and backups
61 | __history/
62 | __recovery/
63 | *.~*
64 |
65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi)
66 | *.stat
67 | Android/
68 | Android32/
69 | Android64/
70 | Win32/
71 | *.sdk
72 |
--------------------------------------------------------------------------------
/AndroidLoggerApp.deployproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 12
5 |
6 |
7 | 29271FDH300BL0
8 | 29271FDH300BL0
9 |
10 |
11 |
12 |
13 |
14 |
15 | AndroidLoggerApp\library\lib\arm64-v8a\
16 | libAndroidLoggerApp.so
17 | ProjectOutput
18 | 1
19 |
20 |
21 | True
22 | True
23 |
24 |
25 | AndroidLoggerApp\res\drawable-hdpi\
26 | ic_launcher.png
27 | Android_LauncherIcon72
28 | 1
29 |
30 |
31 | True
32 |
33 |
34 | AndroidLoggerApp\
35 | AndroidManifest.xml
36 | ProjectAndroidManifest
37 | 1
38 |
39 |
40 | True
41 |
42 |
43 | AndroidLoggerApp\res\drawable-xxhdpi\
44 | ic_launcher.png
45 | Android_LauncherIcon144
46 | 1
47 |
48 |
49 | True
50 |
51 |
52 | AndroidLoggerApp\res\drawable-xxxhdpi\
53 | ic_launcher.png
54 | Android_LauncherIcon192
55 | 1
56 |
57 |
58 | True
59 |
60 |
61 | AndroidLoggerApp\res\drawable-mdpi\
62 | ic_launcher.png
63 | Android_LauncherIcon48
64 | 1
65 |
66 |
67 | True
68 |
69 |
70 | AndroidLoggerApp\res\drawable-xhdpi\
71 | ic_notification.png
72 | Android_NotificationIcon48
73 | 1
74 |
75 |
76 | True
77 |
78 |
79 | AndroidLoggerApp\res\drawable-large\
80 | splash_image.png
81 | Android_SplashImage640
82 | 1
83 |
84 |
85 | True
86 |
87 |
88 | AndroidLoggerApp\library\lib\armeabi\
89 | libFixAndroidLogger.so
90 | AndroidLibnativeArmeabiFile
91 | 1
92 |
93 |
94 | True
95 |
96 |
97 | AndroidLoggerApp\res\values\
98 | colors.xml
99 | Android_Colors
100 | 1
101 |
102 |
103 | True
104 |
105 |
106 | AndroidLoggerApp\res\drawable-hdpi\
107 | ic_notification.png
108 | Android_NotificationIcon36
109 | 1
110 |
111 |
112 | True
113 |
114 |
115 | AndroidLoggerApp\res\drawable-xxxhdpi\
116 | ic_notification.png
117 | Android_NotificationIcon96
118 | 1
119 |
120 |
121 | True
122 |
123 |
124 | AndroidLoggerApp\res\drawable\
125 | splash_image_def.xml
126 | AndroidSplashImageDef
127 | 1
128 |
129 |
130 | True
131 |
132 |
133 | AndroidLoggerApp\library\lib\mips\
134 | libFixAndroidLogger.so
135 | AndroidLibnativeMipsFile
136 | 1
137 |
138 |
139 | True
140 |
141 |
142 | AndroidLoggerApp\res\drawable-xhdpi\
143 | ic_launcher.png
144 | Android_LauncherIcon96
145 | 1
146 |
147 |
148 | True
149 |
150 |
151 | AndroidLoggerApp\library\lib\armeabi-v7a\
152 | libFixAndroidLogger.so
153 | AndroidLibnativeArmeabiv7aFile
154 | 1
155 |
156 |
157 | True
158 |
159 |
160 | AndroidLoggerApp\res\drawable-mdpi\
161 | ic_notification.png
162 | Android_NotificationIcon24
163 | 1
164 |
165 |
166 | True
167 |
168 |
169 | AndroidLoggerApp\res\drawable-ldpi\
170 | ic_launcher.png
171 | Android_LauncherIcon36
172 | 1
173 |
174 |
175 | True
176 |
177 |
178 | AndroidLoggerApp\res\drawable-xlarge\
179 | splash_image.png
180 | Android_SplashImage960
181 | 1
182 |
183 |
184 | True
185 |
186 |
187 | AndroidLoggerApp\res\drawable-small\
188 | splash_image.png
189 | Android_SplashImage426
190 | 1
191 |
192 |
193 | True
194 |
195 |
196 | AndroidLoggerApp\res\values\
197 | styles.xml
198 | AndroidSplashStyles
199 | 1
200 |
201 |
202 | True
203 |
204 |
205 | AndroidLoggerApp\res\values\
206 | strings.xml
207 | Android_Strings
208 | 1
209 |
210 |
211 | True
212 |
213 |
214 | AndroidLoggerApp\classes\
215 | AndroidLoggerApp.classes
216 | AndroidClasses
217 | 64
218 |
219 |
220 | True
221 |
222 |
223 | AndroidLoggerApp\res\values-v21\
224 | styles.xml
225 | AndroidSplashStylesV21
226 | 1
227 |
228 |
229 | True
230 |
231 |
232 | AndroidLoggerApp\res\drawable-xxhdpi\
233 | ic_notification.png
234 | Android_NotificationIcon72
235 | 1
236 |
237 |
238 | True
239 |
240 |
241 | AndroidLoggerApp\res\drawable-normal\
242 | splash_image.png
243 | Android_SplashImage470
244 | 1
245 |
246 |
247 | True
248 |
249 |
250 |
251 |
252 | AndroidLoggerApp\res\drawable-large\
253 | splash_image.png
254 | Android_SplashImage640
255 | 1
256 |
257 |
258 | True
259 |
260 |
261 | AndroidLoggerApp\res\values\
262 | strings.xml
263 | Android_Strings
264 | 1
265 |
266 |
267 | True
268 |
269 |
270 | AndroidLoggerApp\res\values\
271 | colors.xml
272 | Android_Colors
273 | 1
274 |
275 |
276 | True
277 |
278 |
279 | AndroidLoggerApp\res\drawable\
280 | splash_image_def.xml
281 | AndroidSplashImageDef
282 | 1
283 |
284 |
285 | True
286 |
287 |
288 | AndroidLoggerApp\res\drawable-hdpi\
289 | ic_launcher.png
290 | Android_LauncherIcon72
291 | 1
292 |
293 |
294 | True
295 |
296 |
297 | AndroidLoggerApp\res\drawable-normal\
298 | splash_image.png
299 | Android_SplashImage470
300 | 1
301 |
302 |
303 | True
304 |
305 |
306 | AndroidLoggerApp\res\drawable-xxhdpi\
307 | ic_notification.png
308 | Android_NotificationIcon72
309 | 1
310 |
311 |
312 | True
313 |
314 |
315 | AndroidLoggerApp\res\drawable-xxhdpi\
316 | ic_launcher.png
317 | Android_LauncherIcon144
318 | 1
319 |
320 |
321 | True
322 |
323 |
324 | AndroidLoggerApp\res\drawable-xxxhdpi\
325 | ic_launcher.png
326 | Android_LauncherIcon192
327 | 1
328 |
329 |
330 | True
331 |
332 |
333 | AndroidLoggerApp\res\drawable-mdpi\
334 | ic_launcher.png
335 | Android_LauncherIcon48
336 | 1
337 |
338 |
339 | True
340 |
341 |
342 | AndroidLoggerApp\library\lib\armeabi-v7a\
343 | libAndroidLoggerApp.so
344 | ProjectOutput
345 | 1
346 |
347 |
348 | True
349 | True
350 |
351 |
352 | AndroidLoggerApp\res\drawable-xhdpi\
353 | ic_launcher.png
354 | Android_LauncherIcon96
355 | 1
356 |
357 |
358 | True
359 |
360 |
361 | AndroidLoggerApp\res\drawable-xlarge\
362 | splash_image.png
363 | Android_SplashImage960
364 | 1
365 |
366 |
367 | True
368 |
369 |
370 | AndroidLoggerApp\
371 | AndroidManifest.xml
372 | ProjectAndroidManifest
373 | 1
374 |
375 |
376 | True
377 |
378 |
379 | AndroidLoggerApp\classes\
380 | FixAndroidLogger.classes
381 | AndroidClasses
382 | 64
383 |
384 |
385 | True
386 |
387 |
388 | AndroidLoggerApp\res\values\
389 | styles.xml
390 | AndroidSplashStyles
391 | 1
392 |
393 |
394 | True
395 |
396 |
397 | AndroidLoggerApp\res\drawable-xhdpi\
398 | ic_notification.png
399 | Android_NotificationIcon48
400 | 1
401 |
402 |
403 | True
404 |
405 |
406 | AndroidLoggerApp\res\values-v21\
407 | styles.xml
408 | AndroidSplashStylesV21
409 | 1
410 |
411 |
412 | True
413 |
414 |
415 | AndroidLoggerApp\library\lib\armeabi\
416 | libFixAndroidLogger.so
417 | AndroidLibnativeArmeabiFile
418 | 1
419 |
420 |
421 | True
422 |
423 |
424 | AndroidLoggerApp\res\drawable-mdpi\
425 | ic_notification.png
426 | Android_NotificationIcon24
427 | 1
428 |
429 |
430 | True
431 |
432 |
433 | AndroidLoggerApp\res\drawable-small\
434 | splash_image.png
435 | Android_SplashImage426
436 | 1
437 |
438 |
439 | True
440 |
441 |
442 | AndroidLoggerApp\res\drawable-ldpi\
443 | ic_launcher.png
444 | Android_LauncherIcon36
445 | 1
446 |
447 |
448 | True
449 |
450 |
451 | AndroidLoggerApp\library\lib\mips\
452 | libFixAndroidLogger.so
453 | AndroidLibnativeMipsFile
454 | 1
455 |
456 |
457 | True
458 |
459 |
460 | AndroidLoggerApp\res\drawable-hdpi\
461 | ic_notification.png
462 | Android_NotificationIcon36
463 | 1
464 |
465 |
466 | True
467 |
468 |
469 | AndroidLoggerApp\res\drawable-xxxhdpi\
470 | ic_notification.png
471 | Android_NotificationIcon96
472 | 1
473 |
474 |
475 | True
476 |
477 |
478 |
479 |
--------------------------------------------------------------------------------
/AndroidLoggerApp.dpr:
--------------------------------------------------------------------------------
1 | program AndroidLoggerApp;
2 |
3 | uses
4 | System.StartUpCopy,
5 | FMX.Forms,
6 | AndroudLoggerApp.Main in 'AndroudLoggerApp.Main.pas' {frmLogDemo};
7 |
8 | {$R *.res}
9 |
10 | begin
11 | Application.Initialize;
12 | Application.CreateForm(TfrmLogDemo, frmLogDemo);
13 | Application.Run;
14 | end.
15 |
--------------------------------------------------------------------------------
/AndroidLoggerApp.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/AndroidLoggerApp.res
--------------------------------------------------------------------------------
/AndroidLoggers.groupproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {7D2B1AF8-D79B-4306-BE30-BE1CF3A251F5}
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | Default.Personality.12
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/AndroidManifest.template.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 | <%uses-permission%>
11 |
12 |
21 |
22 | <%application-meta-data%>
23 | <%services%>
24 |
26 |
30 |
31 |
33 |
34 |
35 |
36 |
37 |
38 | <%activity%>
39 | <%receivers%>
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/AndroudLoggerApp.Main.fmx:
--------------------------------------------------------------------------------
1 | object frmLogDemo: TfrmLogDemo
2 | Left = 0
3 | Top = 0
4 | Caption = 'Form4'
5 | ClientHeight = 480
6 | ClientWidth = 640
7 | FormFactor.Width = 320
8 | FormFactor.Height = 480
9 | FormFactor.Devices = [Desktop]
10 | OnCreate = FormCreate
11 | OnDestroy = FormDestroy
12 | DesignerMasterStyle = 3
13 | object Panel1: TPanel
14 | Align = Top
15 | Size.Width = 640.000000000000000000
16 | Size.Height = 153.000000000000000000
17 | Size.PlatformDefault = False
18 | TabOrder = 2
19 | object btnSendToLog: TButton
20 | Position.Y = 85.000000000000000000
21 | Size.Width = 113.000000000000000000
22 | Size.Height = 44.000000000000000000
23 | Size.PlatformDefault = False
24 | TabOrder = 0
25 | Text = 'Send To Log'
26 | OnClick = btnSendToLogClick
27 | end
28 | object Panel4: TPanel
29 | Align = Top
30 | Size.Width = 640.000000000000000000
31 | Size.Height = 77.000000000000000000
32 | Size.PlatformDefault = False
33 | TabOrder = 2
34 | object edLog: TEdit
35 | Touch.InteractiveGestures = [LongTap, DoubleTap]
36 | Align = Client
37 | TabOrder = 1
38 | Text = 'This is a log message'
39 | Size.Width = 640.000000000000000000
40 | Size.Height = 32.000000000000000000
41 | Size.PlatformDefault = False
42 | end
43 | object Label1: TLabel
44 | Align = Top
45 | Size.Width = 640.000000000000000000
46 | Size.Height = 23.000000000000000000
47 | Size.PlatformDefault = False
48 | Text = 'Log message'
49 | TabOrder = 2
50 | end
51 | end
52 | end
53 | object Panel2: TPanel
54 | Align = Top
55 | Position.Y = 153.000000000000000000
56 | Size.Width = 640.000000000000000000
57 | Size.Height = 120.000000000000000000
58 | Size.PlatformDefault = False
59 | TabOrder = 0
60 | object btnChangeTag: TButton
61 | Position.Y = 55.000000000000000000
62 | Size.Width = 113.000000000000000000
63 | Size.Height = 44.000000000000000000
64 | Size.PlatformDefault = False
65 | TabOrder = 1
66 | Text = 'Change Tag'
67 | end
68 | object edTagName: TEdit
69 | Touch.InteractiveGestures = [LongTap, DoubleTap]
70 | Align = Top
71 | TabOrder = 2
72 | Text = 'chuacw'
73 | Position.Y = 23.000000000000000000
74 | Size.Width = 640.000000000000000000
75 | Size.Height = 32.000000000000000000
76 | Size.PlatformDefault = False
77 | end
78 | object Label2: TLabel
79 | Align = Top
80 | Size.Width = 640.000000000000000000
81 | Size.Height = 23.000000000000000000
82 | Size.PlatformDefault = False
83 | Text = 'Tag Name'
84 | TabOrder = 4
85 | end
86 | end
87 | object Panel3: TPanel
88 | Align = Top
89 | Position.Y = 273.000000000000000000
90 | Size.Width = 640.000000000000000000
91 | Size.Height = 144.000000000000000000
92 | Size.PlatformDefault = False
93 | TabOrder = 1
94 | object Panel5: TPanel
95 | Align = Top
96 | Size.Width = 640.000000000000000000
97 | Size.Height = 49.000000000000000000
98 | Size.PlatformDefault = False
99 | TabOrder = 3
100 | object Label3: TLabel
101 | Align = Top
102 | Size.Width = 640.000000000000000000
103 | Size.Height = 23.000000000000000000
104 | Size.PlatformDefault = False
105 | Text = 'Log message'
106 | TabOrder = 2
107 | end
108 | object edPriorityTag: TEdit
109 | Touch.InteractiveGestures = [LongTap, DoubleTap]
110 | Align = Top
111 | TabOrder = 4
112 | Text = 'This is a log message with priority'
113 | Position.Y = 23.000000000000000000
114 | Size.Width = 640.000000000000000000
115 | Size.Height = 32.000000000000000000
116 | Size.PlatformDefault = False
117 | end
118 | object Panel6: TPanel
119 | Align = Top
120 | Position.Y = 55.000000000000000000
121 | Size.Width = 640.000000000000000000
122 | Size.Height = 120.000000000000000000
123 | Size.PlatformDefault = False
124 | TabOrder = 5
125 | object btnSendToPriorityLog: TButton
126 | Position.Y = 25.000000000000000000
127 | Size.Width = 113.000000000000000000
128 | Size.Height = 44.000000000000000000
129 | Size.PlatformDefault = False
130 | TabOrder = 0
131 | Text = 'Send To Log'
132 | end
133 | object rbDebug: TRadioButton
134 | GroupName = 'Priority'
135 | Position.X = 274.000000000000000000
136 | Position.Y = 25.000000000000000000
137 | TabOrder = 2
138 | Text = 'Debug'
139 | end
140 | object rbError: TRadioButton
141 | GroupName = 'Priority'
142 | IsChecked = True
143 | Position.X = 274.000000000000000000
144 | Position.Y = 73.000000000000000000
145 | TabOrder = 1
146 | Text = 'Error'
147 | end
148 | object rbVerbose: TRadioButton
149 | GroupName = 'Priority'
150 | Position.X = 146.000000000000000000
151 | Position.Y = 73.000000000000000000
152 | TabOrder = 4
153 | Text = 'Verbose'
154 | end
155 | object rbInfo: TRadioButton
156 | GroupName = 'Priority'
157 | Position.X = 146.000000000000000000
158 | Position.Y = 25.000000000000000000
159 | TabOrder = 5
160 | Text = 'Info'
161 | end
162 | end
163 | end
164 | end
165 | end
166 |
--------------------------------------------------------------------------------
/AndroudLoggerApp.Main.pas:
--------------------------------------------------------------------------------
1 | unit AndroudLoggerApp.Main;
2 |
3 | interface
4 |
5 | uses
6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
8 | FMX.Controls.Presentation, FMX.Edit;
9 |
10 | type
11 | TfrmLogDemo = class(TForm)
12 | edLog: TEdit;
13 | btnSendToLog: TButton;
14 | Panel1: TPanel;
15 | Panel2: TPanel;
16 | btnChangeTag: TButton;
17 | edTagName: TEdit;
18 | Panel3: TPanel;
19 | edPriorityTag: TEdit;
20 | Panel4: TPanel;
21 | Label1: TLabel;
22 | Label2: TLabel;
23 | Label3: TLabel;
24 | Panel5: TPanel;
25 | Panel6: TPanel;
26 | btnSendToPriorityLog: TButton;
27 | rbDebug: TRadioButton;
28 | rbError: TRadioButton;
29 | rbVerbose: TRadioButton;
30 | rbInfo: TRadioButton;
31 | procedure btnSendToLogClick(Sender: TObject);
32 | procedure FormCreate(Sender: TObject);
33 | procedure FormDestroy(Sender: TObject);
34 | private
35 | { Private declarations }
36 | procedure Log(const AMsg: string);
37 | public
38 | { Public declarations }
39 | end;
40 |
41 | var
42 | frmLogDemo: TfrmLogDemo;
43 |
44 | implementation
45 | uses
46 | FMX.Platform;
47 |
48 | {$R *.fmx}
49 |
50 | procedure TfrmLogDemo.btnSendToLogClick(Sender: TObject);
51 | var
52 | LLogService: IFMXLoggingService;
53 | begin
54 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService,
55 | LLogService) then
56 | begin
57 | LLogService.Log(edLog.Text, []);
58 | end;
59 | end;
60 |
61 | procedure TfrmLogDemo.FormCreate(Sender: TObject);
62 | begin
63 | Log('Application started.');
64 | end;
65 |
66 | procedure TfrmLogDemo.FormDestroy(Sender: TObject);
67 | begin
68 | Log('Shutting down application.');
69 | end;
70 |
71 | procedure TfrmLogDemo.Log(const AMsg: string);
72 | var
73 | LLogService: IFMXLoggingService;
74 | begin
75 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService,
76 | LLogService) then
77 | begin
78 | LLogService.Log(AMsg, []);
79 | end;
80 | end;
81 |
82 | end.
83 |
--------------------------------------------------------------------------------
/FMX.Platform.Logger.Android.Fix.pas:
--------------------------------------------------------------------------------
1 | unit FMX.Platform.Logger.Android.Fix;
2 |
3 | interface
4 | uses
5 | {$IF DEFINED(ANDROID)}
6 | Androidapi.Log,
7 | {$ENDIF}
8 | FMX.Platform;
9 |
10 | type
11 | /// Provides the ability to change the default tag used when logging.
12 | IFMXChangeTag = interface
13 | ['{2D2FE594-3F82-4A6D-8C51-60918C76C1B8}']
14 | procedure ChangeTag(const ANewTag: string);
15 | function GetTag: string;
16 | property Tag: string read GetTag write ChangeTag;
17 | end;
18 |
19 | /// Provides the ability to log messages with specific tags
20 | IFMXTagPriority = interface
21 | ['{6CC65368-A359-4DE4-B987-5D433D093110}']
22 |
23 | /// Log a debug message.
24 | procedure d(const Msg: string); overload;
25 | /// Log a debug message with a tag.
26 | procedure d(const Tag, Msg: string); overload;
27 |
28 | /// Log an error message.
29 | procedure e(const Msg: string); overload;
30 | /// Log an error message with a tag.
31 | procedure e(const Tag, Msg: string); overload;
32 |
33 | /// Log an info message.
34 | procedure i(const Msg: string); overload;
35 | /// Log an info message with a tag.
36 | procedure i(const Tag, Msg: string); overload;
37 |
38 | /// Log a verbose message.
39 | procedure v(const Msg: string); overload;
40 | /// Log a verbose message with a tag.
41 | procedure v(const Tag, Msg: string); overload;
42 | end;
43 |
44 | {$IF DEFINED(ANDROID)}
45 | type
46 |
47 | TFixedAndroidLoggerService = class(TInterfacedObject, IFMXLoggingService,
48 | IFMXChangeTag, IFMXTagPriority)
49 | protected
50 | FLogger: IFMXLoggingService;
51 | FTag: string;
52 | procedure Clear;
53 | public
54 | procedure ChangeTag(const ANewTag: string);
55 | function GetTag: string;
56 | constructor Create(const ATag: string='DELPHIFMX');
57 | destructor Destroy; override;
58 | procedure Log(const AFormat: string; const AParams: array of const);
59 |
60 | procedure LogPriority(APriority: android_LogPriority; const ATag, AMsg: string);
61 |
62 | // IFMXTagPriority
63 | procedure d(const Msg: string); overload;
64 | procedure d(const Tag, Msg: string); overload; virtual;
65 | procedure e(const Msg: string); overload;
66 | procedure e(const Tag, Msg: string); overload; virtual;
67 | procedure i(const Msg: string); overload;
68 | procedure i(const Tag, Msg: string); overload; virtual;
69 | procedure v(const Msg: string); overload;
70 | procedure v(const Tag, Msg: string); overload; virtual;
71 |
72 | property Tag: string read GetTag write ChangeTag;
73 | end;
74 |
75 | Log = class abstract
76 | strict private
77 | class var FLogger: IInterface;
78 | class var FLogPriority: IFMXTagPriority;
79 | class function GetLogger: IInterface; static;
80 | class function GetLogPriority: IFMXTagPriority; static;
81 | protected
82 | /// Referece to the logger service.
83 | class property Logger: IInterface read GetLogger;
84 | class property LogPriority: IFMXTagPriority read GetLogPriority;
85 | public
86 | /// Log a simple debug message.
87 | class procedure d(const Msg: string); overload;
88 | /// Log a debug message with a tag.
89 | class procedure d(const Tag, Msg: string); overload;
90 |
91 | /// Log a simple error message.
92 | class procedure e(const Msg: string); overload;
93 | /// Log an error message with a tag.
94 | class procedure e(const Tag, Msg: string); overload;
95 |
96 | /// Log a simple info message.
97 | class procedure i(const Msg: string); overload;
98 | /// Log an info message with a tag.
99 | class procedure i(const Tag, Msg: string); overload;
100 |
101 | /// Log a verbose message.
102 | class procedure v(const Msg: string); overload;
103 | /// Log an verbose message with a tag.
104 | class procedure v(const Tag, Msg: string); overload;
105 | end;
106 |
107 | {$ELSE}
108 | type
109 |
110 | Log = class abstract
111 | strict private
112 | class var FLogger: IInterface;
113 | class var FLogPriority: IFMXTagPriority;
114 | class function GetLogger: IInterface; static;
115 | class function GetLogPriority: IFMXTagPriority; static;
116 | protected
117 | /// Referece to the logger service.
118 | class property Logger: IInterface read GetLogger;
119 | class property LogPriority: IFMXTagPriority read GetLogPriority;
120 | public
121 | /// Log a simple debug message.
122 | class procedure d(const Msg: string); overload; static;
123 | /// Log a debug message with a tag.
124 | class procedure d(const Tag, Msg: string); overload; static;
125 |
126 | /// Log a simple error message.
127 | class procedure e(const Msg: string); overload; static;
128 | /// Log an error message with a tag.
129 | class procedure e(const Tag, Msg: string); overload; static;
130 |
131 | /// Log a simple info message.
132 | class procedure i(const Msg: string); overload; static;
133 | /// Log an info message with a tag.
134 | class procedure i(const Tag, Msg: string); overload; static;
135 |
136 | /// Log a verbose message.
137 | class procedure v(const Msg: string); overload; static;
138 | /// Log an verbose message with a tag.
139 | class procedure v(const Tag, Msg: string); overload; static;
140 | end;
141 |
142 | android_LogPriority = (
143 | ANDROID_LOG_UNKNOWN,
144 | ANDROID_LOG_DEFAULT,
145 | ANDROID_LOG_VERBOSE,
146 | ANDROID_LOG_DEBUG,
147 | ANDROID_LOG_INFO,
148 | ANDROID_LOG_WARN,
149 | ANDROID_LOG_ERROR,
150 | ANDROID_LOG_FATAL,
151 | ANDROID_LOG_SILENT
152 | );
153 |
154 | TFixedAndroidLoggerService = class(TInterfacedObject, IFMXLoggingService,
155 | IFMXChangeTag, IFMXTagPriority)
156 | protected
157 | FLogger: IFMXLoggingService;
158 | FTag: string;
159 | procedure Clear;
160 | public
161 |
162 | class procedure LogPriority(APriority: android_LogPriority; const ATag, AMsg: string); static;
163 |
164 | // IFMXTagPriority
165 | procedure d(const Msg: string); overload;
166 | procedure d(const Tag, Msg: string); overload; virtual;
167 | procedure e(const Msg: string); overload;
168 | procedure e(const Tag, Msg: string); overload; virtual;
169 | procedure i(const Msg: string); overload;
170 | procedure i(const Tag, Msg: string); overload; virtual;
171 | procedure v(const Msg: string); overload;
172 | procedure v(const Tag, Msg: string); overload; virtual;
173 |
174 | procedure ChangeTag(const ANewTag: string);
175 | function GetTag: string;
176 | constructor Create(const ATag: string='DELPHIFMX');
177 | destructor Destroy; override;
178 | procedure Log(const AFormat: string; const AParams: array of const);
179 | property Tag: string read GetTag write ChangeTag;
180 | end;
181 |
182 | {$ENDIF}
183 |
184 | procedure ChangeTag(const ATag: string);
185 | function DefaultLoggerInstalled: Boolean;
186 | procedure InstalLReplacementLogger(const ATag: string='DELPHIFMX');
187 | function ReplacementLoggerInstalled: Boolean;
188 | var
189 | GReplacementLogger: TFixedAndroidLoggerService;
190 |
191 | implementation
192 | {$IF DEFINED(ANDROID)}
193 | uses
194 | System.SysUtils, Androidapi.Helpers;
195 |
196 | const
197 | AndroidLogLib = '/usr/lib/liblog.so';
198 |
199 | function __android_log_write(Priority: android_LogPriority; const Tag, Text: MarshaledAString): Integer; cdecl;
200 | external AndroidLogLib name '__android_log_write';
201 |
202 | var
203 | IReplacementLogger: IFMXLoggingService;
204 |
205 | //class procedure Log.d(const Msg: string);
206 | //begin
207 | // if LogPriority <> nil then
208 | // LogPriority.d(Msg);
209 | //end;
210 | //
211 | //class procedure Log.d(const Tag, Msg: string);
212 | //begin
213 | // if LogPriority <> nil then
214 | // LogPriority.d(Tag, Msg);
215 | //end;
216 | //
217 | //class procedure Log.e(const Msg: string);
218 | //begin
219 | // if LogPriority <> nil then
220 | // LogPriority.e('', Msg);
221 | //end;
222 | //
223 | //class procedure Log.e(const Tag, Msg: string);
224 | //begin
225 | // if LogPriority <> nil then
226 | // LogPriority.e(Tag, Msg);
227 | //end;
228 | //
229 | //class procedure Log.i(const Msg: string);
230 | //begin
231 | // if LogPriority <> nil then
232 | // LogPriority.i(Msg);
233 | //end;
234 | //
235 | //class procedure Log.i(const Tag, Msg: string);
236 | //begin
237 | // if LogPriority <> nil then
238 | // LogPriority.i(Tag, Msg);
239 | //end;
240 | //
241 | //class procedure Log.v(const Msg: string);
242 | //begin
243 | // if LogPriority <> nil then
244 | // LogPriority.v(Msg);
245 | //end;
246 | //
247 | //class procedure Log.v(const Tag, Msg: string);
248 | //begin
249 | // if LogPriority <> nil then
250 | // LogPriority.v(Tag, Msg);
251 | //end;
252 |
253 | {$ELSE}
254 | uses
255 | {$IF DEFINED(MSWINDOWS)}
256 | Winapi.Windows,
257 | {$ENDIF}
258 | System.SysUtils;
259 |
260 | var
261 | IReplacementLogger: IFMXLoggingService;
262 | {$ENDIF}
263 |
264 | procedure ChangeTag(const ATag: string);
265 | var
266 | LLogger: IFMXLoggingService;
267 | LFMXChangeTag: IFMXChangeTag;
268 | begin
269 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogger) and
270 | Supports(LLogger, IFMXChangeTag, LFMXChangeTag) then
271 | LFMXChangeTag.ChangeTag(ATag);
272 | end;
273 |
274 | procedure InstallReplacementLogger(const ATag: string='DELPHIFMX');
275 | begin
276 | if (GReplacementLogger <> nil) and (GReplacementLogger.Tag <> ATag) then
277 | begin
278 | if ATag <> '' then
279 | GReplacementLogger.ChangeTag(ATag);
280 | Exit;
281 | end;
282 | if (GReplacementLogger = nil) then
283 | GReplacementLogger := TFixedAndroidLoggerService.Create(ATag);
284 | end;
285 |
286 | function ReplacementLoggerInstalled: Boolean;
287 | begin
288 | Result := IReplacementLogger <> nil;
289 | end;
290 |
291 | function DefaultLoggerInstalled: Boolean;
292 | var
293 | LLogger: IInterface;
294 | begin
295 | Result := False;
296 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogger) then
297 | Result := LLogger <> nil;
298 | end;
299 |
300 | class function Log.GetLogger: IInterface;
301 | begin
302 | if FLogger = nil then
303 | TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, FLogger);
304 | Result := FLogger;
305 | end;
306 |
307 | class function Log.GetLogPriority: IFMXTagPriority;
308 | var
309 | LLogger: IInterface;
310 | begin
311 | LLogger := Logger;
312 | if (LLogger <> nil) and (FLogPriority = nil) then
313 | Supports(LLogger, IFMXTagPriority, FLogPriority);
314 | Result := FLogPriority;
315 | end;
316 |
317 | class procedure Log.d(const Msg: string);
318 | begin
319 | d('', Msg);
320 | end;
321 |
322 | class procedure Log.d(const Tag, Msg: string);
323 | begin
324 | if LogPriority <> nil then
325 | LogPriority.d(Tag, Msg);
326 | end;
327 |
328 | class procedure Log.e(const Msg: string);
329 | begin
330 | e('', Msg);
331 | end;
332 |
333 | class procedure Log.e(const Tag, Msg: string);
334 | begin
335 | if LogPriority <> nil then
336 | LogPriority.e(Tag, Msg);
337 | end;
338 |
339 | class procedure Log.i(const Msg: string);
340 | begin
341 | i('', Msg);
342 | end;
343 |
344 | class procedure Log.i(const Tag, Msg: string);
345 | begin
346 | if LogPriority <> nil then
347 | LogPriority.i(Tag, Msg);
348 | end;
349 |
350 | class procedure Log.v(const Msg: string);
351 | begin
352 | v('', Msg);
353 | end;
354 |
355 | class procedure Log.v(const Tag, Msg: string);
356 | begin
357 | if LogPriority <> nil then
358 | LogPriority.v(Tag, Msg);
359 | end;
360 |
361 | { TFixedAndroidLoggerService }
362 | procedure TFixedAndroidLoggerService.ChangeTag(const ANewTag: string);
363 | begin
364 | FTag := ANewTag;
365 | end;
366 |
367 | function TFixedAndroidLoggerService.GetTag: string;
368 | begin
369 | Result := FTag;
370 | end;
371 |
372 | procedure TFixedAndroidLoggerService.Clear;
373 | begin
374 | TPlatformServices.Current.RemovePlatformService(IFMXChangeTag);
375 | TPlatformServices.Current.RemovePlatformService(IFMXLoggingService);
376 | FLogger := nil;
377 | IReplacementLogger := nil;
378 | end;
379 |
380 | constructor TFixedAndroidLoggerService.Create(const ATag: string);
381 | begin
382 | inherited Create;
383 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, FLogger) then
384 | begin
385 | TPlatformServices.Current.RemovePlatformService(IFMXLoggingService);
386 | end;
387 | FTag := ATag;
388 | IReplacementLogger := Self;
389 | TPlatformServices.Current.AddPlatformService(IFMXLoggingService, IReplacementLogger);
390 | TPlatformServices.Current.AddPlatformService(IFMXChangeTag, IReplacementLogger);
391 | end;
392 |
393 | destructor TFixedAndroidLoggerService.Destroy;
394 | begin
395 | Clear;
396 | inherited;
397 | end;
398 |
399 | {$IF DEFINED(ANDROID)}
400 | procedure TFixedAndroidLoggerService.LogPriority(APriority: android_LogPriority;
401 | const ATag, AMsg: string);
402 | var
403 | LTag, LMsg: MarshaledAString;
404 | M: TMarshaller;
405 | begin
406 | if ATag <> '' then
407 | LTag := M.AsUtf8(ATag).ToPointer else
408 | LTag := M.AsUtf8(FTag).ToPointer;
409 | LMsg := M.AsUtf8(AMsg).ToPointer;
410 | __android_log_write(APriority, LTag, LMsg);
411 | end;
412 |
413 | procedure TFixedAndroidLoggerService.d(const Msg: string);
414 | begin
415 | d('', Msg);
416 | end;
417 |
418 | procedure TFixedAndroidLoggerService.d(const Tag, Msg: string);
419 | begin
420 | LogPriority(android_LogPriority.ANDROID_LOG_DEBUG, Tag, Msg);
421 | end;
422 |
423 | procedure TFixedAndroidLoggerService.e(const Msg: string);
424 | begin
425 | e('', Msg);
426 | end;
427 |
428 | procedure TFixedAndroidLoggerService.e(const Tag, Msg: string);
429 | begin
430 | LogPriority(android_LogPriority.ANDROID_LOG_ERROR, Tag, Msg);
431 | end;
432 |
433 | procedure TFixedAndroidLoggerService.i(const Msg: string);
434 | begin
435 | i('', Msg);
436 | end;
437 |
438 | procedure TFixedAndroidLoggerService.i(const Tag, Msg: string);
439 | begin
440 | LogPriority(android_LogPriority.ANDROID_LOG_INFO, Tag, Msg);
441 | end;
442 |
443 | procedure TFixedAndroidLoggerService.v(const Msg: string);
444 | begin
445 | v('', Msg);
446 | end;
447 |
448 | procedure TFixedAndroidLoggerService.v(const Tag, Msg: string);
449 | begin
450 | LogPriority(android_LogPriority.ANDROID_LOG_VERBOSE, Tag, Msg);
451 | end;
452 | {$ELSE}
453 | class procedure TFixedAndroidLoggerService.LogPriority(APriority: android_LogPriority;
454 | const ATag, AMsg: string);
455 | {$IF DEFINED(MSWINDOWS)}
456 | var
457 | LMsg: PChar;
458 | {$ENDIF}
459 | begin
460 | {$IF DEFINED(MSWINDOWS)}
461 | LMsg := PChar(Format('Tag: %s Msg: %s', [ATag, AMsg]));
462 | OutputDebugString(LMsg);
463 | {$ENDIF}
464 | // do nothing on other systems
465 | end;
466 |
467 | procedure TFixedAndroidLoggerService.d(const Msg: string);
468 | begin
469 | d('', Msg);
470 | end;
471 |
472 | procedure TFixedAndroidLoggerService.d(const Tag, Msg: string);
473 | begin
474 | LogPriority(android_LogPriority.ANDROID_LOG_DEBUG, Tag, Msg);
475 | end;
476 |
477 | procedure TFixedAndroidLoggerService.e(const Msg: string);
478 | begin
479 | e('', Msg);
480 | end;
481 |
482 | procedure TFixedAndroidLoggerService.e(const Tag, Msg: string);
483 | begin
484 | LogPriority(android_LogPriority.ANDROID_LOG_ERROR, Tag, Msg);
485 | end;
486 |
487 | procedure TFixedAndroidLoggerService.i(const Msg: string);
488 | begin
489 | i('', Msg);
490 | end;
491 |
492 | procedure TFixedAndroidLoggerService.i(const Tag, Msg: string);
493 | begin
494 | LogPriority(android_LogPriority.ANDROID_LOG_INFO, Tag, Msg);
495 | end;
496 |
497 | procedure TFixedAndroidLoggerService.v(const Msg: string);
498 | begin
499 | v('', Msg);
500 | end;
501 |
502 | procedure TFixedAndroidLoggerService.v(const Tag, Msg: string);
503 | begin
504 | LogPriority(android_LogPriority.ANDROID_LOG_VERBOSE, Tag, Msg);
505 | end;
506 | {$ENDIF}
507 |
508 | procedure TFixedAndroidLoggerService.Log(const AFormat: string;
509 | const AParams: array of const);
510 | {$IF DEFINED(ANDROID)}
511 | var
512 | Msg: string;
513 | M: TMarshaller;
514 | LTag, LMsg: MarshaledAString;
515 | {$ENDIF}
516 | begin
517 | {$IF DEFINED(ANDROID)}
518 | if Length(AParams) = 0 then
519 | Msg := AFormat
520 | else
521 | Msg := Format(AFormat, AParams);
522 |
523 | LTag := M.AsUtf8(FTag).ToPointer;
524 | LMsg := M.AsUtf8(Msg).ToPointer;
525 | __android_log_write(android_LogPriority.ANDROID_LOG_INFO, LTag, LMsg);
526 | {$ELSE}
527 | if Assigned(FLogger) then
528 | begin
529 | FLogger.Log(AFormat, AParams);
530 | end;
531 | {$ENDIF}
532 | end;
533 |
534 | initialization
535 | InstallReplacementLogger;
536 | finalization
537 | if GReplacementLogger <> nil then
538 | begin
539 | GReplacementLogger.Clear;
540 | GReplacementLogger.DisposeOf;
541 | end;
542 | end.
543 |
--------------------------------------------------------------------------------
/FixAndroidLogger.deployproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 12
5 |
6 |
7 | 29271FDH300BL0
8 | 29271FDH300BL0
9 |
10 |
11 |
12 |
13 |
14 |
15 | FixAndroidLogger\res\drawable-hdpi\
16 | ic_launcher.png
17 | Android_LauncherIcon72
18 | 1
19 |
20 |
21 | True
22 |
23 |
24 | FixAndroidLogger\library\lib\arm64-v8a\
25 | libFixAndroidLogger.so
26 | ProjectOutput
27 | 1
28 |
29 |
30 | True
31 | True
32 |
33 |
34 | FixAndroidLogger\classes\
35 | FixAndroidLogger.classes
36 | AndroidClasses
37 | 64
38 |
39 |
40 | True
41 |
42 |
43 | FixAndroidLogger\
44 | AndroidManifest.xml
45 | ProjectAndroidManifest
46 | 1
47 |
48 |
49 | True
50 |
51 |
52 | FixAndroidLogger\res\drawable-xxhdpi\
53 | ic_launcher.png
54 | Android_LauncherIcon144
55 | 1
56 |
57 |
58 | True
59 |
60 |
61 | FixAndroidLogger\res\drawable-xxxhdpi\
62 | ic_launcher.png
63 | Android_LauncherIcon192
64 | 1
65 |
66 |
67 | True
68 |
69 |
70 | FixAndroidLogger\res\drawable-mdpi\
71 | ic_launcher.png
72 | Android_LauncherIcon48
73 | 1
74 |
75 |
76 | True
77 |
78 |
79 | FixAndroidLogger\res\drawable-xhdpi\
80 | ic_notification.png
81 | Android_NotificationIcon48
82 | 1
83 |
84 |
85 | True
86 |
87 |
88 | FixAndroidLogger\res\drawable-large\
89 | splash_image.png
90 | Android_SplashImage640
91 | 1
92 |
93 |
94 | True
95 |
96 |
97 | FixAndroidLogger\library\lib\armeabi\
98 | libFixAndroidLogger.so
99 | AndroidLibnativeArmeabiFile
100 | 1
101 |
102 |
103 | True
104 |
105 |
106 | FixAndroidLogger\res\values\
107 | colors.xml
108 | Android_Colors
109 | 1
110 |
111 |
112 | True
113 |
114 |
115 | FixAndroidLogger\res\drawable-hdpi\
116 | ic_notification.png
117 | Android_NotificationIcon36
118 | 1
119 |
120 |
121 | True
122 |
123 |
124 | FixAndroidLogger\res\drawable-xxxhdpi\
125 | ic_notification.png
126 | Android_NotificationIcon96
127 | 1
128 |
129 |
130 | True
131 |
132 |
133 | FixAndroidLogger\res\drawable\
134 | splash_image_def.xml
135 | AndroidSplashImageDef
136 | 1
137 |
138 |
139 | True
140 |
141 |
142 | FixAndroidLogger\library\lib\mips\
143 | libFixAndroidLogger.so
144 | AndroidLibnativeMipsFile
145 | 1
146 |
147 |
148 | True
149 |
150 |
151 | FixAndroidLogger\res\drawable-xhdpi\
152 | ic_launcher.png
153 | Android_LauncherIcon96
154 | 1
155 |
156 |
157 | True
158 |
159 |
160 | FixAndroidLogger\library\lib\armeabi-v7a\
161 | libFixAndroidLogger.so
162 | AndroidLibnativeArmeabiv7aFile
163 | 1
164 |
165 |
166 | True
167 |
168 |
169 | FixAndroidLogger\res\drawable-mdpi\
170 | ic_notification.png
171 | Android_NotificationIcon24
172 | 1
173 |
174 |
175 | True
176 |
177 |
178 | FixAndroidLogger\res\drawable-ldpi\
179 | ic_launcher.png
180 | Android_LauncherIcon36
181 | 1
182 |
183 |
184 | True
185 |
186 |
187 | FixAndroidLogger\res\drawable-xlarge\
188 | splash_image.png
189 | Android_SplashImage960
190 | 1
191 |
192 |
193 | True
194 |
195 |
196 | FixAndroidLogger\res\drawable-small\
197 | splash_image.png
198 | Android_SplashImage426
199 | 1
200 |
201 |
202 | True
203 |
204 |
205 | FixAndroidLogger\res\values\
206 | styles.xml
207 | AndroidSplashStyles
208 | 1
209 |
210 |
211 | True
212 |
213 |
214 | FixAndroidLogger\res\values\
215 | strings.xml
216 | Android_Strings
217 | 1
218 |
219 |
220 | True
221 |
222 |
223 | FixAndroidLogger\res\values-v21\
224 | styles.xml
225 | AndroidSplashStylesV21
226 | 1
227 |
228 |
229 | True
230 |
231 |
232 | FixAndroidLogger\res\drawable-xxhdpi\
233 | ic_notification.png
234 | Android_NotificationIcon72
235 | 1
236 |
237 |
238 | True
239 |
240 |
241 | FixAndroidLogger\res\drawable-normal\
242 | splash_image.png
243 | Android_SplashImage470
244 | 1
245 |
246 |
247 | True
248 |
249 |
250 |
251 |
252 | FixAndroidLogger\res\drawable-large\
253 | splash_image.png
254 | Android_SplashImage640
255 | 1
256 |
257 |
258 | True
259 |
260 |
261 | FixAndroidLogger\res\values\
262 | strings.xml
263 | Android_Strings
264 | 1
265 |
266 |
267 | True
268 |
269 |
270 | FixAndroidLogger\res\values\
271 | colors.xml
272 | Android_Colors
273 | 1
274 |
275 |
276 | True
277 |
278 |
279 | FixAndroidLogger\res\drawable\
280 | splash_image_def.xml
281 | AndroidSplashImageDef
282 | 1
283 |
284 |
285 | True
286 |
287 |
288 | FixAndroidLogger\res\drawable-hdpi\
289 | ic_launcher.png
290 | Android_LauncherIcon72
291 | 1
292 |
293 |
294 | True
295 |
296 |
297 | FixAndroidLogger\res\drawable-normal\
298 | splash_image.png
299 | Android_SplashImage470
300 | 1
301 |
302 |
303 | True
304 |
305 |
306 | FixAndroidLogger\res\drawable-xxhdpi\
307 | ic_notification.png
308 | Android_NotificationIcon72
309 | 1
310 |
311 |
312 | True
313 |
314 |
315 | FixAndroidLogger\res\drawable-xxhdpi\
316 | ic_launcher.png
317 | Android_LauncherIcon144
318 | 1
319 |
320 |
321 | True
322 |
323 |
324 | FixAndroidLogger\res\drawable-xxxhdpi\
325 | ic_launcher.png
326 | Android_LauncherIcon192
327 | 1
328 |
329 |
330 | True
331 |
332 |
333 | FixAndroidLogger\res\drawable-mdpi\
334 | ic_launcher.png
335 | Android_LauncherIcon48
336 | 1
337 |
338 |
339 | True
340 |
341 |
342 | FixAndroidLogger\library\lib\armeabi-v7a\
343 | libFixAndroidLogger.so
344 | ProjectOutput
345 | 1
346 |
347 |
348 | True
349 | True
350 |
351 |
352 | FixAndroidLogger\res\drawable-xhdpi\
353 | ic_launcher.png
354 | Android_LauncherIcon96
355 | 1
356 |
357 |
358 | True
359 |
360 |
361 | FixAndroidLogger\res\drawable-xlarge\
362 | splash_image.png
363 | Android_SplashImage960
364 | 1
365 |
366 |
367 | True
368 |
369 |
370 | FixAndroidLogger\
371 | AndroidManifest.xml
372 | ProjectAndroidManifest
373 | 1
374 |
375 |
376 | True
377 |
378 |
379 | FixAndroidLogger\classes\
380 | FixAndroidLogger.classes
381 | AndroidClasses
382 | 64
383 |
384 |
385 | True
386 |
387 |
388 | FixAndroidLogger\res\values\
389 | styles.xml
390 | AndroidSplashStyles
391 | 1
392 |
393 |
394 | True
395 |
396 |
397 | FixAndroidLogger\res\drawable-xhdpi\
398 | ic_notification.png
399 | Android_NotificationIcon48
400 | 1
401 |
402 |
403 | True
404 |
405 |
406 | FixAndroidLogger\res\values-v21\
407 | styles.xml
408 | AndroidSplashStylesV21
409 | 1
410 |
411 |
412 | True
413 |
414 |
415 | FixAndroidLogger\library\lib\armeabi\
416 | libFixAndroidLogger.so
417 | AndroidLibnativeArmeabiFile
418 | 1
419 |
420 |
421 | True
422 |
423 |
424 | FixAndroidLogger\res\drawable-mdpi\
425 | ic_notification.png
426 | Android_NotificationIcon24
427 | 1
428 |
429 |
430 | True
431 |
432 |
433 | FixAndroidLogger\res\drawable-small\
434 | splash_image.png
435 | Android_SplashImage426
436 | 1
437 |
438 |
439 | True
440 |
441 |
442 | FixAndroidLogger\res\drawable-ldpi\
443 | ic_launcher.png
444 | Android_LauncherIcon36
445 | 1
446 |
447 |
448 | True
449 |
450 |
451 | FixAndroidLogger\library\lib\mips\
452 | libFixAndroidLogger.so
453 | AndroidLibnativeMipsFile
454 | 1
455 |
456 |
457 | True
458 |
459 |
460 | FixAndroidLogger\res\drawable-hdpi\
461 | ic_notification.png
462 | Android_NotificationIcon36
463 | 1
464 |
465 |
466 | True
467 |
468 |
469 | FixAndroidLogger\res\drawable-xxxhdpi\
470 | ic_notification.png
471 | Android_NotificationIcon96
472 | 1
473 |
474 |
475 | True
476 |
477 |
478 |
479 |
--------------------------------------------------------------------------------
/FixAndroidLogger.dpr:
--------------------------------------------------------------------------------
1 | program FixAndroidLogger;
2 |
3 | uses
4 | System.StartUpCopy,
5 | FMX.Forms,
6 | FixAndroudLoggerDemoImpl in 'FixAndroudLoggerDemoImpl.pas' {frmLogDemo},
7 | FMX.Platform.Logger.Android.Fix in 'FMX.Platform.Logger.Android.Fix.pas';
8 |
9 | {$R *.res}
10 |
11 | begin
12 | Application.Initialize;
13 | Application.CreateForm(TfrmLogDemo, frmLogDemo);
14 | Application.Run;
15 | end.
16 |
--------------------------------------------------------------------------------
/FixAndroidLogger.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {8B389755-ED13-4E31-A4C7-F78683399EA2}
4 | 19.5
5 | FMX
6 | FixAndroidLogger.dpr
7 | True
8 | Debug
9 | Android64
10 | 32784
11 | Application
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Base
29 | true
30 |
31 |
32 | true
33 | Cfg_1
34 | true
35 | true
36 |
37 |
38 | true
39 | Base
40 | true
41 |
42 |
43 | .\$(Platform)\$(Config)
44 | .\$(Platform)\$(Config)
45 | false
46 | false
47 | false
48 | false
49 | false
50 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
51 | true
52 | true
53 | true
54 | true
55 | true
56 | true
57 | true
58 | true
59 | $(BDS)\bin\delphi_PROJECTICON.ico
60 | $(BDS)\bin\delphi_PROJECTICNS.icns
61 | FixAndroidLogger
62 | false
63 |
64 |
65 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage)
66 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
67 | Debug
68 | true
69 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
70 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
71 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
72 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
73 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
74 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
75 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
76 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
77 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
78 | activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
79 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
80 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
81 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
82 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
83 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
84 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
85 |
86 |
87 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=
88 | Debug
89 | true
90 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;tethering;DataSnapFireDAC;bindcompfmx;fmx;FireDACIBDriver;FireDACDBXDriver;dbexpress;IndyCore;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;FireDACDSDriver;rtl;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;$(DCC_UsePackage);$(DCC_UsePackage)
91 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
92 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
93 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
94 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
95 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
96 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
97 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
98 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
99 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
100 | activity-1.1.0.dex.jar;annotation-1.2.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;biometric-1.1.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.1.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.1.0.dex.jar;core-runtime-2.1.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.2.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.2.0.dex.jar;lifecycle-runtime-2.2.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.2.0.dex.jar;lifecycle-viewmodel-savedstate-2.2.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;savedstate-1.0.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar
101 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
102 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
103 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
104 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
106 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
107 |
108 |
109 | DEBUG;$(DCC_Define)
110 | true
111 | false
112 | true
113 | true
114 | true
115 |
116 |
117 | -cleaninstall
118 |
119 |
120 | false
121 | RELEASE;$(DCC_Define)
122 | 0
123 | 0
124 |
125 |
126 |
127 | MainSource
128 |
129 |
130 |
131 | fmx
132 |
133 |
134 |
135 | Base
136 |
137 |
138 | Cfg_1
139 | Base
140 |
141 |
142 | Cfg_2
143 | Base
144 |
145 |
146 |
147 | Delphi.Personality.12
148 | Application
149 |
150 |
151 |
152 | FixAndroidLogger.dpr
153 |
154 |
155 |
156 |
157 |
158 | ic_launcher.png
159 | true
160 |
161 |
162 |
163 |
164 | ic_launcher.png
165 | true
166 |
167 |
168 |
169 |
170 | ic_launcher.png
171 | true
172 |
173 |
174 |
175 |
176 | ic_launcher.png
177 | true
178 |
179 |
180 |
181 |
182 | ic_launcher.png
183 | true
184 |
185 |
186 |
187 |
188 | ic_launcher.png
189 | true
190 |
191 |
192 |
193 |
194 | ic_launcher.png
195 | true
196 |
197 |
198 |
199 |
200 | ic_launcher.png
201 | true
202 |
203 |
204 |
205 |
206 | ic_launcher.png
207 | true
208 |
209 |
210 |
211 |
212 | ic_launcher.png
213 | true
214 |
215 |
216 |
217 |
218 | ic_launcher.png
219 | true
220 |
221 |
222 |
223 |
224 | ic_launcher.png
225 | true
226 |
227 |
228 |
229 |
230 | ic_notification.png
231 | true
232 |
233 |
234 |
235 |
236 | ic_notification.png
237 | true
238 |
239 |
240 |
241 |
242 | ic_notification.png
243 | true
244 |
245 |
246 |
247 |
248 | ic_notification.png
249 | true
250 |
251 |
252 |
253 |
254 | ic_notification.png
255 | true
256 |
257 |
258 |
259 |
260 | ic_notification.png
261 | true
262 |
263 |
264 |
265 |
266 | ic_notification.png
267 | true
268 |
269 |
270 |
271 |
272 | ic_notification.png
273 | true
274 |
275 |
276 |
277 |
278 | ic_notification.png
279 | true
280 |
281 |
282 |
283 |
284 | ic_notification.png
285 | true
286 |
287 |
288 |
289 |
290 | splash_image.png
291 | true
292 |
293 |
294 |
295 |
296 | splash_image.png
297 | true
298 |
299 |
300 |
301 |
302 | splash_image.png
303 | true
304 |
305 |
306 |
307 |
308 | splash_image.png
309 | true
310 |
311 |
312 |
313 |
314 | splash_image.png
315 | true
316 |
317 |
318 |
319 |
320 | splash_image.png
321 | true
322 |
323 |
324 |
325 |
326 | splash_image.png
327 | true
328 |
329 |
330 |
331 |
332 | splash_image.png
333 | true
334 |
335 |
336 |
337 |
338 | libFixAndroidLogger.so
339 | true
340 |
341 |
342 |
343 |
344 | libFixAndroidLogger.so
345 | true
346 |
347 |
348 |
349 |
350 | libFixAndroidLogger.so
351 | true
352 |
353 |
354 |
355 |
356 | libFixAndroidLogger.so
357 | true
358 |
359 |
360 |
361 |
362 | libFixAndroidLogger.so
363 | true
364 |
365 |
366 |
367 |
368 | true
369 |
370 |
371 |
372 |
373 | 64
374 | true
375 |
376 |
377 |
378 |
379 | true
380 |
381 |
382 |
383 |
384 | libFixAndroidLogger.so
385 | true
386 |
387 |
388 |
389 |
390 | true
391 |
392 |
393 |
394 |
395 | true
396 |
397 |
398 |
399 |
400 | styles.xml
401 | true
402 |
403 |
404 |
405 |
406 | true
407 |
408 |
409 |
410 |
411 | true
412 |
413 |
414 |
415 |
416 | 64
417 | true
418 |
419 |
420 |
421 |
422 | true
423 |
424 |
425 |
426 |
427 | libFixAndroidLogger.so
428 | true
429 |
430 |
431 |
432 |
433 | true
434 |
435 |
436 |
437 |
438 | true
439 |
440 |
441 |
442 |
443 | styles.xml
444 | true
445 |
446 |
447 |
448 |
449 | true
450 |
451 |
452 |
453 |
454 | classes
455 | 64
456 |
457 |
458 | classes
459 | 64
460 |
461 |
462 |
463 |
464 | res\xml
465 | 1
466 |
467 |
468 | res\xml
469 | 1
470 |
471 |
472 |
473 |
474 | library\lib\armeabi-v7a
475 | 1
476 |
477 |
478 |
479 |
480 | library\lib\armeabi
481 | 1
482 |
483 |
484 | library\lib\armeabi
485 | 1
486 |
487 |
488 |
489 |
490 | library\lib\armeabi-v7a
491 | 1
492 |
493 |
494 |
495 |
496 | library\lib\mips
497 | 1
498 |
499 |
500 | library\lib\mips
501 | 1
502 |
503 |
504 |
505 |
506 | library\lib\armeabi-v7a
507 | 1
508 |
509 |
510 | library\lib\arm64-v8a
511 | 1
512 |
513 |
514 |
515 |
516 | library\lib\armeabi-v7a
517 | 1
518 |
519 |
520 |
521 |
522 | res\drawable
523 | 1
524 |
525 |
526 | res\drawable
527 | 1
528 |
529 |
530 |
531 |
532 | res\values
533 | 1
534 |
535 |
536 | res\values
537 | 1
538 |
539 |
540 |
541 |
542 | res\values-v21
543 | 1
544 |
545 |
546 | res\values-v21
547 | 1
548 |
549 |
550 |
551 |
552 | res\values
553 | 1
554 |
555 |
556 | res\values
557 | 1
558 |
559 |
560 |
561 |
562 | res\drawable
563 | 1
564 |
565 |
566 | res\drawable
567 | 1
568 |
569 |
570 |
571 |
572 | res\drawable-xxhdpi
573 | 1
574 |
575 |
576 | res\drawable-xxhdpi
577 | 1
578 |
579 |
580 |
581 |
582 | res\drawable-xxxhdpi
583 | 1
584 |
585 |
586 | res\drawable-xxxhdpi
587 | 1
588 |
589 |
590 |
591 |
592 | res\drawable-ldpi
593 | 1
594 |
595 |
596 | res\drawable-ldpi
597 | 1
598 |
599 |
600 |
601 |
602 | res\drawable-mdpi
603 | 1
604 |
605 |
606 | res\drawable-mdpi
607 | 1
608 |
609 |
610 |
611 |
612 | res\drawable-hdpi
613 | 1
614 |
615 |
616 | res\drawable-hdpi
617 | 1
618 |
619 |
620 |
621 |
622 | res\drawable-xhdpi
623 | 1
624 |
625 |
626 | res\drawable-xhdpi
627 | 1
628 |
629 |
630 |
631 |
632 | res\drawable-mdpi
633 | 1
634 |
635 |
636 | res\drawable-mdpi
637 | 1
638 |
639 |
640 |
641 |
642 | res\drawable-hdpi
643 | 1
644 |
645 |
646 | res\drawable-hdpi
647 | 1
648 |
649 |
650 |
651 |
652 | res\drawable-xhdpi
653 | 1
654 |
655 |
656 | res\drawable-xhdpi
657 | 1
658 |
659 |
660 |
661 |
662 | res\drawable-xxhdpi
663 | 1
664 |
665 |
666 | res\drawable-xxhdpi
667 | 1
668 |
669 |
670 |
671 |
672 | res\drawable-xxxhdpi
673 | 1
674 |
675 |
676 | res\drawable-xxxhdpi
677 | 1
678 |
679 |
680 |
681 |
682 | res\drawable-small
683 | 1
684 |
685 |
686 | res\drawable-small
687 | 1
688 |
689 |
690 |
691 |
692 | res\drawable-normal
693 | 1
694 |
695 |
696 | res\drawable-normal
697 | 1
698 |
699 |
700 |
701 |
702 | res\drawable-large
703 | 1
704 |
705 |
706 | res\drawable-large
707 | 1
708 |
709 |
710 |
711 |
712 | res\drawable-xlarge
713 | 1
714 |
715 |
716 | res\drawable-xlarge
717 | 1
718 |
719 |
720 |
721 |
722 | res\values
723 | 1
724 |
725 |
726 | res\values
727 | 1
728 |
729 |
730 |
731 |
732 | 0
733 |
734 |
735 | 0
736 |
737 |
738 |
739 |
740 | 1
741 |
742 |
743 | 1
744 |
745 |
746 |
747 |
748 | library\lib\armeabi-v7a
749 | 1
750 |
751 |
752 | library\lib\arm64-v8a
753 | 1
754 |
755 |
756 |
757 |
758 | library\lib\armeabi-v7a
759 | 1
760 |
761 |
762 |
763 |
764 |
765 |
766 | True
767 | True
768 | False
769 | False
770 | False
771 |
772 |
773 | 12
774 |
775 |
776 |
777 |
778 |
779 |
--------------------------------------------------------------------------------
/FixAndroidLogger.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/FixAndroidLogger.res
--------------------------------------------------------------------------------
/FixAndroudLoggerDemoImpl.LgXhdpiPh.fmx:
--------------------------------------------------------------------------------
1 | inherited frmLogDemo_LgXhdpiPh: TfrmLogDemo_LgXhdpiPh
2 | ClientHeight = 695
3 | ClientWidth = 450
4 | DesignerMasterStyle = 0
5 | inherited Panel1: TPanel
6 | Size.Width = 450.000000000000000000
7 | inherited btnSendToLog: TButton
8 | Size.Width = 145.000000000000000000
9 | end
10 | inherited Panel4: TPanel
11 | Size.Width = 450.000000000000000000
12 | inherited edLog: TEdit
13 | Size.Width = 450.000000000000000000
14 | Size.Height = 54.000000000000000000
15 | end
16 | inherited Label1: TLabel
17 | Size.Width = 450.000000000000000000
18 | end
19 | end
20 | end
21 | inherited Panel2: TPanel
22 | Size.Width = 450.000000000000000000
23 | inherited edTagName: TEdit
24 | Size.Width = 450.000000000000000000
25 | end
26 | inherited Label2: TLabel
27 | Size.Width = 450.000000000000000000
28 | end
29 | end
30 | inherited Panel3: TPanel
31 | Size.Width = 450.000000000000000000
32 | inherited Panel5: TPanel
33 | Size.Width = 450.000000000000000000
34 | inherited Label3: TLabel
35 | Size.Width = 450.000000000000000000
36 | end
37 | inherited edPriorityTag: TEdit
38 | Size.Width = 450.000000000000000000
39 | end
40 | inherited Panel6: TPanel
41 | Size.Width = 450.000000000000000000
42 | inherited rbDebug: TRadioButton
43 | Position.X = 232.000000000000000000
44 | Position.Y = 34.000000000000000000
45 | end
46 | inherited rbError: TRadioButton
47 | Position.X = 232.000000000000000000
48 | Position.Y = 58.000000000000000000
49 | end
50 | inherited rbVerbose: TRadioButton
51 | Position.X = 128.000000000000000000
52 | Position.Y = 58.000000000000000000
53 | end
54 | inherited rbInfo: TRadioButton
55 | Position.X = 128.000000000000000000
56 | Position.Y = 34.000000000000000000
57 | end
58 | end
59 | end
60 | end
61 | end
62 |
--------------------------------------------------------------------------------
/FixAndroudLoggerDemoImpl.fmx:
--------------------------------------------------------------------------------
1 | object frmLogDemo: TfrmLogDemo
2 | Left = 0
3 | Top = 0
4 | Caption = 'Form4'
5 | ClientHeight = 480
6 | ClientWidth = 640
7 | FormFactor.Width = 320
8 | FormFactor.Height = 480
9 | FormFactor.Devices = [Desktop]
10 | OnCreate = FormCreate
11 | OnDestroy = FormDestroy
12 | DesignerMasterStyle = 3
13 | object Panel1: TPanel
14 | Align = Top
15 | Size.Width = 640.000000000000000000
16 | Size.Height = 153.000000000000000000
17 | Size.PlatformDefault = False
18 | TabOrder = 2
19 | object btnSendToLog: TButton
20 | Position.Y = 85.000000000000000000
21 | Size.Width = 113.000000000000000000
22 | Size.Height = 44.000000000000000000
23 | Size.PlatformDefault = False
24 | TabOrder = 0
25 | Text = 'Send To Log'
26 | OnClick = btnSendToLogClick
27 | end
28 | object Panel4: TPanel
29 | Align = Top
30 | Size.Width = 640.000000000000000000
31 | Size.Height = 77.000000000000000000
32 | Size.PlatformDefault = False
33 | TabOrder = 2
34 | object edLog: TEdit
35 | Touch.InteractiveGestures = [LongTap, DoubleTap]
36 | Align = Client
37 | TabOrder = 1
38 | Text = 'This is a log message'
39 | Size.Width = 640.000000000000000000
40 | Size.Height = 32.000000000000000000
41 | Size.PlatformDefault = False
42 | end
43 | object Label1: TLabel
44 | Align = Top
45 | Size.Width = 640.000000000000000000
46 | Size.Height = 23.000000000000000000
47 | Size.PlatformDefault = False
48 | Text = 'Log message'
49 | TabOrder = 2
50 | end
51 | end
52 | end
53 | object Panel2: TPanel
54 | Align = Top
55 | Position.Y = 153.000000000000000000
56 | Size.Width = 640.000000000000000000
57 | Size.Height = 120.000000000000000000
58 | Size.PlatformDefault = False
59 | TabOrder = 0
60 | object btnChangeTag: TButton
61 | Position.Y = 55.000000000000000000
62 | Size.Width = 113.000000000000000000
63 | Size.Height = 44.000000000000000000
64 | Size.PlatformDefault = False
65 | TabOrder = 1
66 | Text = 'Change Tag'
67 | OnClick = btnChangeTagClick
68 | end
69 | object edTagName: TEdit
70 | Touch.InteractiveGestures = [LongTap, DoubleTap]
71 | Align = Top
72 | TabOrder = 2
73 | Text = 'MyDelphiApp'
74 | Position.Y = 23.000000000000000000
75 | Size.Width = 640.000000000000000000
76 | Size.Height = 32.000000000000000000
77 | Size.PlatformDefault = False
78 | end
79 | object Label2: TLabel
80 | Align = Top
81 | Size.Width = 640.000000000000000000
82 | Size.Height = 23.000000000000000000
83 | Size.PlatformDefault = False
84 | Text = 'Tag Name'
85 | TabOrder = 4
86 | end
87 | end
88 | object Panel3: TPanel
89 | Align = Top
90 | Position.Y = 273.000000000000000000
91 | Size.Width = 640.000000000000000000
92 | Size.Height = 144.000000000000000000
93 | Size.PlatformDefault = False
94 | TabOrder = 1
95 | object Panel5: TPanel
96 | Align = Top
97 | Size.Width = 640.000000000000000000
98 | Size.Height = 49.000000000000000000
99 | Size.PlatformDefault = False
100 | TabOrder = 3
101 | object Label3: TLabel
102 | Align = Top
103 | Size.Width = 640.000000000000000000
104 | Size.Height = 23.000000000000000000
105 | Size.PlatformDefault = False
106 | Text = 'Log message'
107 | TabOrder = 2
108 | end
109 | object edPriorityTag: TEdit
110 | Touch.InteractiveGestures = [LongTap, DoubleTap]
111 | Align = Top
112 | TabOrder = 4
113 | Text = 'This is a log message with priority'
114 | Position.Y = 23.000000000000000000
115 | Size.Width = 640.000000000000000000
116 | Size.Height = 32.000000000000000000
117 | Size.PlatformDefault = False
118 | end
119 | object Panel6: TPanel
120 | Align = Top
121 | Position.Y = 55.000000000000000000
122 | Size.Width = 640.000000000000000000
123 | Size.Height = 120.000000000000000000
124 | Size.PlatformDefault = False
125 | TabOrder = 5
126 | object btnSendToPriorityLog: TButton
127 | Position.Y = 25.000000000000000000
128 | Size.Width = 113.000000000000000000
129 | Size.Height = 44.000000000000000000
130 | Size.PlatformDefault = False
131 | TabOrder = 0
132 | Text = 'Send To Log'
133 | OnClick = btnSendToPriorityLogClick
134 | end
135 | object rbDebug: TRadioButton
136 | GroupName = 'Priority'
137 | Position.X = 274.000000000000000000
138 | Position.Y = 25.000000000000000000
139 | TabOrder = 2
140 | Text = 'Debug'
141 | end
142 | object rbError: TRadioButton
143 | GroupName = 'Priority'
144 | IsChecked = True
145 | Position.X = 274.000000000000000000
146 | Position.Y = 73.000000000000000000
147 | TabOrder = 1
148 | Text = 'Error'
149 | end
150 | object rbVerbose: TRadioButton
151 | GroupName = 'Priority'
152 | Position.X = 146.000000000000000000
153 | Position.Y = 73.000000000000000000
154 | TabOrder = 4
155 | Text = 'Verbose'
156 | end
157 | object rbInfo: TRadioButton
158 | GroupName = 'Priority'
159 | Position.X = 146.000000000000000000
160 | Position.Y = 25.000000000000000000
161 | TabOrder = 5
162 | Text = 'Info'
163 | end
164 | end
165 | end
166 | end
167 | end
168 |
--------------------------------------------------------------------------------
/FixAndroudLoggerDemoImpl.pas:
--------------------------------------------------------------------------------
1 | unit FixAndroudLoggerDemoImpl;
2 |
3 | interface
4 |
5 | uses
6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
8 | FMX.Controls.Presentation, FMX.Edit;
9 |
10 | type
11 | TfrmLogDemo = class(TForm)
12 | edLog: TEdit;
13 | btnSendToLog: TButton;
14 | Panel1: TPanel;
15 | Panel2: TPanel;
16 | btnChangeTag: TButton;
17 | edTagName: TEdit;
18 | Panel3: TPanel;
19 | edPriorityTag: TEdit;
20 | Panel4: TPanel;
21 | Label1: TLabel;
22 | Label2: TLabel;
23 | Label3: TLabel;
24 | Panel5: TPanel;
25 | Panel6: TPanel;
26 | btnSendToPriorityLog: TButton;
27 | rbDebug: TRadioButton;
28 | rbError: TRadioButton;
29 | rbVerbose: TRadioButton;
30 | rbInfo: TRadioButton;
31 | procedure btnSendToLogClick(Sender: TObject);
32 | procedure btnChangeTagClick(Sender: TObject);
33 | procedure btnSendToPriorityLogClick(Sender: TObject);
34 | procedure FormCreate(Sender: TObject);
35 | procedure FormDestroy(Sender: TObject);
36 | private
37 | { Private declarations }
38 | procedure Log(const AMsg: string);
39 | public
40 | { Public declarations }
41 | end;
42 |
43 | var
44 | frmLogDemo: TfrmLogDemo;
45 |
46 | implementation
47 | uses
48 | FMX.Platform, FMX.Platform.Logger.Android.Fix;
49 |
50 | {$R *.fmx}
51 |
52 | procedure TfrmLogDemo.btnChangeTagClick(Sender: TObject);
53 | var
54 | LChangeTagService: IFMXChangeTag;
55 | begin
56 | if TPlatformServices.Current.SupportsPlatformService(IFMXChangeTag,
57 | LChangeTagService) then
58 | begin
59 | LChangeTagService.Tag := edTagName.Text;
60 | end;
61 | end;
62 |
63 | procedure TfrmLogDemo.btnSendToLogClick(Sender: TObject);
64 | var
65 | LLogService: IFMXLoggingService;
66 | begin
67 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService,
68 | LLogService) then
69 | begin
70 | LLogService.Log(edLog.Text, []);
71 | end;
72 | end;
73 |
74 | procedure TfrmLogDemo.btnSendToPriorityLogClick(Sender: TObject);
75 | var
76 | LLogService: IFMXLoggingService;
77 | LLogPriority: IFMXTagPriority;
78 | begin
79 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService,
80 | LLogService) then
81 | begin
82 | LLogPriority := LLogService as IFMXTagPriority;
83 |
84 | // use the default tags established
85 |
86 | if rbDebug.IsChecked then
87 | LLogPriority.d(edPriorityTag.Text) else
88 | if rbError.IsChecked then
89 | LLogPriority.e(edPriorityTag.Text) else
90 | if rbInfo.IsChecked then
91 | LLogPriority.i(edPriorityTag.Text) else
92 | if rbVerbose.IsChecked then
93 | LLogPriority.v(edPriorityTag.Text);
94 | end;
95 | end;
96 |
97 | procedure TfrmLogDemo.FormCreate(Sender: TObject);
98 | begin
99 | Log('Application started.');
100 | end;
101 |
102 | procedure TfrmLogDemo.FormDestroy(Sender: TObject);
103 | begin
104 | Log('Shutting down application.');
105 | end;
106 |
107 | procedure TfrmLogDemo.Log(const AMsg: string);
108 | var
109 | LLogService: IFMXLoggingService;
110 | begin
111 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService,
112 | LLogService) then
113 | begin
114 | LLogService.Log(AMsg, []);
115 | end;
116 | end;
117 |
118 | end.
119 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FixAndroidLogger
2 |
3 | This app shows how using the FMX.Platform.Logger.Android.Fix unit, you can change the tag used by FireMonkey so that you can use adb logcat to properly filter your logs for debugging.
4 |
5 | In order to use it, all you have to do is include the FMX.Platform.Logger.Android.Fix unit in your project file.
6 |
7 | # Quick steps to use it
8 | - Include or add FMX.Platform.Logger.Android.Fix in your project file.
9 | - Include FMX.Platform.Logger.Android.Fix in the uses clause.
10 | - Include the following code in when logging:
11 |
12 | ```Delphi
13 | var LLogService: IFMXLoggingService;
14 | var LLogPriority: IFMXTagPriority;
15 | if TPlatformServices.Current.SupportsPlatformService(IFMXLoggingService, LLogService) and
16 | Supports(LLogService, IFMXTagPriority, LLogPriority) then
17 | begin
18 | LLogPriority.i('TagName', 'LogMessage');
19 | end;
20 | ```
21 |
22 | adb logcat -s TagName:*
23 |
24 | # Demo
25 |
26 | See the code in  for how to use it.
27 |
28 | 
29 | 
30 |
31 | Once you have clicked on the Change Tag button, all your logs will be tagged with that name.
32 |
33 | 
34 |
35 | You can also have priority tags as well, so your tags can have debug, error, info or verbose priority.
36 |
37 | To filter the tags using adb logcat, simply use the command
38 | ```
39 | adb logcat -s MyAppName
40 | ```
41 |
42 | where MyAppName is the tag name you have chosen to use.
43 |
44 | Hope this helps with your debugging.
45 |
46 | Enjoy,
47 | Chee-Wee Chua,
48 | Singapore.
49 |
--------------------------------------------------------------------------------
/images/AndroidLogViewer.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/AndroidLogViewer.gif
--------------------------------------------------------------------------------
/images/ChangeTag2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/ChangeTag2.png
--------------------------------------------------------------------------------
/images/console2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/console2.png
--------------------------------------------------------------------------------
/images/log-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chuacw/FixAndroidLogger/e35d7e30de0fe238d754f150eff3155a45e1b4dc/images/log-1.png
--------------------------------------------------------------------------------