1+ /****************************************************************************
2+ * Copyright 2022-2023, Optimizely, Inc. and contributors *
3+ * *
4+ * Licensed under the Apache License, Version 2.0 (the "License"); *
5+ * you may not use this file except in compliance with the License. *
6+ * You may obtain a copy of the License at *
7+ * *
8+ * https://www.apache.org/licenses/LICENSE-2.0 *
9+ * *
10+ * Unless required by applicable law or agreed to in writing, software *
11+ * distributed under the License is distributed on an "AS IS" BASIS, *
12+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13+ * See the License for the specific language governing permissions and *
14+ * limitations under the License. *
15+ ***************************************************************************/
16+ package com .optimizely .optimizely_flutter_sdk ;
17+
18+ import android .os .Handler ;
19+ import android .os .Looper ;
20+ import io .flutter .plugin .common .MethodChannel ;
21+ import org .slf4j .Logger ;
22+ import org .slf4j .Marker ;
23+ import java .util .HashMap ;
24+ import java .util .Map ;
25+
26+ public class FlutterOptimizelyLogger implements Logger {
27+ static final String LOGGER_CHANNEL = "optimizely_flutter_sdk_logger" ;
28+ private static MethodChannel loggerChannel ;
29+ private final String tag ;
30+
31+ public FlutterOptimizelyLogger (String name ) {
32+ tag = name ;
33+ }
34+
35+ public static void setChannel (MethodChannel channel ) {
36+ loggerChannel = channel ;
37+ }
38+
39+ @ Override
40+ public String getName () {
41+ return "OptimizelyLogger" ;
42+ }
43+
44+ // Trace methods
45+ @ Override
46+ public boolean isTraceEnabled () {
47+ return false ;
48+ }
49+
50+ @ Override
51+ public void trace (String msg ) {
52+ // Not implemented
53+ }
54+
55+ @ Override
56+ public void trace (String format , Object arg ) {
57+ // Not implemented
58+ }
59+
60+ @ Override
61+ public void trace (String format , Object arg1 , Object arg2 ) {
62+ // Not implemented
63+ }
64+
65+ @ Override
66+ public void trace (String format , Object ... arguments ) {
67+ // Not implemented
68+ }
69+
70+ @ Override
71+ public void trace (String msg , Throwable t ) {
72+ // Not implemented
73+ }
74+
75+ @ Override
76+ public boolean isTraceEnabled (Marker marker ) {
77+ return false ;
78+ }
79+
80+ @ Override
81+ public void trace (Marker marker , String msg ) {
82+ // Not implemented
83+ }
84+
85+ @ Override
86+ public void trace (Marker marker , String format , Object arg ) {
87+ // Not implemented
88+ }
89+
90+ @ Override
91+ public void trace (Marker marker , String format , Object arg1 , Object arg2 ) {
92+ // Not implemented
93+ }
94+
95+ @ Override
96+ public void trace (Marker marker , String format , Object ... argArray ) {
97+ // Not implemented
98+ }
99+
100+ @ Override
101+ public void trace (Marker marker , String msg , Throwable t ) {
102+ // Not implemented
103+ }
104+
105+ // Debug methods
106+ @ Override
107+ public boolean isDebugEnabled () {
108+ return true ;
109+ }
110+
111+ @ Override
112+ public void debug (String msg ) {
113+ sendLogToFlutter (4 , msg );
114+ }
115+
116+ @ Override
117+ public void debug (String format , Object arg ) {
118+ debug (formatMessage (format , arg ));
119+ }
120+
121+ @ Override
122+ public void debug (String format , Object arg1 , Object arg2 ) {
123+ debug (formatMessage (format , arg1 , arg2 ));
124+ }
125+
126+ @ Override
127+ public void debug (String format , Object ... arguments ) {
128+ debug (formatMessage (format , arguments ));
129+ }
130+
131+ @ Override
132+ public void debug (String msg , Throwable t ) {
133+ debug (formatThrowable (msg , t ));
134+ }
135+
136+ @ Override
137+ public boolean isDebugEnabled (Marker marker ) {
138+ return true ;
139+ }
140+
141+ @ Override
142+ public void debug (Marker marker , String msg ) {
143+ debug (msg );
144+ }
145+
146+ @ Override
147+ public void debug (Marker marker , String format , Object arg ) {
148+ debug (format , arg );
149+ }
150+
151+ @ Override
152+ public void debug (Marker marker , String format , Object arg1 , Object arg2 ) {
153+ debug (format , arg1 , arg2 );
154+ }
155+
156+ @ Override
157+ public void debug (Marker marker , String format , Object ... arguments ) {
158+ debug (format , arguments );
159+ }
160+
161+ @ Override
162+ public void debug (Marker marker , String msg , Throwable t ) {
163+ debug (msg , t );
164+ }
165+
166+ // Info methods
167+ @ Override
168+ public boolean isInfoEnabled () {
169+ return true ;
170+ }
171+
172+ @ Override
173+ public void info (String msg ) {
174+ sendLogToFlutter (3 , msg );
175+ }
176+
177+ @ Override
178+ public void info (String format , Object arg ) {
179+ info (formatMessage (format , arg ));
180+ }
181+
182+ @ Override
183+ public void info (String format , Object arg1 , Object arg2 ) {
184+ info (formatMessage (format , arg1 , arg2 ));
185+ }
186+
187+ @ Override
188+ public void info (String format , Object ... arguments ) {
189+ info (formatMessage (format , arguments ));
190+ }
191+
192+ @ Override
193+ public void info (String msg , Throwable t ) {
194+ info (formatThrowable (msg , t ));
195+ }
196+
197+ @ Override
198+ public boolean isInfoEnabled (Marker marker ) {
199+ return true ;
200+ }
201+
202+ @ Override
203+ public void info (Marker marker , String msg ) {
204+ info (msg );
205+ }
206+
207+ @ Override
208+ public void info (Marker marker , String format , Object arg ) {
209+ info (format , arg );
210+ }
211+
212+ @ Override
213+ public void info (Marker marker , String format , Object arg1 , Object arg2 ) {
214+ info (format , arg1 , arg2 );
215+ }
216+
217+ @ Override
218+ public void info (Marker marker , String format , Object ... arguments ) {
219+ info (format , arguments );
220+ }
221+
222+ @ Override
223+ public void info (Marker marker , String msg , Throwable t ) {
224+ info (msg , t );
225+ }
226+
227+ // Warn methods
228+ @ Override
229+ public boolean isWarnEnabled () {
230+ return true ;
231+ }
232+
233+ @ Override
234+ public void warn (String msg ) {
235+ sendLogToFlutter (2 , msg );
236+ }
237+
238+ @ Override
239+ public void warn (String format , Object arg ) {
240+ warn (formatMessage (format , arg ));
241+ }
242+
243+ @ Override
244+ public void warn (String format , Object ... arguments ) {
245+ warn (formatMessage (format , arguments ));
246+ }
247+
248+ @ Override
249+ public void warn (String format , Object arg1 , Object arg2 ) {
250+ warn (formatMessage (format , arg1 , arg2 ));
251+ }
252+
253+ @ Override
254+ public void warn (String msg , Throwable t ) {
255+ warn (formatThrowable (msg , t ));
256+ }
257+
258+ @ Override
259+ public boolean isWarnEnabled (Marker marker ) {
260+ return true ;
261+ }
262+
263+ @ Override
264+ public void warn (Marker marker , String msg ) {
265+ warn (msg );
266+ }
267+
268+ @ Override
269+ public void warn (Marker marker , String format , Object arg ) {
270+ warn (format , arg );
271+ }
272+
273+ @ Override
274+ public void warn (Marker marker , String format , Object arg1 , Object arg2 ) {
275+ warn (format , arg1 , arg2 );
276+ }
277+
278+ @ Override
279+ public void warn (Marker marker , String format , Object ... arguments ) {
280+ warn (format , arguments );
281+ }
282+
283+ @ Override
284+ public void warn (Marker marker , String msg , Throwable t ) {
285+ warn (msg , t );
286+ }
287+
288+ // Error methods
289+ @ Override
290+ public boolean isErrorEnabled () {
291+ return true ;
292+ }
293+
294+ @ Override
295+ public void error (String msg ) {
296+ sendLogToFlutter (1 , msg ); // ERROR level = 1
297+ }
298+
299+ @ Override
300+ public void error (String format , Object arg ) {
301+ error (formatMessage (format , arg ));
302+ }
303+
304+ @ Override
305+ public void error (String format , Object arg1 , Object arg2 ) {
306+ error (formatMessage (format , arg1 , arg2 ));
307+ }
308+
309+ @ Override
310+ public void error (String format , Object ... arguments ) {
311+ error (formatMessage (format , arguments ));
312+ }
313+
314+ @ Override
315+ public void error (String msg , Throwable t ) {
316+ error (formatThrowable (msg , t ));
317+ }
318+
319+ @ Override
320+ public boolean isErrorEnabled (Marker marker ) {
321+ return true ;
322+ }
323+
324+ @ Override
325+ public void error (Marker marker , String msg ) {
326+ error (msg );
327+ }
328+
329+ @ Override
330+ public void error (Marker marker , String format , Object arg ) {
331+ error (format , arg );
332+ }
333+
334+ @ Override
335+ public void error (Marker marker , String format , Object arg1 , Object arg2 ) {
336+ error (format , arg1 , arg2 );
337+ }
338+
339+ @ Override
340+ public void error (Marker marker , String format , Object ... arguments ) {
341+ error (format , arguments );
342+ }
343+
344+ @ Override
345+ public void error (Marker marker , String msg , Throwable t ) {
346+ error (msg , t );
347+ }
348+
349+ // Helper methods
350+ private void sendLogToFlutter (int level , String message ) {
351+ if (loggerChannel == null ) {
352+ return ;
353+ }
354+
355+ // Ensure we're on the main thread when calling Flutter (similar to Swift's DispatchQueue.main.async)
356+ Handler mainHandler = new Handler (Looper .getMainLooper ());
357+ mainHandler .post (() -> {
358+ Map <String , Object > arguments = new HashMap <>();
359+ arguments .put ("level" , level );
360+ arguments .put ("message" , message );
361+ loggerChannel .invokeMethod ("log" , arguments );
362+ });
363+ }
364+
365+ private String formatMessage (String format , Object ... args ) {
366+ try {
367+ // SLF4J uses {} placeholders, replace with %s for String.format
368+ String formatString = format .replace ("{}" , "%s" );
369+ return String .format (formatString , args );
370+ } catch (Exception e ) {
371+ return format ;
372+ }
373+ }
374+
375+ private String formatThrowable (String msg , Throwable t ) {
376+ return msg + " - " + t .getMessage ();
377+ }
378+ }
0 commit comments